Сделать длинные имена короче в Unity? - PullRequest
0 голосов
/ 04 ноября 2019

Вместо написания кода, подобного

FindObjectOfType<GameManager>().gameOver()

Я хотел бы напечатать просто

gm.gameOver()

Есть ли способ сделать это в Unity?

Может бытьиспользуя какой-то псевдоним, или какое-то пространство имен или что-то еще. После того, как мой код стал чистым, использование GameManger gm = FindObjectOfType () в каждом файле, использующем GameManager, - это не то, что я ищу.

1 Ответ

5 голосов
/ 04 ноября 2019

В общем, я должен препятствовать этому вопросу. Это очень сомнительно, и я бы на самом деле не рекомендовал сокращать псевдонимы такого типа для типов и особенно не для полного вызова метода ... достаточно плохо, когда это делается многими переменными и полями.

Всегда используйте правильные имена переменных и полей, чтобы, читая код, вы уже знали, с чем имеете дело!


как насчет сохранения его в переменной (или поле класса) в начале или всякий раз, когда это необходимо (но как можно раньше)

// You could also reference it already in the Inspector
// and skip the FindObjectOfType call entirely
[SerializeField] private _GameManager gm; 

private void Awake() 
{ 
    if(!gm) gm = FindObjectOfType<_GameManager>(); 
} 

, а затем позже используйте

gm.gameOver();

, где это необходимо.

В общем, вы должны сделать это только один раз, потому что FindObjectOfTypeочень интенсивный вызов.

Это должно быть сделано, конечно, для каждого класса, желающего использовать экземпляр _GameManager ...

Однако это, в основном, предпочтительный способ.


В качестве альтернативы вы также можете (ab) использовать шаблон Singleton ... это спорный , и многие люди ненавидят его отчасти ... но актуальнов конце концов, FindObjectOfType на стороне дизайна делает то же самое и еще хуже в производительности ...

public class _GameManager : MonoBehaviour
{
    // Backing field where the instance reference will actually be stored
    private static _GameManager instance;

    // A public read-only property for either returning the existing reference
    // finding it in the scene
    // or creating one if not existing at all
    public static _GameManager Instance
    {
        get 
        {
            // if the reference exists already simply return it
            if(instance) return instance;

            // otherwise find it in the scene
            instance = FindObjectOfType<_GameManager>();

            // if found return it now
            if(instance) return instance;

            // otherwise a lazy creation of the object if not existing in scene
            instance = new GameObject("_GameManager").AddComponent<_GameManager>();

            return instance;
        }
    }

    private void Awake()
    {
        instance = this;
    }
}

, так что вы можете по крайней мере уменьшить его до

_GameManager.Instance.gameOver();

единственный псевдоним , который вы можете создать сейчас, будет использовать оператор using в верхней части файла, например,

using gm = _GameManager;

, тогда вы можете использовать

gm.Instance.gameOver();

это, вероятно, не станет намного короче, чем это.

Но, как уже говорилось, это очень сомнительно и не приносит никакой реальной выгоды, оно только ухудшает ваш код для чтения / поддержки! Что если позже у вас также будет GridManager и GroupMaster? Тогда вызов чего-то gm только сбивает с толку;)


Кстати, вы не должны начинать типы с _ .. лучше называть это, например, MyGameManager или использовать другой namespace, если вы хотите избежать конфликтов имен с существующим типом

...