Когда я пытаюсь продумать игровую архитектуру в Unity, я сталкиваюсь со следующей проблемой: существует несколько способов построения отношений между компонентами, и я не могу понять, какой из них является наиболее оптимальным.
Например, у нас есть компонент GameplayObject со следующими параметрами
public class GameplayObject : MonoBehaviour
{
// every gameplay object has chanse of appear on board
[SerializeField, Min(0)] int m_ChanseOfAppear = 0;
public int ChanseOfAppear => m_ChanseOfAppear;
//every gameplay object may be destroyed
public virtual void Destroy()
{
}
}
Метод уничтожения может быть выполнен после пользовательского ввода (щелчок или перетаскивание - только несколько типов ввода), или другой объект игрового процесса может выполнить метод уничтожения.
Например, у нас есть следующий компонент TapBehaviour
public class CustomDestroyer: MonoBehaviour, IPointerClickHandler
{
public event System.Action OnTap = delegate { };
IPointerClickHandler.OnPointerClick()
{
OnTap();
}
}
У нас есть конкретный GameplayObject (например, CustomDestroyer), который должен уничтожать объекты конкретным способом. И теперь для нашего компонента ввода нужна зависимость
[RequireComponent(typeof(TapBehaviour), typeof(BoxColiider2D))]
public class CustomDestroyer: GameplayObject
{
TapBehaviour m_TapBehaviour;
TapBehaviour TapBehaviour
{
get
{
if (m_TapBehaviour == null)
m_TapBehaviour = GetComponent<TapBehaviour>();
return m_TapBehaviour;
}
}
public override void Destroy()
{
}
}
Но мы можем сделать это прямо противоположным образом: унаследовать CustomDestroyer от TapBehaviour и использовать GameplayObject-подобный компонент.
Итак, главный вопрос - как вы строите архитектуру своих проектов? Когда вы используете наследование компонента, когда используете только компоненты? Может быть, я теряю несколько более предпочтительных способов?
Чем больше вы мне объясните, тем больше я буду вам благодарен!
И извините за плохой английский, просто учу его.