无法访问成员函数中的类变量

本文关键字:类变量 函数 成员 访问 | 更新日期: 2023-09-27 17:54:05

在Unity c#脚本中,我有一个单独的游戏控制器对象,其中存储了游戏变量,但在成员函数中访问它们时,我得到了奇怪的行为。它输出初始化的值,而不是当前的值。然而,在update函数中,它每帧打印正确的值。我总结了下面的课程。控制器类有一个对自身的静态引用。如果你需要知道更多的细节,你可以问。我是c#和Unity的新手,所以我可能缺乏一些明显的答案。

感谢
public class controller : MonoBehaviour {
    public int[] star = new int[64];
    void Start(){ /* calls another function to set 0 for each star index */ }
    void Update(){  // during gameplay star[0] gets a value of 1
        print(star[0]);  // prints correct value which is 1
    }
    public void checkValue(){
        print(star[0]); // prints 0 incorrectly which should be 1     
    }

}

无法访问成员函数中的类变量

我设置了一个小示例。我创建了一个按钮和一个空的游戏对象GameController。我将这段代码添加到GameController:

using UnityEngine;
using System.Collections;
public class GameController : MonoBehaviour {
    public static GameController instance;
    [System.NonSerialized] public int[] star = new int[64];
    private void Awake()
    {
        if(instance == null)
            instance = this;
        else if(instance != this)
            Destroy(gameObject);
        DontDestroyOnLoad(gameObject);
    }
    private void Start()
    {
        StartCoroutine(SetAllTo(1));
    }
    // for simulating some changes during the game
    private IEnumerator SetAllTo(int value)
    {
        yield return new WaitForSeconds(2.0f);
        for(int i = 0; i < star.Length; i++)
            star[i] = value;
        Debug.Log("Setting done");
    }
    public void PrintFirst()
    {
        Debug.Log(star[0]);
    }
}

现在我在按钮上添加了一个OnClick事件,将GameController游戏对象拖到插槽中并选择PrintFirst

我启动游戏并在协程日志之前和之后分别点击一次按钮,控制台给出以下内容:

0
Setting Done
1

编辑:
OnClick事件的游戏对象必须在场景中,它不能是资产文件夹中的预制件

似乎对start函数的调用也可能发生在调用ckeckValue

之前的外部调用中
尝试在每个函数中设置断点进行调试,您就可以理解发生了什么。

开始功能在游戏开始时运行一次,而不是第二次。

你有pattern - Singleton

第二件事为什么要调用外部函数来初始化类成员?在默认的承包商中执行。

- c#默认构造函数已经在int[]中初始化0 .

如果你仍然想运行从其他范围开始在你的代码将其公开(c#将变量/方法默认为私有)