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



我有一段代码可以看到碰撞器是否与另一个碰撞器相交,但它会给我一个错误。我把错误贴在下面。

NullReferenceException:对象引用未设置为对象的实例门户。LateUpdate () (at Assets/Scripts/Portal.cs:112)

我不知道为什么会这样。提前感谢您的帮助!& lt; 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);
}
}
}

最新更新