2016-07-23 5 views
1

AIThirdPersonControllerの階層から削除したエラーです。 私はメインカメラとThirdPersonControllerを持っています。なぜエラーが発生するのですかNullReferenceException:オブジェクト参照がCameraScript上のオブジェクトのインスタンスに設定されていませんか?

私はインスペクタのメインカメラを持って、私はScript.cs

カメラを追加
using UnityEngine; 
using System.Collections; 

public class CameraScript : MonoBehaviour { 


    public Transform TargetLookAt; 

    public float Distance = 5.0f; 
    public float DistanceMin = 3.0f; 
    public float DistanceMax = 10.0f; 

    private float mouseX = 0.0f; 
    private float mouseY = 0.0f; 
    private float startingDistance = 0.0f;  
    private float desiredDistance = 0.0f; 

    public float X_MouseSensitivity = 5.0f; 
    public float Y_MouseSensitivity = 5.0f; 
    public float MouseWheelSensitivity = 5.0f; 
    public float Y_MinLimit = -40.0f; 
    public float Y_MaxLimit = 80.0f; 

    public float DistanceSmooth = 0.05f;  
    private float velocityDistance = 0.0f;  
    private Vector3 desiredPosition = Vector3.zero; 

    public float X_Smooth = 0.05f; 
    public float Y_Smooth = 0.1f; 
    private float velX = 0.0f; 
    private float velY = 0.0f; 
    private float velZ = 0.0f; 
    private Vector3 position = Vector3.zero; 

    CursorLockMode wantedMode;  


    void Start(){ 
     Distance = Mathf.Clamp(Distance, DistanceMin, DistanceMax); 
     startingDistance = Distance; 
     Reset(); 
     SetCursorState(); 
     OnGUI(); 

    } 

    void Update(){ 
    } 

    void FixedUpdate(){ 
     if (TargetLookAt == null) 
      return; 

     HandlePlayerInput(); 

     CalculateDesiredPosition(); 

     UpdatePosition(); 
    } 

    void HandlePlayerInput(){ 
     float deadZone= 0.01f; // mousewheel deadZone 

     //if (Input.GetMouseButton(1)) 
     //{ 
     mouseX += Input.GetAxis("Mouse X") * X_MouseSensitivity; 
     mouseY -= Input.GetAxis("Mouse Y") * Y_MouseSensitivity; 
     //} 

     // this is where the mouseY is limited - Helper script 
     mouseY = ClampAngle(mouseY, Y_MinLimit, Y_MaxLimit); 

     // get Mouse Wheel Input 
     if (Input.GetAxis("Mouse ScrollWheel") < -deadZone || Input.GetAxis("Mouse ScrollWheel") > deadZone) 
     { 
      desiredDistance = Mathf.Clamp(Distance - (Input.GetAxis("Mouse ScrollWheel") * MouseWheelSensitivity), 
       DistanceMin, DistanceMax); 
     } 
    } 

    void CalculateDesiredPosition(){ 
     // Evaluate distance 
     Distance = Mathf.SmoothDamp(Distance, desiredDistance, ref velocityDistance, DistanceSmooth); 

     // Calculate desired position -> Note : mouse inputs reversed to align to WorldSpace Axis 
     desiredPosition = CalculatePosition(mouseY, mouseX, Distance); 
    } 

    Vector3 CalculatePosition (float rotationX , float rotationY , float distance ){ 
     Vector3 direction = new Vector3(0, 0, -distance); 
     Quaternion rotation = Quaternion.Euler(rotationX, rotationY, 0); 
     return TargetLookAt.position + (rotation * direction); 
    } 

    void UpdatePosition(){ 
     float posX= Mathf.SmoothDamp(position.x, desiredPosition.x, ref velX, X_Smooth); 
     float posY= Mathf.SmoothDamp(position.y, desiredPosition.y, ref velY, Y_Smooth); 
     float posZ= Mathf.SmoothDamp(position.z, desiredPosition.z, ref velZ, X_Smooth); 
     position = new Vector3(posX, posY, posZ); 

     transform.position = position; 

     transform.LookAt(TargetLookAt); 
    } 

    void Reset(){ 
     mouseX = 0; 
     mouseY = 10; 
     Distance = startingDistance; 
     desiredDistance = Distance; 
    } 

    float ClampAngle (float angle , float min , float max ){ 
     while (angle < -360 || angle > 360) 
     { 
      if (angle < -360) 
       angle += 360; 
      if (angle > 360) 
       angle -= 360; 
     } 

     return Mathf.Clamp(angle, min, max); 
    } 

