取引先の若い人たち向けにUnityとC#でドリルをすることにしました。
c#を書けないスタッフ向け、という位置づけからスタートしています。
件のスタッフがUnityを使えるようになることを目標に、私自身の説明能力を高めるために、可能な限り細かく解説していこうと思います。
というわけで今日のお題と、追加仕様や仕様変更という形で応用を問題を用意しています。
第一問
UnityのHierarchy上で以下の状態を作ってください。
- Directional Light - Main Camera - ここに駆動コンポーネントをアタッチします。名前は何でもOK。 - AAA0 - BBB - CCC1 - CCC2 - ... - CCC10 - AAA1 - BBB - CCC1 - CCC2 - ... - CCC10 ... - AAA10 - BBB - CCC1 - CCC2 - ... - CCC10
仕様
- AAAn と名前をつけたGameObjectにBBBが子として、CCCが孫として階層構造を持ちます。
- AAAn CCCn は 1~10 の数字を割り当てます。
- 1つのコンポーネントで上記を行います。
- Unityの再生ボタンを押下して初めて結果がわかるようにします。
必要な知識
- オブジェクトを new することを理解する必要があります。
- for文、while文のいずれかを理解する必要があります。
- GameObject の APIからnameプロパティの使い方を理解する必要があります。
- Transform の API を理解し、親子構造を理解する必要があります。
- ブロックとスコープの概念を理解する必要があります。
ヒント
解説
答えのソースコードはいずれアップしますが、大凡以下の解説を読めば動く形にはなるはずです。
AAAを10個名前付きで生成する
10回繰り返す処理はfor文やwhile文で対応できるかと思います。
GameObject を new するとは、
new GameObject();
と記述することで新規作成を行います。
new 演算子 と クラス名() と記述することでクラスからインスタンスを生成します。
このままでは生成するだけで、名前の変更や親子関係を変更することができないので、参照を保持しておく必要があります。
GameObject gameobjectReference = new GameObject();
と記載することで、gameobjectReference 識別子には、新たに生成されたGameObjectのインスタンスの参照を保持することができます。
gameobjectReference の識別子はわかりやすい命名さえしておけば自由に記述することができます。
自由と入っても、予約語だったりc#の文法上で意味を持つ記号はダメです。
– ++C++; // 未確認飛行C::キーワード(予約語)一覧
gameobjectReferenceに対して、ドット演算子を使ってメンバにアクセスを行います。
gameobjectReference.name = "new name";
GameObjectのnameメンバーは文字列型です。
この辺はヒントに記載したGameObjectのドキュメントで確認してください。
名前に数字を入れることになりますが、for文で使用しているカウンタがintなので、これをstringに変換して代入してあげれば目的を達成できます。
for( int i = 0; i < 10; i ++ ){ GameObject gameobjectReference = new GameObject(); gameobjectReference.name = "AAA" + i; }
“AAA” + i で AAA0 ~ AAA9 の名前が割り当てられつつ、gameobjectReferenceを10個生成されるようになりました。
BBB を生成し、親子付けを行う
親子付けを行うにあたって、TransformのAPIを叩く必要があります。
GameObjectのドキュメントをよく参照していれば、GameObjectのメンバにtransformがあることに気づくはずです。
メンバのtransformはTransform型です。大文字小文字を書き分けています。それぞれ意味があります。
小文字の方はメンバです。GameObjectのインスタンスには必ずついています。
Transformは型です。クラスなのでInstanceではありません。
とはいえ、今回アクセスする gameobjectReference というGameObject型のインスタンスのメンバであるtransformは、インスタンスです。
transformに親子付けのためのメソッドがあります。
var bbbObjReference = new GameObject("BBB"); bbbObjReference.transform.SetParent( gameobjectReference.transform );
これで親子付けができました。
ブロック内のブロック
for文の中にfor文を記述することで、孫を量産できます。
for(int i = 0; i < 10; i++ ){// AAAは0~9の数値が名前の末尾に付く // 名前を付けて宣言 var gameobjectReference = new GameObject("AAA" + i ); var bbbObjReference = new GameObject("BBB"); // 親子付け gameobjectReference.transform.SetParent(bbbObjReference.transform); for( int j = 1; j <= 10; j++){// CCCは1~10が名前の末尾に付く bbbObjReference.transform.SetParent( new GameObject("CCC" + j).transform ); } }
とすることで完成です。これをStartメソッド内に配置して再生ボタンを押下してみましょう。
第二問(応用)
第一問を応用して次の仕様を追加してください。
仕様
- BBBを毎フレームY軸で1度の回転するようにしてください。
- Updateを使います。
ヒント
- 全部のBBBオブジェクトを保持するために配列やListを使います。
第三問(昇華)
第二問をベースにして次の仕様を追加してください。
仕様
- BBBを空のゲームオブジェクトではなくてCubeを出力してください。
- Cubeの色を青〜赤へ一秒かけて変化するようにしてください。
- 青くなったら赤へ一秒かけて変化するようにしてください
ヒント
- CubeはRendererコンポーネントを持っています。
- Rendererはmaterialというメンバがいます。
- materialにはcolorというメンバがいます。
- Color構造体にはLerp関数という便利なメソッドがあります。
第四問(昇天)
第三問の内容をUpdateを使わずStartだけで行ってください。