В общем, я должен препятствовать этому вопросу. Это очень сомнительно, и я бы на самом деле не рекомендовал сокращать псевдонимы такого типа для типов и особенно не для полного вызова метода ... достаточно плохо, когда это делается многими переменными и полями.
Всегда используйте правильные имена переменных и полей, чтобы, читая код, вы уже знали, с чем имеете дело!
как насчет сохранения его в переменной (или поле класса) в начале или всякий раз, когда это необходимо (но как можно раньше)
// 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
, если вы хотите избежать конфликтов имен с существующим типом