Дизайн абстрактного класса для системы меню в Unity: статические и динамические менюC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Дизайн абстрактного класса для системы меню в Unity: статические и динамические меню

Сообщение Anonymous »

Я разрабатываю систему меню в Unity, и мне нужна помощь в проверке моего подхода, чтобы убедиться, что он соответствует принципам SOLID, в частности принципу замены Лискова.

Система состоит из:
  • Абстрактного класса 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();
}
}
}
Реализация динамического меню[/b]

Динамически заполняет кнопки на основе списка параметров во время выполнения.

Реализация динамического меню

Динамически заполняет кнопки на основе списка параметров во время выполнения.

Реализация динамического меню

Динамически заполняет кнопки на основе списка параметров во время выполнения.

Реализация динамического меню

Динамически заполняет кнопки на основе списка параметров во время выполнения.

Реализация динамического меню

Динамически заполняет кнопки на основе списка параметров во время выполнения.

Реализация динамического меню

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();
}
}
}
Я новичок в Unity и SOLID, поэтому отзывы приветствуются. Спасибо!


Подробнее здесь: https://stackoverflow.com/questions/792 ... amic-menus
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»