无法访问成员函数中的类变量
本文关键字:类变量 函数 成员 访问 | 更新日期: 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 .