    // Apply requested cursor state 
    void SetCursorState() 
    { 
     Cursor.lockState = wantedMode; 
     // Hide cursor when locking 
     Cursor.visible = (CursorLockMode.Locked != wantedMode); 
    } 

    void OnGUI() 
    { 
     GUILayout.BeginVertical(); 
     // Release cursor on escape keypress 
     if (Input.GetKeyDown (KeyCode.Escape)) 
      Cursor.lockState = wantedMode = CursorLockMode.None; 

     switch (Cursor.lockState) { 
     case CursorLockMode.None: 
      GUILayout.Label ("Cursor is normal"); 
      if (GUILayout.Button ("Lock cursor")) 
       wantedMode = CursorLockMode.Locked; 
      if (GUILayout.Button ("Confine cursor")) 
       wantedMode = CursorLockMode.Confined; 
      break; 
     case CursorLockMode.Confined: 
      GUILayout.Label ("Cursor is confined"); 
      if (GUILayout.Button ("Lock cursor")) 
       wantedMode = CursorLockMode.Locked; 
      if (GUILayout.Button ("Release cursor")) 
       wantedMode = CursorLockMode.None; 
      break; 
     case CursorLockMode.Locked: 
      GUILayout.Label ("Cursor is locked"); 
      if (GUILayout.Button ("Unlock cursor")) 
       wantedMode = CursorLockMode.None; 
      if (GUILayout.Button ("Confine cursor")) 
       wantedMode = CursorLockMode.Confined; 
      break; 
     } 

     GUILayout.EndVertical(); 

     SetCursorState(); 
    } 
} 

エラーがライン上にある:

GUILayout.BeginVertical(); 

私は取得していますエラーは次のとおりです。

NullReferenceException: Object reference not set to an instance of an object 
UnityEngine.GUILayoutUtility.BeginLayoutGroup (UnityEngine.GUIStyle style, UnityEngine.GUILayoutOption[] options, System.Type layoutType) (at C:/buildslave/unity/build/Runtime/IMGUI/Managed/GUILayoutUtility.cs:252) 
UnityEngine.GUILayout.BeginVertical (UnityEngine.GUIContent content, UnityEngine.GUIStyle style, UnityEngine.GUILayoutOption[] options) (at C:/buildslave/unity/build/Runtime/IMGUI/Managed/GUILayout.cs:308) 
UnityEngine.GUILayout.BeginVertical (UnityEngine.GUILayoutOption[] options) (at C:/buildslave/unity/build/Runtime/IMGUI/Managed/GUILayout.cs:296) 
CameraScript.OnGUI() (at Assets/My Scripts/CameraScript.cs:135) 
CameraScript.Start() (at Assets/My Scripts/CameraScript.cs:43) 

カメラスクリプト領域のメインカメラインスペクタで、ターゲットルックアットがThirdPersonControllerに設定されています。

答えて

1

Start()関数からOnGUI()関数を呼び出すため、このエラーが発生しています。それをしないでください。

void Start() 
{ 
    Distance = Mathf.Clamp(Distance, DistanceMin, DistanceMax); 
    startingDistance = Distance; 
    Reset(); 
    SetCursorState(); 
    OnGUI();///--------------------->DON'T DO THIS! 
} 

OnGUI()機能はユニティGUIのコールバック関数であると自動的にGUIを作成するために、ユニティによって呼び出されます。 Start()関数からその行のコードを削除すると、問題はなくなります。 Start()関数から開始するものがあれば、それを行う新しい関数を作成します。新しい機能は、OnGUI()命名されていない必要があると、そのようなGUILayout.BeginVertical();GUILayout.EndVertical();GUILayout.Button("Confine cursor")として任意のGUI機能を含めることはできません

お知らせ

OnGUI()機能は、あなたのゲームでは使用しないでください。 は、ゲームの機能をテストするためのテストツールとして、のみを使用してください。実際のゲームで使用すると非常に高価で低速です。 hereを使用する新しいUnity UIについて知ることができます。

0

スタックトレースにはソースがあることが示されているので、デバッガでステップバイステップを実行してnullを確認します。 GUILayoutを正しく設定していない可能性があります。

Apparentlyとにかく、OnGUIとGUILayoutは「旧式」なコードなので、新しい代替方法があれば調べる価値があります。

関連する問題