Unity C# 空引用异常
本文关键字:异常 引用 Unity | 更新日期: 2023-09-27 17:56:08
我正在尝试使用 C# 代码从 Unity
中的int
变量获取数据。以下是我用来获取int
C#
代码。
using UnityEngine;
using System.Collections;
public class endGameMessage : MonoBehaviour {
public static int score2;
void Start () {
GameObject thePlayer = GameObject.FindWithTag("Player");
gameScript game = thePlayer.GetComponent<gameScript>();
score2 = game.score;
}
// Update is called once per frame
void Update () {
Debug.Log (score2);
}
}
下面是我尝试从中提取数据的另一个脚本中的代码。
using UnityEngine;
using System.Collections;
public class gameScript : MonoBehaviour {
//score
public int score = 0;
void OnTriggerEnter(Collider other) {
if(other.gameObject.tag =="hammer"){
GameObject.FindGameObjectWithTag("pickUpMessage").guiText.text = ("Picked Up A Hammer");
Destroy(other.gameObject);
Debug.Log("collision detected hammer");
audio.PlayOneShot(gotHit);
score = score+10;
}
}
}
我可以获取另一个脚本遇到的int
值,但即使int
应该是 10,它也始终为 0。
我的问题是如何在脚本中保持值? 任何帮助,不胜感激。
试试这个
public static int score2
{
get
{
return GameObject.FindWithTag("Player").GetComponent<gameScript>().score;
}
}
你有很多可能性。
第一个是将分数设置为游戏脚本的静态参数。
-
所以你可以在任何地方访问它,就像这样:
int myScore = gameScript.Score ;
-
声明应该是:
public static int score;
如果您想从不同的脚本中保存很多不同的值,第二种可能性要好得多。在这种情况下,您需要定义一个 gameContext 单例。
如果你不知道这是什么,你应该看看C#中的单例: [https://msdn.microsoft.com/en-us/library/ff650316.aspx]
单例将允许您拥有游戏上下文的单个实例。 在您的情况下,您的单例将具有"分数"属性。 您将能够从任何场景和任何脚本中获取值。
这是迄今为止最好的方法。
score2
在开始时读取一次,然后再也不会读取。 int
是 C# 中的整数类型,因此按值传递,即它接收副本。有几种方法可以解决这个问题。
最简单的解决方案是直接访问gameScript.score
- 无论如何,它都为每个人提供读/写访问权限。要封装它,您可以选择定义一个属性。
更好的方法是定义一个新的类GameStatus
,其中包含所有相关的东西。例如,这可以作为单例实现。