Unity3D中另一个脚本的布尔值

时间:2015-12-01 01:11:19

标签: c# unity3d

所以我有两个脚本,一个名为EndCollider.cs,它位于地图上的某个地方, 它有一个OnTriggerEnter函数,它将布尔值设置为true。

using UnityEngine;
using System.Collections;

public class EndCollider : MonoBehaviour {

public bool isShow = false;

void OnTriggerEnter ()
{
    isShow = true;
}

}

另一个脚本是SlowDownRun.cs,它在一个怪物对象上,在这个脚本中,我试图检测来自另一个脚本的布尔值是否为真,如果是,则移动怪物

using UnityEngine;
using System.Collections;

public class SlowDownRun : MonoBehaviour {

GameObject TrollScript;
EndCollider MonsterShow;

// Use this for initialization
void Start ()
{
    TrollScript = GameObject.Find("Troll");
    MonsterShow = TrollScript.GetComponent<EndCollider>();
}

void Update()
{
    if (MonsterShow.isShow == true)
    {
        float movementSpeed = 10f;
        transform.position += transform.forward * Time.deltaTime * movementSpeed;
    }
}

}

现在代码不起作用,如果我将它们带出IF语句,那么移动怪物的代码就可以了。我也一直得到这个错误NullReferenceException:对象引用未设置为行上的对象实例if(MonsterShow.isShow == true)

请帮助我成为Unity的初学者,这个问题困扰了我好几个小时了,我做了很多Google搜索并一次又一次地修改我的代码但是却无法解决这个问题,我感到焦虑,只是不知道该怎么做。

3 个答案:

答案 0 :(得分:0)

你在Start()方法中的find troll调用没有找到troll或者没有在其上找到EndCollider组件,导致它为null。因为你只在启动时搜索一次,所以它总是为空。

这可能是因为你的巨魔还没有在场景开始时创建。

如果你的意图实际上是让玩家在撞击对手时出现怪物,你应该看看预制实例化。

http://docs.unity3d.com/Manual/InstantiatingPrefabs.html

因此,在你的OnTriggerEnter中,你可以简单地实例化一个全新的怪物:

public class EndCollider : MonoBehaviour {

public GameObject MonsterPrefab;

void OnTriggerEnter ()
{
    Instantiate(MonsterPrefab);
}

}

答案 1 :(得分:0)

  • 让masterShow endcollider public
  • 清理你的开始方法。
  • 只需将troll对象从层次结构拖放到脚本中即可。

    public class SlowDownRun:MonoBehaviour {

    public EndCollider MonsterShow;

    //使用它进行初始化 void Start() {

    }

    void Update() {     if(MonsterShow.isShow == true)     {         float movementSpeed = 10f;         transform.position + = transform.forward * Time.deltaTime * movementSpeed;     } }

    }

答案 2 :(得分:0)

在两个场景之间传递数据的一种更好方法可能是使用PlayerPrefs:

//EndCollider.cs
public bool isShown
{
    get { return PlayerPrefs.GetInt("IS_SHOWN")==1? true:false; }
    set { PlayerPrefs.SetInt("IS_SHOWN", Convert.ToInt32(value));} 
}

//SlowDownRun.cs
if(PlayerPrefs.GetInt("IS_SHOWN")==1)  // isShown = true
{
    ...
}