TASOGARE GAMES BLOG

タソガレゲイムス :: 神奈川県でゲームを開発する人々のブログです。

ゲームオブジェクトひとつだけで作るアナログ時計

Unityは素晴らしいゲーム開発環境です。強みはなんといっても、ほとんどプログラム書かずともそこそこのゲームを作れてしまうことです。
しかし悲しいことに、一部のプログラマーにとってはGUI操作はむしろ障壁でした。

「プログラムだけでUnityアプリケーションを作成できたらなんと素晴らしいことか……。」(本末転倒)

そんな悲しいサガを背負ったプログラマーのために、Unity公式チュートリアル「SIMPLE CLOCK」C#だけで作ってみます。

定義

ここで言う「ゲームオブジェクトはひとつだけ」とは、

  • シーンビューにオブジェクトを一切配置しない
  • インスペクターもいじらない
  • ヒエラルキースクリプトを追加した空のゲームオブジェクトを一つ置くだけ

です。画像で説明するとこんな感じ。

f:id:tasogare_games:20150422001750p:plain

まっさらですね。
で、これを実行すると、こうなります。

f:id:tasogare_games:20150422001905p:plain

実行時だけシーン(とヒエラルキー)にオブジェクトが追加されてる! 不思議!

サンプルコード

さて、これを実現しているソースコードはこちら

解説:ゲームオブジェクトの生成とシーンへの追加

Unityにおいて、空のゲームオブジェクトをシーンに追加するには以下のように書きます。

var obj = new GameObject();

そう、newするだけでいいんです。
GameObject型は生成と同時にシーンへの追加が行われます。

そして、空でないゲームオブジェクトを作成したいときは、同時にAddComponentしてあげればよいです。
一行で済むうえに、ジェネリックを使えるのでキャストも必要なく、とてもスマートに書けます。

var cam = new GameObject().AddComponent<Camera>();
var light = new GameObject().AddComponent<Light>();

スクリプトから生成されたゲームオブジェクトは、デフォルトではヒエラルキー上で「new GameObject」と表示されてダサいので、nameプロパティに識別しやすい名前を指定してあげると良いと思います。

var obj = new GameObject();
obj.name = "識別しやすい名前";

なお、プリミティブだけは専用の生成メソッドがあります。
最初から必要なコンポーネントが追加されているので手軽です。

public static GameObject CreatePrimitive(PrimitiveType type)

解説:ゲームオブジェクトを入れ子にする

さて、ここでゲームオブジェクトに別のゲームオブジェクトを入れ子にしたくなってくると思います。
しかしUnityにはaddChildのようなメソッドは用意されていません。

どうすればよいかというと、以下のように子要素のtransform.parentプロパティに親要素のtransformを指定することで入れ子になります。

childObj.transform.parent = parentObj.transform;

以上、アナログ時計を作り方でした。

次の記事

tasogare-games.hatenablog.jp