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つしかないことに注意してください。そうしないと、物事が台無しになります。
または、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シングルトンマネージャークラスを確認する必要があります
もし私があなたなら、この速度変数を「静的パブリック」にして、どこからでもアクセスできるようにします。「find.anything」などの関数は常に避ける必要があります。これらは非常に低速です。あなたがそれがどこにあるかを正確に知っている何かを探す理由はありません。
それが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
...
other.GetComponent<class name>().object name;