所以我有两个脚本,一个名为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搜索并一次又一次地修改我的代码但是却无法解决这个问题,我感到焦虑,只是不知道该怎么做。
答案 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)
只需将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
{
...
}