定义对象时候直接分配空间和在Awake函数中分配空间有什么区别?

如题,本人在实际操作中,发现GameManager类中直接分配空间和在Awake函数中分配空间,最后在UILayoout类中Debug的时候结果不一样,不知道是什么原因。
最后也是Awake分配结果输出正常。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour {

    private static GameManager _instance;

    public static GameManager Instance
    {
        get
        {
            if (_instance == null)
            {
                GameObject gm = new GameObject("GameManager");
                gm.AddComponent<GameManager>();
            }

            return _instance;
        }
    }

    //public PlayerSetting playerSetting = new PlayerSetting();
    //这里直接分配空间
    public PlayerSetting playerSetting;

    void Awake()
    {
        _instance = this;
        DontDestroyOnLoad(this);
         
        playerSetting = new PlayerSetting(); 
        //这里Awake函数中分配空间
    }
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

[Serializable]
public class PlayerSetting
{
    public KeyCode[] defaultButton = new KeyCode[12];

    public KeyCode[] currentButton = new KeyCode[12];

    public int volume;
    public PlayerSetting()
    {
        defaultButton[0] = KeyCode.W;
        defaultButton[1] = KeyCode.A;
        defaultButton[2] = KeyCode.S;
        defaultButton[3] = KeyCode.D;
        defaultButton[4] = KeyCode.Alpha1;
        defaultButton[5] = KeyCode.Alpha2;
        defaultButton[6] = KeyCode.Alpha3;
        defaultButton[7] = KeyCode.Alpha4;
        defaultButton[8] = KeyCode.Space;
        defaultButton[9] = KeyCode.E;
        defaultButton[10] = KeyCode.F;
        defaultButton[11] = KeyCode.Z;
        
        for (int i = 0; i < defaultButton.Length; i++)
        {
            currentButton[i] = defaultButton[i];
        }
        volume = 50;
    }     
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using System.IO;

public class UILayout : MonoBehaviour
{
    // Use this for initialization
    private void Awake()
    {
        
    }

    private void Start()
    {
        Debug.Log(GameManager.Instance.playerSetting.currentButton.Length);
        
        //这里输出不一样
        //直接分配时候这里输出11
        //Awake分配这里是12
    }
阅读 1.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进