Unity3D C#跨脚本获取公共变量值异常问题求助
问题原因分析
你遇到的核心问题是组件类型不匹配,导致无法正确获取到gameController脚本里的winColor变量:
在tile.cs的Start()方法中,你写了:
winingColor = GameObject.Find("gameController").GetComponent<gamePlay>().winColor;
但你的控制脚本文件名是gameController.cs,对应的类名应该是gameController(Unity要求脚本文件名和类名必须完全一致,否则无法正常挂载和调用),而你这里获取的是gamePlay类型的组件——这个组件根本不存在于目标物体上,所以GetComponent会返回null,访问null的winColor就会得到Color的默认值:RGBA(0.000, 0.000, 0.000, 0.000)。
另外还有两个潜在的小风险需要排查:
- 确认场景中目标物体的名称确实是
gameController,没有拼写错误(大小写、多字少字); - 确认该物体上确实挂载了
gameController.cs脚本,没有挂错其他脚本。
解决方法
1. 修正组件类型(最直接的修复)
把tile.cs里的组件获取代码改成正确的gameController类型:
private Color winingColor; void Start () { // 将gamePlay改为gameController,匹配你的脚本类名 winingColor = GameObject.Find("gameController").GetComponent<gameController>().winColor; Debug.Log(winingColor); }
这样就能正确获取到gameController脚本里赋值后的winColor了。
2. 更可靠的优化方案(推荐)
使用单例模式来获取gameController实例,避免GameObject.Find带来的性能开销和名称拼写错误问题:
首先在gameController.cs中添加单例逻辑:
public GameObject ball; public List<GameObject> tiles; private Color [] colors = { new Color(0,1,0,1), new Color(1,0,0,1), new Color(1,1,1,1), new Color(0,0,1,1), new Color(1,1,0,1), new Color(0, 0, 0, 1)}; public Color winColor; // 添加单例实例 public static gameController Instance; void Awake () { // 在Awake中初始化单例,比Start更早执行,避免时序问题 Instance = this; } void Start () { winColor = colors[1]; Debug.Log("con wincolor:" + winColor); ball.GetComponent<SpriteRenderer>().color = colors[1]; tiles[0].GetComponent<SpriteRenderer>().color = colors[0]; tiles[1].GetComponent<SpriteRenderer>().color = colors[1]; tiles[2].GetComponent<SpriteRenderer>().color = colors[3]; tiles[3].GetComponent<SpriteRenderer>().color = colors[4]; }
然后在tile.cs中直接通过单例获取winColor:
private Color winingColor; void Start () { winingColor = gameController.Instance.winColor; Debug.Log(winingColor); }
这种方式不仅更高效,还能避免因物体名称修改导致的错误,是Unity中获取全局控制器的常用方案。
内容的提问来源于stack exchange,提问作者thirteen4054
相关产品推荐
相关产品推荐

