C# 为什么添加文本会导致播放器移动错误?

C# 为什么添加文本会导致播放器移动错误?,c#,debugging,unity3d,C#,Debugging,Unity3d,我的代码工作得很好,直到我添加了健康和幸存者保存文本 现在是line controller.Move(移动速度);由于控制器为null,因此给出错误NullRefeenceexption 奇怪的是,如果我进入LivingEntity,并用 Health.text或survivorsaved.text它再次工作 有人知道为什么吗 代码: public class Player : LivingEntity { public float moveSpeed = 5; Camera

我的代码工作得很好,直到我添加了健康和幸存者保存文本

现在是line controller.Move(移动速度);由于控制器为null,因此给出错误NullRefeenceexption

奇怪的是,如果我进入LivingEntity,并用

Health.text或survivorsaved.text它再次工作

有人知道为什么吗

代码:

public class Player : LivingEntity {

    public float moveSpeed = 5;

    Camera viewCamera;
    PlayerController controller;
    GunController gunController;

    protected override void Start()
    {
        base.Start();
        controller = GetComponent<PlayerController>();
        gunController = GetComponent<GunController>();
        viewCamera = Camera.main;
    }

    void Update()
    {
        // Movement input
        Vector3 moveInput = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
        Vector3 moveVelocity = moveInput.normalized * moveSpeed;
        controller.Move(moveVelocity);

        // Look input
        Ray ray = viewCamera.ScreenPointToRay(Input.mousePosition);
        Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
        float rayDistance;

        if (groundPlane.Raycast(ray, out rayDistance))
        {
            Vector3 point = ray.GetPoint(rayDistance);
            //Debug.DrawLine(ray.origin,point,Color.red);
            controller.LookAt(point);
        }

        // Weapon input
        if (Input.GetMouseButton(0))
        {
            gunController.Shoot();
        }
    }

}

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class LivingEntity : MonoBehaviour, IDamageable
{

    public float startingHealth;
    protected float health;
    protected bool dead;
    private float playerhealth=100;
    private int Survivorssaved=0;

    public Text Health;
    public Text SurvivorsSaved;

    public event System.Action OnDeath;

    protected virtual void Start()
    {
        health = startingHealth;
        Health.text = "Health: " + playerhealth;
        SurvivorsSaved.text = "Survivors Saved:" + Survivorssaved;
    }

    public void TakeHit(float damage, RaycastHit hit)
    {
        TakeDamage(damage);
    }

    public void TakeDamage(float damage)
    {
        health -= damage;
        if (GameObject.Equals(gameObject, GameObject.FindGameObjectWithTag("Player")))
        {
            playerhealth = health;
            Health.text = "Health: " + playerhealth;
            SurvivorsSaved.text = "Survivors Saved: " + Survivorssaved;
        }
        if (health <= 0 && !dead)
        {
            if(GameObject.Equals(gameObject, GameObject.FindGameObjectWithTag("Player")))
            {  
            }
            if (GameObject.Equals(gameObject, GameObject.FindGameObjectWithTag("Zombie")))
            {
                ScoreManager.Instance.AddScore(100);
            }
            if (GameObject.Equals(gameObject, GameObject.FindGameObjectWithTag("Survivor")))
            {
                ScoreManager.Instance.RemoveScore(500);
            }
            Die();
        }
    }

    public void HealDamage(float damage)
    {
        health += damage;
        playerhealth = health;
        Survivorssaved += 1;
        Health.text = "Health: " + playerhealth;
        SurvivorsSaved.text = "Survivors Saved: " + Survivorssaved;
    }

    protected void Die()
    {
        dead = true;
        if (OnDeath != null)
        {
            OnDeath();
        }
        GameObject.Destroy(gameObject);
    }
}
公共类玩家:LivingEntity{
公共浮动速度=5;
摄像机;
播放控制器;
枪控器枪控器;
受保护的覆盖无效开始()
{
base.Start();
控制器=GetComponent();
gunController=GetComponent();
viewCamera=Camera.main;
}
无效更新()
{
//运动输入
Vector3 moveInput=新的Vector3(Input.GetAxisRaw(“水平”),0,Input.GetAxisRaw(“垂直”);
Vector3 moveVelocity=moveInput.normalized*moveSpeed;
控制器。移动(移动速度);
//查找输入
Ray Ray=viewCamera.ScreenPointRoay(输入.鼠标位置);
平面接地平面=新平面(矢量3.up,矢量3.zero);
浮动射线距离;
if(地平面光线投射(光线,向外光线距离))
{
Vector3点=光线.GetPoint(光线距离);
//绘制线(光线、原点、点、颜色、红色);
控制器。注视(点);
}
//武器投入
if(输入。GetMouseButton(0))
{
枪械控制员;
}
}
}
使用UnityEngine;
使用UnityEngine.UI;
使用系统集合;
公共阶层生存能力:单一行为,可保护
{
公共卫生;
保护健康;
保护布尔死亡;
私人浮动玩家健康=100;
私有int Survivorssaved=0;
公共卫生;
保存公共文本存活者;
公共事件系统。行动指南;
受保护的虚拟void Start()
{
健康=开始健康;
Health.text=“健康:”+玩家健康;
SurvivorsSaved.text=“幸存者已保存:”+幸存者已保存;
}
公共虚空攻击(漂浮伤害,射线攻击)
{
损坏;
}
公共财产损失(浮动损失)
{
健康-=损害;
if(GameObject.Equals(GameObject,GameObject.FindGameObjectWithTag(“Player”))
{
玩家健康=健康;
Health.text=“健康:”+玩家健康;
SurvivorsSaved.text=“幸存者已保存:”+幸存者已保存;
}

如果(健康我找到了答案,但我没有看到答案,我将其标记为已解决,因此我将简单地发布解决方案

当我去unity Scene editor查看时,playerController被正确地传递给玩家,我发现僵尸和幸存者也在要求提供健康和幸存者的文本对象,尽管没有传递文本对象,但他们仍在将信息传递到文本中


我仍然没有将其传递给僵尸或幸存者,但通过稍微更改代码,我确保僵尸和幸存者从未将任何值传递到文本文件中,从而使其正常工作。

我找到了答案,但我没有看到我是否将其标记为已解决,因此我将简单地发布解决方案

当我去unity Scene editor查看时,playerController被正确地传递给玩家,我发现僵尸和幸存者也在要求提供健康和幸存者的文本对象,尽管没有传递文本对象,但他们仍在将信息传递到文本中


我仍然没有将其传递给僵尸或幸存者,但通过稍微更改代码,我确保僵尸和幸存者从未将任何值传递到文本文件中,从而使其正常工作。

您应该研究一个,特别是最小值的概念。看起来本例中的问题可能与链接一样简单(在场景编辑器中)从
玩家
玩家控制器
未设置。因此我进入Unity并仔细检查了所有内容,找到了问题的根源。当我将文本对象提供给玩家时,幸存者和僵尸也要求提供文本对象,但我没有提供给他们。不幸的是,现在我有一个完整的其他问题beca“使用僵尸”不应该有这样的功能,所以我需要重新编写这个活的实体代码。你应该研究一个,特别是最小值的概念。看起来这个例子中的问题可能和链接一样简单(在场景编辑器中)从
玩家
玩家控制器
未设置。因此我进入Unity并仔细检查了所有内容,找到了问题的根源。当我将文本对象提供给玩家时,幸存者和僵尸也要求提供文本对象,但我没有提供给他们。不幸的是,现在我有一个完整的其他问题beca“使用僵尸”不应该有这样的功能,所以我需要重新编写这个活生生的实体代码。