1

Zigfu の ZDK for Game Project を研究に使用しています。標準のアバターを手に取り、2 つのコライダー (剛体を持つ球体コライダー) を手に取り付けました。1つは左手用、もう1つは右手用です。手が新しい領域に入っているかどうかを追跡するために、アバターの周りにいくつか (24 個) のボックス コライダーを作成します。すべてのボックスには、0 から 23 までの「id」と次のスクリプトがあります。

using UnityEngine;
using System.Collections;

public class handsTracking : MonoBehaviour 
{
    public int id;

    void OnTriggerEnter (Collider other) {
        if(other.tag == "handsLeftTracking"){
            print("leftHand entered: " + id);
            playerCommunication.activity += 0.1f;
            playerCommunication.handsLeft[id] = true; //here ist the exception
        }
        else if (other.tag == "handsRightTracking"){
            print("rightHand entered: " + id);
            playerCommunication.activity += 0.1f;
            playerCommunication.handsRight[id] = true; //here ist the exception
        }
    }
    void OnTriggerExit (Collider other) {
        if(other.tag == "handsLeftTracking"){
            print("leftHand exited: " + id);
            playerCommunication.activity += 0.01f;
            playerCommunication.handsLeft[id] = false; //here ist the exception
        }
        else if (other.tag == "handsRightTracking"){
            print("rightHand exited: " + id);
            playerCommunication.activity += 0.01f;
            playerCommunication.handsRight[id] = false; //here ist the exception
        }
    }
}

プレーヤーの別のスクリプトで、これらの衝突を使用したいと考えています。handsTracking.cs は、playerCommunication.cs スクリプトの値のみを編集する必要があります。

using UnityEngine;
using System.Collections;

public class playerCommunication : MonoBehaviour {

    public static bool[] handsRight;
    public static bool[] handsLeft;
    public static float activity;
    public float fallback;

    // Use this for initialization
    void Awake () {
        activity = 0.0f;
    }

    // Update is called once per frame
    void Update () {
        if((activity - fallback * Time.deltaTime) >= 0.0f){
            activity -= fallback * Time.deltaTime;
        }
    }

    void OnGUI () {
        GUI.Box (new Rect (10,200,150,20), "Activity: " + activity);    
    }
}

これまでのところ、これはうまく機能します。しかし、次の例外があります。

NullReferenceException: Object reference not set to an instance of an object
handsTracking.OnTriggerEnter (UnityEngine.Collider other) (at Assets/SeriousGame/Scripts/handsTracking.cs:19)

配列を編集しようとした行を褒めると、エラーはなくなります。playerCommunication スクリプトで関数を呼び出したり、 handsTracking.cs で配列を処理しようとしましたが、何も機能しません。衝突と配列の間のリンクがわかりません?!

4

3 に答える 3

0

例外が発生する理由についての私の推測は、プレーヤーにある playerCommunication スクリプトにアクセスしていないためです。代わりに、(私が想像する) 何も設定されていないスクリプト フォルダー内のものを使用しようとしています公共の権利など

あなたがする必要があるのは、次のように行を置き換えることです:

playerCommunication.handsLeft[id] = true;

これとともに:

GameObject.Find("Avatar").GetComponent<playerCommunication>().handsLeft[id] = true;

ここで、「Avatar」はアバター/プレイヤー ゲーム オブジェクトの名前であり、playerCommunication は、handsLeft public bool を持つオブジェクト内のスクリプトです。

于 2013-04-23T13:04:09.983 に答える
0

nullpointerexception が発生する理由は、まだ初期化されていないオブジェクトを配列に追加しようとしたためです。

次の宣言があります。

public int id;

その後、次のコード行があります。

print("leftHand entered: " + id);

たとえば、次のように変更します。

Debug.Log("ID value is now: " + id);

おそらく次のように表示されます。

ID value is now: null

まだ値を指定idしていません。を呼び出すとplayerCommunication.handsLeft[id] = true;、実際には配列のヌル値を に設定しようとしていtrueます。id-value を何かに設定してください。すべてのボックスには 0 から 23 までの id 値があるとおっしゃいましたが、Unity のプロパティ ビューで正しく設定しましたか?

于 2013-04-23T11:33:20.790 に答える