ばかおもちゃ本店:Youtube twitter:@sashimizakana Amazon.co.jpアソシエイト

2014年2月21日金曜日

Unityはじめた講座

まえおき

Unityを使い始めてはや一月ちょい、りつとびとかflappy霊夢とか作った。
そいで多少はUnityにも慣れて、最初にこういうことがよく分からなかったなあ、ということをまとめてみた。メインは調べて出てくる記事で頻出する基本的な単語とかのざっくりした解説(ざっくりとしか理解してない)多め。共通する部分はあるけど、メインで2Dのゲームを作ろうとしているのでそっちよりの内容。まあ読まなくてもしばらくやってれば分かることだけど、軽くでも頭に入れておくと何かとはかどるんじゃないかと思う。

内容

ゲームオブジェクト
ゲーム上に表示されるもの。
Game Object > Create Emptyとかで箱みたいに使ったりする。
表示されてるものはなんでもゲームオブジェクトっぽい。
それ以外のものがあるのかは知らない。

プレファブ(Prefab)
オブジェクトのひな形みたいな感じのもの。
Scene上で作ったゲームオブジェクトをプロジェクトに戻すとプレファブになる。
で、プレファブをまた配置することができるんだけど、これは元のゲームオブジェクトとは違って、プレファブを修正すると一緒に修正される。これが何が嬉しいかってと、敵とか作って動きなんかを変えたときに、一個変えればすべて変わるってこと。
プレファブかどうかは置いた後に上の方見ると、Tagとかの行の下にPrefab用のボタンがあるので分かる。で、何か変更したあとにそこのApplyとか押すと変更が適用される。

タグ
ゲームオブジェクトにつけておいて、検索とかにつかう。

レイヤー
ゲームオブジェクトにつけておいて、階層を管理する。

ソーティングレイヤー
レイヤーと同じ感じなのだけど、こっちは2Dの重なり順の制御に使う。
上のレイヤーは処理上の階層としてまとめたりするけど、こっちはすべてに前後関係がある。

スクリプトについて
・コードエディタで保存しないとUnity側に反映されない(実行しても保存されない)。

・小文字で始まってるのがプロパティ名でそのゲームオブジェクトにあるほかのコンポーネント。つまりrigidbody2dだったらそのゲームオブジェクトの持ってるRigidbody2d。って書くとthisがgameObjectみたいだけどちがう。gameObjectはthis.gameObjectにある。回転とかサイズとかはgameObjectの持つプロパティなのでthis.gameObject.transformとかにある。

・規定の名前のメソッドを作るとそのイベントの発生時に呼ばれる。最初にあるStart(開始時に呼ばれる),Update(更新時(フレーム?)に呼ばれる)もイベント処理のはず。つまりOnCollisionEnter2Dってメソッドを書けば、2Dの衝突発生時に呼ばれる。ちなみにisTriggerを使う場合はOnTriggerEnter2D(ここ気づかないで悩んだ)。
他に、OnGUI(GUI.Buttonとか待ち受けるときに使う)とか、FixedUpdate(物理演算用の一定時間ごとのアップデート)とかある。エディタでメソッド名書くときに補完してほしいなと思う(あるのかもしれない)。

・スクリプトのパブリックプロパティで設定したものはGUI上から設定できるようになる。速度とか、敵の発生間隔とかはもちろん、発生させる敵そのものとかもGUIから設定させられる。
画像はflappy霊夢のスクリプト部分で、Pole(モアイです)の発生間隔とか、発生するPoleのプレファブを指定したり、スコア表示の体裁なんかを指定できるようにしてる。これでやると後から調整が楽だし、チームでやってるなら非プログラマにパラメータの調整を任したりできるかも。

スプライトについて
画像を取り込んで、Sprite ModeのSingleのところをMultipleにすると画像を切り分けできる。自動でも切れるし、手で設定もできる。私は適当に書いててゴミが混じってたりサイズがまちまちだったりして自動でうまく読み込めないので、手で幅を合わせてtrimで空白を削って取り込んでる。
ここで取り込んでも単純にバラの画像になるだけで、いきなりコマアニメになるわけではない。アニメを作るにはAnimatorとAnimationを設定する必要がある。

Animationについて
Animationはどのタイミングでスプライトを差し替えたり、回転させたり、当たり判定をつけたりするのかなど、アニメーションそのもののこと。FlashのタイムラインっぽいWindowでゲームオブジェクトの各コンポーネントの値を変えたりできる。
それで作ったAnimationをどういう条件で、どういうタイミングで表示するとかを決めるのがAnimator。

Animatorについて
上記のとおり、Animationをコントロールするためのコンポーネント。
ステート(状態)を作成して、それぞれにAnimationを設定して、状態の遷移(Transition)を書く。
遷移の条件はAnimatorそのものにintとかfloatとかboolとかの型でプロパティみたいなもんを作って、各状態間の遷移に○○がいくつ以上になったら、とか設定する。
flappy霊夢だと、霊夢の角度が変わるのは、上と真ん中と下のstateがあって加速度の範囲で遷移するようにしている。
そのプロパティはスクリプト側からセットする。
上の例のflappy霊夢だと加速度(velocity)をUpdate内で毎回セットしている。

その他
Game(プレビュー)をScene(編集画面)と一緒に表示したほうが便利

上のはWindow>Layoutsで2by3を選んで並べ替えたもの。
2Dゲーだとカメラ動かさなかったりするので、プレビュー見ながら作業が便利。
下の床どの辺に置くかとか、天井が見えないようにするとか。
デフォルトのままだと一緒に見えないので不便。
 
以上、また何か分かってきたらぽつぽつ書いていきます。