在我的新项目中,我有一个机械师,在该机械师中,只有当敌人启用了“手电筒”时,才可以编程来追踪玩家。正如您将在脚本中看到的那样,我通过执行空检查来完成
代码如下:
public class chasePlayer : MonoBehaviour
{
public Transform target;
public float speed;
public Light playerLight;
void followLight()
{
if (playerLight != null)
{
speed = 1;
float walkspeed = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, target.position, walkspeed);
}
}
void stopFollowing()
{
if (playerLight = null)
{
speed = 0;
}
}
void Update()
{
followLight();
stopFollowing();
}
}
问题是,我认为我所有的代码都正确,从理论上讲,它应该按照我想要的去做,但事实并非如此。即使我在应有的位置开始游戏,它也不会移动。
我可能做错了什么。 第一次制作原始脚本,可能出了很多问题
答案 0 :(得分:2)
老兵在这里! *笑*
在开始之前,我只想提到您正在使用C#,因此请尝试习惯CamelCase
来命名方法和类。
您的代码不起作用,因为您正在检查Light
的{{1}}组件。 null
仅在没有分配任何东西或分配的对象被销毁后才会出现。如果要检查组件的状态,最好使用null
。对您的总体代码进行了一些小的改进,现在看起来像这样:
playerLight.enabled
注意: :不要忘了将类文件重命名为public class ChasePlayer : MonoBehaviour
{
public Light playerLight;
public float speed;
public Transform target;
private void FollowLight()
{
// Does checking for given statement but is only executed in Debug mode.
// Fairly good for fail-proofing private methods
// Or clarifying, what values should be before invoking the method.
Debug.Assert(playerLight != null);
float walkspeed = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, target.position, walkspeed);
}
private void Update()
{
if(playerLight != null && playerLight.enabled)
FollowLight();
}
}
,因为我已经将类名命名为CamelCas(Unity要求文件名和类名必须匹配)为了能够在编辑器中将组件分配给GameObjects。
答案 1 :(得分:0)
根据您的最新评论,尝试以下操作:
public class chasePlayer : MonoBehaviour
{
public Transform target;
public float speed;
public Light playerLight;
void followLight()
{
if (playerLight != null)
{
speed = 1;
}
float walkspeed = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, target.position, walkspeed);
}
void stopFollowing()
{
if (playerLight == null)
{
speed = 0;
}
}
void Update()
{
followLight();
stopFollowing();
}
}