web-dev-qa-db-ja.com

Unityで、あるスクリプトから別のスクリプトに値を渡すにはどうすればよいですか?

Unityでは、1つのオブジェクトに、他のすべてのオブジェクトがアクセスできる下降速度変数が必要です。さまざまな理由から、私がやろうとしていることに組み込みの重力を使用することはできません。

あるオブジェクトの変数に繰り返しアクセスして、更新時に別のオブジェクトから更新された変数を取得するにはどうすればよいですか?

19
Dakeyras

これを実現するにはいくつかの方法があります。

GameObject MyObjectにアタッチされているコンポーネントによって速度変数を制御したい場合

public class SpeedController : MonoBehaviour
    public float speed;
    // maybe you want restrict this to have read access, then you should use a property instead

他のクラスでは次のことができます。

GameObject go = GameObject.Find ("MyObject");
SpeedController speedController = go.GetComponent <SpeedController> ();
float courrentSpeed = speedController.speed;

MyObjectという名前のオブジェクトが1つだけあることに注意してください。

または、SpeedControllerへのアクセスが必要なすべてのクラスでspeedメンバーを定義し、Unityエディターでドラッグアンドドロップを使用して参照を設定できます。その後、ルックアップを保存しますが、多くのクラスで必要な場合、これはもちろん非常に不便です。


別の方法は、speed変数を保持し、次の要素を持つシングルトンを作成することです。

public class MyGlobalSpeedController {
    private static MyGlobalSpeedController instance = null;
    public static MyGlobalSpeedController SharedInstance {
        get {
            if (instance == null) {
                instance = new MyGlobalSpeedController ();
            }
            return instance;
        }
    }
    public float speed;
}   

したがって、すべてのクラスがこれにアクセスできます。

float currentSpeed = MyGlobalSpeedController.SharedInstance.speed

Jan Dvorakがコメントセクションで述べたように:

public class SpeedController : MonoBehaviour
    public static float speed;

[更新]Jerdakに感謝します。はい Component.SendMessage はリストに間違いなくあるはずです:

go.SendMessage("GetFallingSpeed");

繰り返しますが、最初のソリューションで説明したようなgoへの参照が必要です。

この問題にはさらに多くの解決策があります。すべてのシーンでアクティブなゲームオブジェクトを考えている場合は、 nity singleton manager classes をご覧ください。

26
Kay

私があなただったら、この速度変数を「静的公開」にして、どこからでもアクセスできるようにします。 「find.anything」などの機能は常に避ける必要がありますが、かなり遅いです。どこにあるかを正確に知っている何かを探す必要はありません。

4
Furjoza

fixedUpdateにある場合– Martin j

アウェイクでもうまくいくようです。両方のスクリプトが同じGameObjectに追加されます。

public class FirstScript : MonoBehaviour {
    protected internal GameObject myobject;
private void Awake() {
       myobject = (GameObject)Instantiate(Resources.Load("nameofprefab"));
       myobject.transform.parent = gameObject.transform;
...
public class SecondScript : MonoBehaviour {
    private GameObject myobject;
private void Awake() {
       myobject = gameObject.GetComponent<FirstScript>().myobject;
       myobject.SetActive(false); //for example
...       
2
NBAH79
other.GetComponent<class name>().object name;
0
Martin j