using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Camera))]
public class CameraFrustumGizmo : MonoBehaviour
{
Camera _camera;
void Start()
{
_camera = GetComponent<Camera>();
}
相机是黑色的,当我开始键入Ca ...时没有相机。 我在编译脚本时没有收到错误,但在运行游戏时我得到了null异常。
该脚本已附加到主摄像头。
我现在尝试了这个:
using UnityEngine;
using System.Collections;
public class CameraTest : MonoBehaviour {
Camera _camera;
void Start()
{
_camera = GetComponent<Camera>();
}
public virtual void OnDrawGizmos()
{
Matrix4x4 temp = Gizmos.matrix;
Gizmos.matrix = Matrix4x4.TRS(transform.position, transform.rotation, Vector3.one);
if (_camera.orthographic)
现在相机已经存在,但是一旦我将脚本附加到主相机上,我甚至在运行游戏之前就会出现null异常,就会出现空白:
if (_camera.orthographic)
NullReferenceException:未将对象引用设置为对象的实例 CameraTest.OnDrawGizmos()(在Assets / MyScripts / CameraTest.cs:17) UnityEditor.DockArea:OnGUI()
答案 0 :(得分:0)
OnDrawGizmos
将在场景视图中调用,这意味着可以在游戏未运行时调用它。
在游戏运行之前,您的Start
功能无法调用,因此_camera
在OnDrawGizmos
时间内无法初始化Camera cachedCamera;
Camera _camera {
get {
if (cachedCamera == null) {
cachedCamera = GetComponent<Camera>();
}
return cachedCamera;
}
}
调用。
基本上,当你搞乱编辑器脚本时,你需要非常小心存在哪些对象引用。如果您的引用可以动态重建,通常最好 - 假设Unity每次重新编译代码时重新加载程序集,那么无论如何都会经常发生。
通常我会在第一次需要时使用一个缓存引用的属性:
{{1}}
在某些情况下仍然会失败,但它会给你基本的想法。