Я не смог найти ответа на свой вопрос, поэтому я здесь.
Я пытаюсь создать свою первую игру, игру на ферме. Есть много вещей, которые управляются игроком с помощью курсора, например, для динамического изменения режима игры (часть кода скрипта «контроллер вспаханного поля» ниже):
void OnMouseEnter()
{
if (EventSystem.current.IsPointerOverGameObject() || !buildManager.isModeFlexible()) return;
if (IsPlowed)
{
if (PlantGO || !buildManager.PlantItem) return;
buildManager.BuildMode = BuildMode.Plant_Mode;
}
else
{
buildManager.BuildMode = BuildMode.Plow_Mode;
}
}
Или для события clicked:
void OnMouseUp()
{
if (EventSystem.current.IsPointerOverGameObject()) return;
if (buildManager.BuildMode == BuildMode.Dig_Mode) Dig();
else if (buildManager.BuildMode == BuildMode.Plant_Mode) AssignTask(TaskType.PlantTask);
else if (buildManager.BuildMode == BuildMode.Plow_Mode) AssignTask(TaskType.PlowTask);
}
Есть несколько сценариев для управления собираемыми объектами, плантируемыми объектами и т. Д. В настоящее время я не использую интерфейсы (и я не часто их использовал), но я подумал об этом, и этоВопрос, связанный только с интерфейсами.
Стоит ли использовать интерфейсы в этом случае? Как я уже сказал, не существует большого количества сценариев для управления игровыми объектами, по крайней мере до сих пор (например, для сбора будет только растение / дерево / животное), но в основном это события мыши. Но было бы очень удобно, если бы я мог сделать только один скрипт для управления всеми событиями OnMouseDown / Up / ... из других объектов. Также я не знаю, буду ли я делать больше подобных сценариев в будущем. Но есть события мыши, и я клянусь, что невозможно поймать OnMouseDown глобально (выполнение в одном сценарии для каждого объекта). Я знаю, что это можно сделать в методе Update, но я не уверен, что это действительно оптимизированное решение (мой простой тест):
void Update()
{
if (Input.GetMouseButtonUp(0))
{
if (EventSystem.current.IsPointerOverGameObject()) return;
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit))
{
GameObject collider = hit.collider.gameObject;
if (buildManager.BuildMode == BuildMode.Dig_Mode) DigMode(collider);
else if (buildManager.BuildMode == BuildMode.Plant_Mode) PlantMode(collider);
else if (buildManager.BuildMode == BuildMode.Collect_Mode) CollectMode(collider);
else if (buildManager.BuildMode == BuildMode.Plow_Mode) PlowMode(collider);
}
}
}
void DigMode(GameObject go)
{
IDiggable iDiggable = go.GetComponent<IDiggable>();
if (iDiggable == null) return;
iDiggable.Dig();
}
...
И это просто решение для события OnMouseUp. Что если я захочу сделать что-нибудь с событием OnMouseEnter? По моему мнению, в этом случае нет смысла делать это, потому что мне нужно будет что-то проверять каждый кадр.
Поэтому я спрашиваю вас: «Стоит ли форсировать интерфейсы в том случае, когда я хочупроверка событий мыши? Или это только для «создания хорошего кода», но в этом случае это совершенно бессмысленно: «Возможно, для OnMouseEvent существует глобальное событие, о котором я говорил ранее, и я не в курсе. Но это должно просто решить проблему.