Unity C #Null引用异常

时间:2013-01-27 16:32:25

标签: c# unity3d

我正在尝试使用C#代码从int中的Unity变量中获取数据。 以下是我用来获取C#的{​​{1}}代码。

int

以下是我尝试从中提取数据的其他脚本中的代码。

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意味着为10,它也始终为0。

我的问题是如何保持脚本的价值?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

试试这个

public static int score2
{
    get
    {
        return GameObject.FindWithTag("Player").GetComponent<gameScript>().score;
    }
}

答案 1 :(得分:1)

你有很多可能性。

第一个是将您的分数设置为游戏脚本的静态参数

  • 所以你可以在任何地方访问它:

          `int myScore = gameScript.Score ;`
    
  • 声明应该是:

          `public static int score;`
    

如果你想从不同的脚本中保存很多不同的值,第二种可能性要好得多。 在这种情况下,您需要定义一个gameContext单例。

如果你不知道这是什么,你应该看看C#中的单身人士:    [https://msdn.microsoft.com/en-us/library/ff650316.aspx]

Singleton将允许您拥有gameContext的单个实例。          在您的情况下,您的单身人士将具有分数属性。          并且您将能够从任何场景和任何脚本中获取值。

这是迄今为止最好的方法。

答案 2 :(得分:0)

score2在开始时读取一次,然后再也不会读取。 int是C#中的整数类型,因此传递by value,即它接收副本。有几种方法可以解决这个问题。

最简单的解决方案是直接访问gameScript.score - 它无论如何都会为每个人提供读/写访问权限。要封装它,您可以选择定义property

更好的方法是定义一个包含所有相关内容的新类GameStatus。例如,这可以实现为singleton