2017-08-23 4 views
0

次のコードでは、同じゲームオブジェクトにAnotherScriptが添付されていますので、playerScoreAnotherScriptにアクセスしたいのですが、なぜ私はGetComponentを目覚まし機能に使用していますか?私はクラスanotherScript = new AnotherScript()のインスタンスを宣言してplayerScoreにアクセスできますか?私の質問が明確であるホープ..おかげなぜGetComponentを1で使用するのですか?

using UnityEngine; 
using System.Collections; 

public class UsingOtherComponents : MonoBehaviour 
{ 
    private AnotherScript anotherScript; 

    void Awake() 
    { 
     anotherScript = GetComponent<AnotherScript>(); 
    } 

    void Start() 
    { 
     Debug.Log("The player's score is " + anotherScript.playerScore); 

    } 
} 
+0

Unityはコンポーネントパラダイムを使用しているため、コンポーネントを追加または削除することは意味があります。複製は、あなたがこれを他の方法で行うとどうなるかを説明します。 – Programmer

答えて

1

他の任意のGameObjectには、AnotherScript(実際には複数のインスタンス)が付いている可能性があることも考慮する必要があります。

あなたがprivate AnotherScript anotherScript;を書くとき、あなただけのAnotherScriptインスタンスへの参照を宣言し、これはどのGameObjectから任意のAnotherScriptインスタンスを参照することができます。

Awake機能でGetComponentを使用することにより、あなたはを参照したい場合、正確に指定し、これは言うことです:UsingOtherComponentsの現在のインスタンスが接続されている同じGameObjectに取り付けられた第1の1。

+0

ありがとうございます。それが理にかなっています。 –

1

あなたがドキュメントに目を通す場合は、MonoBehaviourコンストラクタは、スクリプト内で提示することができますが、それはまた、多くの制約を持っていることがわかります。たとえば、その中にパラメータを持つことはできません。また、インスペクタを介してコンポーネントのパラメータを設定する機能を持つことも非常に便利です。これは、ゲームオブジェクトの動作を変更するためにコードを変更する必要がないため、非プログラマが行うときに特に便利です。

ユニティがスクリプトのコンストラクタと非常に複雑な関係を持っている理由は、ユニティ自身とメモリの管理が行われているため、ユニティがメモリ上で(レンダリング、サウンドなど) c#ガーベッジコレクタによって。ゲームオブジェクトが実際にシーン上に作成されたり、メモリオブジェクトがメモリから削除される前にコンポーネントを作成している間に発生する可能性のあるトラブルを避けるために、コンストラクタとデストラクタの制限があります。この機能は、Start()Awake()Destroy()のような一元的な方法を実装することによって、Unity内に隠されています。

最後に、Unity(非モノラル継承)の純粋なC#クラスで作業する場合、このメモリ管理の問題がないため、希望どおりにコンストラクタを使用できます。また、独自のfuctionalityがMonoBehaviour機能を持つ必要がない場合(それらを他のゲームオブジェクトに接続したくない場合)、純粋なC#クラスを使用することがより好ましいでしょう。

+0

あなたの答えをありがとう。 –

関連する問題