[机器翻译英文]
SingletonMono
会在游戏开始后创建其游戏对象,但我的单例类StageManager
需要使用[SerializeField]
获取相机。
我怎样才能做到这一点?
或者是否有更好的方法在单例 MonoBehaviour 中获取相机对象?
我听说要避免手动将单例 Monobehaviour 脚本安装到游戏对象。
public abstract class SingletonMono<T>: MonoBehaviour where T: MonoBehaviour
{
private static T _instance;
protected static bool ApplicationIsQuitting;
protected static bool IsGlobal;
static SingletonMono()
{
ApplicationIsQuitting = false;
IsGlobal = false;
}
public static T Instance
{
get
{
if (ApplicationIsQuitting)
{
Debug.LogWarning($"Application is quitting, you cant operate a singleton mono object: [{typeof(T)}]");
return _instance;
}
_instance = FindObjectOfType<T>();
if (FindObjectsOfType<T>().Length > 1)
{
Debug.LogError($"the singleton type [{typeof(T)}] has more than one instances");
return _instance;
}
if (_instance is not null) return _instance;
var obj = new GameObject(typeof(T).ToString());
_instance = obj.AddComponent<T>();
if(IsGlobal) DontDestroyOnLoad(obj);
return _instance;
}
}
public void OnApplicationQuit()
{
ApplicationIsQuitting = true;
}
}
public class StageManager: SingletonMono<StageManager>
{
[SerializeField] private float spaceOffset;
[SerializeField] private Camera mainCam;
public Vector3 GetWorldPositionByScreenPoint(Vector2 pos)
{
var z = -mainCam.transform.position.z;
return mainCam.ScreenToWorldPoint(new Vector3(pos.x, pos.y, z));
}
}
我怎样才能做到这一点?
[SerializeField] 用于在 Unity 编辑器中公开私有字段,允许它在 Inspector 窗口中序列化和可编辑,即使它不是公共的。因此您需要手动从 Inspector 分配摄像机。我建议你这样做:
private Camera _mainCamera;
private void Awake()
{
_mainCamera = Camera.main;
}