27

Unityでは、1つのオブジェクトに、他のすべてのオブジェクトがアクセスできる下降速度変数を持たせたいと思います。さまざまな理由で、私がやろうとしていることに作り付けの重力を使用することはできません。

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

4

4 に答える 4

30

これを達成する方法はいくつかあります。

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つしかないことに注意してください。そうしないと、物事が台無しになります。

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


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ここでも、最初のソリューションで説明されているようなものへの参照が必要です。

この問題にはさらに多くの解決策があります。すべてのシーンでアクティブなゲームオブジェクトについて考えている場合は、Unityシングルトンマネージャークラスを確認する必要があります

于 2012-12-15T14:00:14.737 に答える
4

もし私があなたなら、この速度変数を「静的パブリック」にして、どこからでもアクセスできるようにします。「find.anything」などの関数は常に避ける必要があります。これらは非常に低速です。あなたがそれがどこにあるかを正確に知っている何かを探す理由はありません。

于 2015-03-16T14:24:56.180 に答える
2

それがfixedUpdateにある場合– Martin j

Awakeでもうまく機能しているようです。両方のスクリプトが同じ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
...       
于 2019-02-23T13:11:12.513 に答える
0
other.GetComponent<class name>().object name;
于 2016-08-31T08:26:44.310 に答える