スパイダーマン風Oculusを作る中でUnityの使い方関連で色々ひっかかってます。Unity初心者なので英語から日本語からサイトを調べまくり、ようやく少しわかってきました。
せっかくなので、ネットで調べても簡単に出てこなかった内容を書いておきます。なお、記述は全部C#です。
- 1. ObjectAにアタッチされたスクリプトAが、ObjectAのコンポーネントを参照するときの記述方法
- 2. オブジェクトに物理運動をさせる方法
- 3. ObjectAにアタッチしたscriptAに書かれたFuncA関数を、scriptBのFuncB関数から呼ぶ方法
- 4. ソースコードを読みやすくする方法
1. ObjectAにアタッチされたスクリプトAが、ObjectAのコンポーネントを参照するときの記述方法
this.gameObject.
(使用例)
void FixedUpdate(){ if(rigidBodyEnabled == true){ this.gameObject.rigidbody.AddForce(moveDistance,ForceMode.Force); } }
2. オブジェクトに物理運動をさせる方法
オブジェクトに rigidBodyコンポーネントを付ける
AddForceなどの物理的な動きは必ずFixedUpdateの中に記述する。Update()の中に記述すると、密閉した部屋で空気抵抗なしのスーパーボールを跳ねさせるような不可解な動きをする。
3. ObjectAにアタッチしたscriptAに書かれたFuncA関数を、scriptBのFuncB関数から呼ぶ方法
sendMessageメソッドを使うか、スクリプト名(クラス名)を使ってアクセスする。
使用例1
public GameObject ObjectA; ObjectA.gameObject.SendMessage("FuncA");
使用例2
ScriptA scriptA;
scriptA = GameObject.Find("ObjectA").GetComponent<ScriptA>();
scriptA.FuncA();
いずれの場合であっても、UnityのInspector ViewでObjectAに、"ObjectA"をドラッグ&ドロップする必要があります。
とくに、使用例2を使うと、public宣言した変数を呼ぶこともできるので使い勝手がよさそうです。
例えば、scriptA.csで
public Vector3 testDistance;
とあったとき、scriptBでは
scriptA.testDistance;
と書くことで値を取得できます。
4. ソースコードを読みやすくする方法
#region を使うと、Monoエディタで、任意の範囲を一つに囲うことができるので可読性が向上します。
Oculusのサンプルコードにもいくつか使っていましたが、
#region variable public Vector3 test1; public Vector3 test2; public Vecto3 test3; #endregion
とすることで、test1,test2,test3を一つにまとめることができます。コードが長くなったときは便利だと思います。