为什么脚本中不存在相机?

时间:2016-10-27 23:05:59

标签: c# unity3d

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()

1 个答案:

答案 0 :(得分:0)

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

在游戏运行之前,您的Start功能无法调用,因此_cameraOnDrawGizmos时间内无法初始化Camera cachedCamera; Camera _camera { get { if (cachedCamera == null) { cachedCamera = GetComponent<Camera>(); } return cachedCamera; } } 调用。

基本上,当你搞乱编辑器脚本时,你需要非常小心存在哪些对象引用。如果您的引用可以动态重建,通常最好 - 假设Unity每次重新编译代码时重新加载程序集,那么无论如何都会经常发生。

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

{{1}}

在某些情况下仍然会失败,但它会给你基本的想法。