Unity 对象引用未设置为对象的实例

Unity Object Reference Not Set To An Instance Of An Object

我有一段代码可以查看对撞机是否与另一个对撞机相交,但它给了我一个错误。我在下面粘贴了错误。

NullReferenceException: 对象引用未设置为对象的实例 Portal.LateUpdate () (位于 Assets/Scripts/Portal.cs:112)

我不知道为什么会这样。我在这里先向您的帮助表示感谢! <3

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Portal : MonoBehaviour
{
    //Portal Camera Positioning
    public Portal linkedPortal;
    Camera portalCam;
    Camera playerCam;
    
    //Portal Sceen Texture and Clipping Protection
    [HideInInspector]
    public PortalScreen portalScreen;
    MeshRenderer screenRen;
    RenderTexture viewTexture;
    public PortalTraveller activeTraveller;
    public Collider travellerCollider;
    List<PortalTraveller> travellersInPortalColliders;

    //Travellers
    [HideInInspector]
    public List<PortalTraveller> trackedTravellers;
    Vector3 desiredCameraRotation;
    Vector3 desiredCameraPosition;
    Transform globalRuler;
    public PortalTraveller[] travellersToAdd;
    [HideInInspector]
    public float travellerDistance;

    //Debug
    [HideInInspector]
    public float dstToPlayer;

    void Awake()
    {
        playerCam = Camera.main;
        portalCam = linkedPortal.GetComponentInChildren<Camera>();
        portalScreen = GetComponentInChildren<PortalScreen>();
        screenRen = portalScreen.GetComponent<MeshRenderer>();
        globalRuler = GameObject.FindWithTag("GlobalRuler").transform;
        trackedTravellers = new List<PortalTraveller>();
        travellersToAdd = GameObject.FindObjectsOfType<PortalTraveller>();

        foreach (PortalTraveller traveller in travellersToAdd)
        {
            if (!trackedTravellers.Contains(traveller))
            {
                trackedTravellers.Add(traveller);
            }
        }
    }

    void Update()
    {
        Render();   
        if (activeTraveller != null)
            travellerCollider = activeTraveller.GetComponent<Collider>();
    }

    static bool VisibleFromCamera(Renderer renderer, Camera camera)
    {
        Plane[] frustumPlanes = GeometryUtility.CalculateFrustumPlanes(camera);
        return GeometryUtility.TestPlanesAABB(frustumPlanes, renderer.bounds);
    }

    void Render()
    {
        if (!VisibleFromCamera(screenRen, playerCam))
        {
            return;
        }
        
        desiredCameraPosition = transform.position - (playerCam.transform.position - linkedPortal.portalScreen.screenPos);
        desiredCameraPosition.y = playerCam.transform.position.y;
        desiredCameraRotation = playerCam.transform.eulerAngles + new Vector3 (0f, 180f, 0f);

        portalCam.transform.position = desiredCameraPosition;
        portalCam.transform.eulerAngles = desiredCameraRotation;

        if (viewTexture == null || viewTexture.width != Screen.width || viewTexture.height != Screen.height)
        {
            if (viewTexture != null)
            {
                viewTexture.Release();
            }

            screenRen.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.ShadowsOnly;

            viewTexture = new RenderTexture (Screen.width, Screen.height, 0); 
            portalCam.targetTexture = viewTexture;
            screenRen.material.SetTexture("_MainTex", viewTexture);

            screenRen.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
        }
    }
    
    void LateUpdate()
    {
        HandleTravellers();

        foreach (PortalTraveller traveller in travellersToAdd)
        {
            if (!trackedTravellers.Contains(traveller))
            {
                trackedTravellers.Add(traveller);
            }
        }

        foreach (PortalTraveller traveller in trackedTravellers)
        {
            if (!travellersInPortalColliders.Contains(traveller))
            {
                traveller.hasTeleported = false;
            }
        }
    }

    void HandleTravellers()
    {
        for (int i = 0; i < trackedTravellers.Count; i++)
        {
            PortalTraveller traveller = trackedTravellers[i];
            Transform travellerT = trackedTravellers[i].transform;

            Vector3 toTraveller = traveller.transform.position - transform.position;
            int portalSide = System.Math.Sign(Vector3.Dot(toTraveller, transform.right));
            int portalSideOld = System.Math.Sign(Vector3.Dot(traveller.previousTravellerVector, transform.right));
            travellerDistance = Mathf.Abs(Vector3.Distance(transform.position, travellerT.position));
            activeTraveller = traveller;

            if (travellerDistance > linkedPortal.travellerDistance)
            {
                break;
            }

            if (portalSide != portalSideOld && travellerDistance < globalRuler.transform.lossyScale.z / 2)
            {
                var positionOld = travellerT.position;
                var rotationOld = travellerT.rotation;
                Quaternion rot = Quaternion.Euler(desiredCameraRotation.x, desiredCameraRotation.y, 0f);

                traveller.Teleport(transform, linkedPortal.transform, travellerT);
                traveller.previousTravellerVector = toTraveller;                
                trackedTravellers.RemoveAt(i);
                i--;
            }
            else
            {
                traveller.previousTravellerVector = toTraveller;
                dstToPlayer = Mathf.Abs(Vector3.Distance(transform.position, travellerT.position));
            }
        }
    }

    void OnValidate()
    {
        if (linkedPortal != null)
        {
            linkedPortal.linkedPortal = this;
        }
        travellersToAdd = GameObject.FindObjectsOfType<PortalTraveller>();
    }

    void OnTriggerEnter(Collider other)
    {   
        if (other.GetComponent<PortalTraveller>() != null)
        {
            var travellerSharedCollider = other.GetComponent<PortalTraveller>();
            
            if (!travellersInPortalColliders.Contains(travellerSharedCollider))
            {
                travellersInPortalColliders.Add(travellerSharedCollider);
                linkedPortal.travellersInPortalColliders.Add(travellerSharedCollider);
            }
        }
    }

    void OnTriggerExit(Collider other)
    {
        if (other.GetComponent<PortalTraveller>() != null)
        {
            var travellerSharedCollider = other.GetComponent<PortalTraveller>();

            if (travellersInPortalColliders.Contains(travellerSharedCollider))
            {
                travellersInPortalColliders.Remove(travellerSharedCollider);
                linkedPortal.travellersInPortalColliders.Remove(travellerSharedCollider);
            }
        }
    }
}

出现 NullReferenceException 的原因是变量 List travellersInPortalColliders 从未被初始化。您需要在代码中的某处放置:

travellersInPortalColliders = new List<PortalTraveller>();

我会在你的唤醒功能中的某个地方提出建议。例如:

void Awake()
{
    playerCam = Camera.main;
    portalCam = linkedPortal.GetComponentInChildren<Camera>();
    portalScreen = GetComponentInChildren<PortalScreen>();
    screenRen = portalScreen.GetComponent<MeshRenderer>();
    globalRuler = GameObject.FindWithTag("GlobalRuler").transform;
    trackedTravellers = new List<PortalTraveller>();
    travellersToAdd = GameObject.FindObjectsOfType<PortalTraveller>();
    travellersInPortalColliders = new List<PortalTraveller>();

    foreach (PortalTraveller traveller in travellersToAdd)
    {
        if (!trackedTravellers.Contains(traveller))
        {
            trackedTravellers.Add(traveller);
        }
    }
}