单例 MonoBehaviour 类中的 SerializeField

问题描述 投票:0回答:1

[机器翻译英文]

问题

SingletonMono
会在游戏开始后创建其游戏对象,但我的单例类
StageManager
需要使用
[SerializeField]
获取相机。

我怎样才能做到这一点?

或者是否有更好的方法在单例 MonoBehaviour 中获取相机对象?
我听说要避免手动将单例 Monobehaviour 脚本安装到游戏对象。

我的 SingletonMono 基类

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;
    }
}

我的 StageManager 课程

    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));
        }
    }

我怎样才能做到这一点?

c# unity-game-engine
1个回答
0
投票

[SerializeField] 用于在 Unity 编辑器中公开私有字段,允许它在 Inspector 窗口中序列化和可编辑,即使它不是公共的。因此您需要手动从 Inspector 分配摄像机。我建议你这样做:

private Camera _mainCamera;

private void Awake()
{
    _mainCamera = Camera.main;
}
© www.soinside.com 2019 - 2024. All rights reserved.