Unity中的“Unassigned Reference Exception”

3
我刚开始学习编程并且对这个论坛也不太熟悉,如果我违反了任何规定,请见谅。我只是在尝试制作一个第三人称摄像机而已,但是我一直遇到以下问题:
未分配引用异常:CameraFollow的CameraFollowObj变量尚未分配。 您可能需要在检查器中为CameraFollow脚本分配CameraFollowObj变量。 CameraFollow.CameraUpdater() (位于Assets/Scripts/CameraFollow.cs:68) CameraFollow.LateUpdate() (位于Assets/Scripts/CameraFollow.cs:62)
我创建了一个对象让摄像机跟随并将其放在模型上。然后将该对象移动到我认为是正确的字段,但问题仍然存在。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public float CameraMoveSpeed = 120.0f;
    public GameObject CameraFollowObj;

    Vector3 FollowPOS;

    public float clampAngle = 80.0f;
    public float InputSensitivity = 150.0f;
    public GameObject CameraObj;
    public GameObject PlayerObj;
    public float camDistanecXToPlayer;
    public float camDistanecYToPlayer;
    public float camDistanecZToPlayer;
    public float mouseX;
    public float mouseY;
    public float finalInputX;
    public float finalInputZ;
    public float smoothX;
    public float smoothY;

    private float rotY = 0.0f;
    private float rotX = 0.0f;

    // Start is called before the first frame update
    void Start()
    {
        Vector3 rot = transform.localRotation.eulerAngles;
        rotY = rot.y;
        rotX = rot.x;
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    // Update is called once per frame
    void Update()
    {
        float InputX = Input.GetAxis("RightStickHorizontal");
        float InputZ = Input.GetAxis("RightStickVertical");
        mouseX = Input.GetAxis("Mouse X");
        mouseY = Input.GetAxis("Mouse Y");
        finalInputX = InputX + mouseX;
        finalInputZ = InputZ + mouseY;

        rotY += finalInputX * InputSensitivity * Time.deltaTime;
        rotX += finalInputZ * InputSensitivity * Time.deltaTime;

        rotX = Mathf.Clamp(rotX, -clampAngle, clampAngle);

        Quaternion localRotation = Quaternion.Euler(rotX, rotY, 0.0f);
        transform.rotation = localRotation;
    }

    void LateUpdate() 
    {
        CameraUpdater();
    }

    void CameraUpdater() 
    {
        Transform target = CameraFollowObj.transform;

        float step = CameraMoveSpeed * Time.deltaTime;
        transform.position = Vector3.MoveTowards (transform.position, target.position, step);
    }
}  

那么可能就不是正确的字段;或者您可能有多个该类型的组件,只分配了其中一个。在播放模式下单击错误,它应该会在层次结构中突出显示引发异常的对象。 - derHugo
2个回答

2
请确保您没有在项目中的其他游戏对象中添加脚本,这可能会导致此错误。您可以在场景搜索栏中搜索脚本,所有附有该脚本的游戏对象将出现。此外,在运行时,如果您右键单击脚本,并在上下文菜单中选择“查找场景中的所有引用”或类似选项,则可以获取场景中脚本的所有实例。
我认为您可能会错误地将脚本拖到另一个gameObject中,而cameraToFollow gameObject为空,因此会出现未分配的错误。
希望这可以帮助您。

1
哈哈!把它分配给另一个对象是错误的。不知道怎么回事,脚本也以某种方式落到了地上。非常感谢您,先生! - helplesscodenub
@RustyBucketBay 是的,那基本上就是我对你的问题的评论 ;) - derHugo
如果@helplesscodenub的回答对你有用,就将其标记为解决方案。 - Kjell Schwaricke

0

你可以尝试多种方法:

  1. 确保你在字段中拖动了正确的对象(我怀疑你的角色对象是否叫做CameraFollow)
  2. 确保你从Hierarchy面板中拖入了一个对象,而不是从Assets窗口中(这意味着你需要拖入当前场景中可见的对象)
  3. 如果你尝试了以上所有方法都无效,可以尝试在脚本的start函数中分配对象。你可以使用GameObject.Find

希望这些能为你澄清一些问题。如果你真的想创建一个顶级相机系统,你也可以查看this视频。这是一个使用Cinemachine组件制作第三人称相机的示例(Cinemachine组件随Unity包管理器免费提供)

祝你在Unity编程中好运,并欢迎加入社区 :)


1
我正在观看一个教程,它说要将对象命名为“相机跟随”,有趣的是它是由同一个人制作的!https://youtu.be/LbDQHv9z-F0?t=987。该对象是在Hierarchy中创建的,感谢欢迎! - helplesscodenub
现在可能出现的唯一问题是,您的玩家对象是预制件,并且您添加了一个未应用的新子对象。尝试转到角色的根对象,右键单击并选择“完全取消打包预制件”选项。 - mihoci10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接