为什么脚本中不存在摄像机?


using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Camera))]
public class CameraFrustumGizmo : MonoBehaviour
{
    Camera _camera;
    void Start()
    {
        _camera = GetComponent<Camera>();
    }

相机是黑色的,当我开始输入Ca…没有相机。当编译脚本时,我没有得到错误,但当运行游戏时,我得到空异常。

脚本附属于主摄像机。

我试过了:

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)

现在摄像机存在,但一旦我将脚本附加到主摄像机,我甚至在运行游戏之前得到空异常,空在行:

if (_camera.orthographic)

NullReferenceException:对象引用未设置为对象的实例CameraTest。OnDrawGizmos()(在资产/MyScripts/CameraTest.cs:17)UnityEditor.DockArea: OnGUI ()

OnDrawGizmos将在场景视图中被调用,这意味着它可能在游戏未运行时被调用。

你的Start函数在游戏运行之前不会被调用,所以_cameraOnDrawGizmos被调用时不会被初始化。

基本上,当您摆弄编辑器脚本时,您需要非常小心哪些对象引用存在。如果你的引用能够在运行中重新构建通常是最好的——考虑到Unity每次重新编译代码时都会重新加载程序集,这种情况无论如何都会经常发生。

通常我会用一个属性来缓存第一次需要的引用:

Camera cachedCamera;
Camera _camera {
    get {
        if (cachedCamera == null) {
            cachedCamera = GetComponent<Camera>();
        }
        return cachedCamera;
    }
}

这在某些情况下仍然会失败,但它给了你一个基本的概念。

最新更新