Unityでは、1つのオブジェクトに、他のすべてのオブジェクトがアクセスできる下降速度変数が必要です。さまざまな理由から、私がやろうとしていることに組み込みの重力を使用することはできません。
あるオブジェクトの変数に繰り返しアクセスして、更新時に別のオブジェクトから更新された変数を取得するにはどうすればよいですか?
これを実現するにはいくつかの方法があります。
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 をご覧ください。
私があなただったら、この速度変数を「静的公開」にして、どこからでもアクセスできるようにします。 「find.anything」などの機能は常に避ける必要がありますが、かなり遅いです。どこにあるかを正確に知っている何かを探す必要はありません。
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
...
other.GetComponent<class name>().object name;