0

I have a stanza of code that sees if a collider is intersecting with another collider, but it's giving me an error. I've pasted the error below.

NullReferenceException: Object reference not set to an instance of an object Portal.LateUpdate () (at Assets/Scripts/Portal.cs:112)

I have no idea why this is happening. Thanks for the help in advance! <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);
            }
        }
    }
}
ProgrammingLlama
  • 36,677
  • 7
  • 67
  • 86
  • 2
    Which is line 112? – Everts May 31 '22 at 04:36
  • I copied and pasted into VS and assuming all the spacing kept consistent... 112: if (!travellersInPortalColliders.Contains(traveller)) – Tristin Newby May 31 '22 at 04:41
  • 2
    Is it `if (!travellersInPortalColliders.Contains(traveller))`? Makes sense since `travellersInPortalColliders` is never assigned a value. You probably want to create the list in `Awake` like this one: `trackedTravellers = new List();` – Retired Ninja May 31 '22 at 04:42
  • Please only use the visual-studio tag if your question is about using Visual Studio (the application). You would have an exception here no matter how you authored and built your code, so Visual Studio doesn't come into it. – ProgrammingLlama May 31 '22 at 05:04

1 Answers1

2

The reason for the NullReferenceException is because the variable List travellersInPortalColliders is never initialized. You need to somewhere in your code put:

travellersInPortalColliders = new List<PortalTraveller>();

I would suggest somewhere in your awake function. For Example:

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);
        }
    }
}