本日のエンジニアブログを担当する安藤です。
今回は前回に引き続きUnity初心者第一の壁であるAngryBotsを紐解いていこうと思います。
AngryBotsを実行して一番最初に目につくのは、はやり動くキャラクターだと思います。
主人公を少し解体してみましょう。
Playerゲームオブジェクトの内訳です。分かってしまえばどうという事はありません。
HitSoundとDeadSoundというゲームオブジェクトを除けば、3Dポリゴンと音の設定をするゲームオブジェクトになります。
大雑把に言えばPlayerゲームオブジェクトの中には「絵と音」が入っているだけということになります。
これら「絵と音」を制御しているのがUnityScriptになります。
PlayerのScriptの解説に入る前にUnityプログラミング基礎を少しだけ説明します。
まずはScriptの種類です。UnityはBoo、UnityScript(JavaScript)、C#の3言語をサポートしており、 それぞれ一定の互換性を保ちコード間で呼び出す事が出来ます。
個人的なおすすめはC#ですが、馴染みのある言語を選択すれば良いのかと思います。
実行速度は最終的にCILという共有のバイトコードに変換されるので速度差はほとんど出ないと言われております。
「UnityScriptのこれさえ覚えれば大体のことは出来る」リストを作ってみました。
① スクリプト作成と実行
② メッセージイベント
③ public variableとInspector
④ transformと階層
⑤ AddComponentとGetComponent
① スクリプト作成と実行
[Projectの中で右クリック]→[Create]→[C# Script]
で新規スクリプトを作成します。(今回はC#を選択します)
作成したスクリプトはゲームオブジェクトに追加することで実行可能状態に出来ます。
② メッセージイベント
Scriptの関数の中にはUnityから呼び出されるイベント関数があります。
Unity側から呼び出されるイベント関数群例
・Awake:Scriptが生成された直後に一度呼ばれる。Startの前に必ず呼ばれる。
・Start:Updateの前に一度呼ばれる。
・Update:毎フレーム呼び出される。
・OnDestroy:オブジェクトの破壊時に呼ばれる。ここで言うオブジェクトはスクリプトも含まれる。
詳しくはユーザーマニュアルを参照ください。
プログラム例(C#)
using UnityEngine; using System.Collections; public class NewBehaviourScript : MonoBehaviour { public float deadTime=0; // 生成時(Startの前)に呼ばれる void Awake () { deadTime=1; Debug.Log("Awake dead time:"+deadTime); } // Updateの前に呼ばれる void Start () { deadTime=2; Debug.Log("Start dead time:"+deadTime); } // 毎フレーム更新する void Update () { if(deadTime<=0){ Destroy(this);// 自分(NewBehaviourScript)を破棄する } deadTime-=Time.deltaTime; } // オブジェクト(スクリプト含む)破棄のときに呼ばれる void OnDestroy () { Debug.Log("dead!!"); } // 誰も参照してないので呼ばれない private void hogehoge(){ Debug.Log("hogehoge"); } }
③ public variableとInspector
スクリプト内でpublicにした型はInspectorに表示されます。
またゲームオブジェクトで設定した値が初期化値に使われます。
public float deadTime=0;
クラスや構造体は[System.Serializable]をつければ表示させる事ができます。
[System.Serializable] public class hogehoge{ public float hoge=0; }
④ transformと階層
UnityではTransformオブジェクトがゲームオブジェクト間の階層を実現しています。
自分の階層に他のゲームオブジェクト追加
otherTransform.parent = this.transform;
ゲームオブジェクト名で一階層下の子を取得
Transform t = this.transform.FindChild("object name");
forで一階層下の子を取得
for(int i=0;i<this.transform.childCount;i++){ Debug.Log(this.transform.GetChild(i).name); }
foreachで一階層下の子を取得
foreach(Transform trans1 in this.transform){ Debug.Log(trans1.name); }
Hierarchy(シーンに出ている全てのゲームオブジェクト)から取得
GameObject obj = GameObject.Find("object name");
Transfromから移動/回転/拡大縮小処理をすることができます。
移動
this.transform.position = new Vector3(0,1,0);
回転
this.transform.localRotation = Quaternion.Euler(new Vector3(0,45,0));
拡大縮小
this.transform.localScale = new Vector3(2,2,2);
移動処理に関しては様々な方法があるので別の機会で説明させていただきます。
⑤ AddComponentとGetComponent
AddComponentとGetComponentはスクリプト間の連携にかかせない機能です。
スクリプトを追加
this.AddComponent<OtherScript>();
スクリプトの削除
Destroy(script);
自分自身ならthisで削除
Destroy(this);
ゲームオブジェクトを削除
Destroy(this.gameObject);
ゲームオブジェクトからスクリプトを取得
OtherScript script = this.GetComponent<OtherScript>();
上記の複数取得版
OtherScript[] scripts = this.GetComponents<OtherScript>();
現在の階層から全ての子階層まで検索してスクリプトを取得
OtherScript script = this.GetComponentInChildren<OtherScript>();
上記の複数取得版
OtherScript[] scripts = this.GetComponentsInChildren<OtherScript>();
TransformのFindChildと違いGetComponentは全ての子を参照する特性があります。
上記機能を利用すれば複数スクリプトの連携が可能になります。
UnityScriptの詳細は、公式サイトにあるスクリプトリファレンスを参照してください。
以上です。次回はAngryBots主人公のScriptを徹底解剖してみたいと思います。