Интерфейсы - стоит ли их форсировать в таком случае? - PullRequest
0 голосов
/ 06 октября 2019

Я не смог найти ответа на свой вопрос, поэтому я здесь.

Я пытаюсь создать свою первую игру, игру на ферме. Есть много вещей, которые управляются игроком с помощью курсора, например, для динамического изменения режима игры (часть кода скрипта «контроллер вспаханного поля» ниже):

    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 существует глобальное событие, о котором я говорил ранее, и я не в курсе. Но это должно просто решить проблему.

1 Ответ

0 голосов
/ 06 октября 2019

Если все эти объекты GameObjects (растения, деревья, животные) нуждаются в одинаковых функциях MouseUp / MouseDown, почему вы просто не наследуете Plant, Tree, Animal класс от скажем GonnaBePlanted класс, который наследуется самим MonoBehaviour.

, таким образом, вы можете просто настроить событие MouseUp / Down в классе GonnaBePlanted и обрабатывать различные свойства, например, Animal в своем собственном классе, но у вас есть доступ квсе свойства MonoBehaviour, поскольку GonnaBePlanted унаследован от него!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...