Система состоит из:
- Абстрактного класса BaseMenu для общей функциональности.
- Два конкретных типа меню:
StaticMenu: предопределенные кнопки, назначенные в редакторе Unity. - DynamicMenu: кнопки, создаваемые динамически во время выполнения в зависимости от игры. контекст (например, варианты диалога).
Мои вопросы:
- Моя Дизайн BaseMenu правильно поддерживает потребности как StaticMenu, так и DynamicMenu?
- Есть ли в этой настройке какие-либо потенциальные нарушения принципов SOLID?
Это правильный подход или мне следует рассмотреть возможность использования интерфейса или другого шаблона?
BaseMenu как абстрактный класс
Код: Выделить всё
public abstract class BaseMenu
{
public bool IsActive { get; set; }
public RectTransform Panel { get; protected set; }
public List Buttons { get; protected set; }
public int CurrentIndex { get; protected set; }
public virtual void Initialize()
{
CurrentIndex = 0;
Buttons = new List(); // Ensures Buttons is always initialized
SetupButtons(); // Abstract method to allow flexibility
}
public virtual void Show()
{
Panel.gameObject.SetActive(true);
IsActive = true;
RegisterWithMenuManager();
}
public virtual void Hide()
{
Panel.gameObject.SetActive(false);
IsActive = false;
DeregisterWithMenuManager();
}
public virtual void SelectNext()
{
CurrentIndex = (CurrentIndex + 1) % Buttons.Count;
// Add visual selection logic here
}
public virtual void SelectPrevious()
{
CurrentIndex = (CurrentIndex - 1 + Buttons.Count) % Buttons.Count;
// Add visual selection logic here
}
public abstract void HandleInput(); // Subclass defines input logic (e.g., vertical vs horizontal)
protected abstract void SetupButtons(); // Subclass defines how buttons are set up
public void RegisterWithMenuManager()
{
MenuManager.Instance.Register(this); // Add this menu to a stack of active menus
}
public void DeregisterWithMenuManager()
{
MenuManager.Instance.Deregister(this); // Remove this menu from the stack
}
}
< /code>
[b] реализация Staticmenu < /strong>
использует предопределенные кнопки, перетащившие в сериализованное поле в редакторе Unity. < / p>
public class StaticMenu : BaseMenu
{
[SerializeField] private List serializedButtons;
protected override void SetupButtons()
{
Buttons = serializedButtons; // Use predefined buttons
}
public override void HandleInput()
{
if (Input.GetKeyDown(KeyCode.Up))
{
SelectPrevious();
}
else if (Input.GetKeyDown(KeyCode.Down))
{
SelectNext();
}
}
}
Динамически заполняет кнопки на основе списка параметров во время выполнения.
Реализация динамического меню
Динамически заполняет кнопки на основе списка параметров во время выполнения.
Реализация динамического меню
Динамически заполняет кнопки на основе списка параметров во время выполнения.
Реализация динамического меню
Динамически заполняет кнопки на основе списка параметров во время выполнения.
Реализация динамического меню
Динамически заполняет кнопки на основе списка параметров во время выполнения.
Реализация динамического меню
p>
Код: Выделить всё
public class DynamicMenu : BaseMenu
{
private List options;
public DynamicMenu(List options)
{
this.options = options;
}
protected override void SetupButtons()
{
foreach (var option in options)
{
Button newButton = InstantiateButton(option);
Buttons.Add(newButton);
}
}
private Button InstantiateButton(string text)
{
GameObject buttonPrefab = Resources.Load("ButtonPrefab");
Button button = Instantiate(buttonPrefab, Panel).GetComponent();
button.GetComponentInChildren().text = text;
return button;
}
public override void HandleInput()
{
if (Input.GetKeyDown(KeyCode.Up))
{
SelectPrevious();
}
else if (Input.GetKeyDown(KeyCode.Down))
{
SelectNext();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... amic-menus