2011年8月17日水曜日

Unityのスクリプトの基本

Unityを触ってちょっとずつ理解したこと8

Unityで何をするにしてもScriptが必要なわけだけれども、その基本形は以下の5つの関数から成り立っている。

初期化系
Awake()
Start()

アップデート系
Update()
FixedUpdate()
LateUpdate()

Awake()とStart()の違い
Awake()はゲーム開始前に呼ばれるので、ゲームの状態や値を初期化するために使った方がよい。どのオブジェクトのAwake()から順番に呼ばれるかはランダムだが、どのオブジェクトのStart()よりも前に呼び出される。従って、Awake()から他のオブジェクトの状態を参照するような処理はしない方がよい。そうした処理はStart()に任せるべき。

LateUpdate()の特徴
全てのオブジェクトのUpdate()が呼び出された後に呼び出される。LateUpdate()は例えば、追跡カメラの処理と相性が良い。Update()で全てのオブジェクトの移動処理が終わった後で、追跡カメラの座標を決められるから。

Update()とFixedUpdate()の違い
Update()は毎フレーム呼び出されるが、FixedUpdate()は指定されたフレーム毎に呼び出される。この特性から、FixedUpdate()は特にRigidbody(剛体)に対する処理、新しく力を加えるなど、に向いている。(毎フレーム処理をするのにはRigidbodyが向いていないから?)

スマートフォン(iPhone)向けUnityサンプルだけどAndroidでも可?

Unityを触ってちょっとずつ理解したこと7

Unityの公式ページにはいくつもののサンプルプロジェクトがあって、その中にはiPhone向けのプロジェクトファイルがあるが、これはAndroid向けにもBuild可能だった。少なくとも、StarTrooperは。
http://unity3d.com/support/resources/example-projects/iphone-examples

StarTrooperは加速度センサーで飛行機を傾けることができて、画面をタッチするとミサイルを発射するようになっている。

Scriptを見てみると、Input.accelerationというVector3型のオブジェクトにアクセスすることで、傾きによる変更が必要なScriptでこの値を参照すれば、Androidでも傾きによるキャラクター操作が可能になる。
また、Input.GetMouseButtonDown(0)で画面がタッチされたかどうかを確かめることができた。

下の画像はサンプルの飛行機の小要素として自分で適当に作ったキャラクターの3Dオブジェクトを配置してみた図。理由はわからないけれども、今回は.blendファイルをAssetsファイル下に置くだけで、直接Unityが.blendファイルがプレハブ化してくれた。どうも、その辺は不安定らしい。




Blenderで作成したデータをUnityにインポートする

Unityを触ってちょっとずつ理解したこと6

BlenderのモデルをUnityにインポートする ・・・

Unityは無料の3DCGソフトBlenderからも3Dデータをインポートすることができます。

最初の方法が、.blendファイルをUnityプロジェクト内部のAssetsフォルダに配置する方法。Assetsフォルダに配置した入るはプロジェクトビューに表示されるので、.blendファイルを選択すると、FBXインポーターがインスペクタビューに表示されるので、FBXに.blendファイルを変換することで、Unityで表示することが可能になる。
ただし、このインポートは制限が多いので、うまくインポートしにくい。

次の方法が、Blenderで先にFBXファイルをエクスポートしてから、FBXファイルをAssetsフォルダに配置する方法。こっちの方法の方がきちんとデータがインポートしやすいので、推奨らしい。










Unityのビルド方法 & Android向けビルドの方法

Unityを触ってちょっとずつ理解したこと5

Unityでゲームをビルドする基本 ・・・
これもドラッグ&ドロップで行ける。「Scenes In Build」の中にビルドを行いたいシーンをドラッグ&ドロップして追加するだけ、後は生成したアプリケーションを動かしたいプラットフォームを選択して、Buildボタンを押すだけ。

Android向けにビルドする場合 ・・・
いくつかの設定が必要なので、Player Settingsボタンを押して、インスペクタビューでAndroid用の設定を編集します。まず必要なのが、アイコン画像の選択とパッケージ名の指定です。
他にもAPIレベルの指定や使用するOpenGLのバージョンの指定、キーストアファイルの作成なんかもできます。





Unityのプロジェクトの基本的な構造

Unityを触ってちょっとずつ理解したこと4

ぱっと見だとちょっとわかりにくい気がするUnityのゲーム作りの流れ ・・・

最初にUnityのプロジェクトを作成しても、いまいちそこからどうゲーム作りにつながっていくのか、わかりにくかったのでUnityプロジェクトのごくごく基本的な構造はこんな感じ。(理解に誤謬があったとしても当方は一切関知いたしません悪しからず(^^;・・・)

1, Unityプロジェクトはシーンの集合 ・・・ ゲームにはメニュー画面、ゲーム画面と様々な画面があるけれども、Unityではそれらはシーンという1つの単位で扱われる。これまでに挙げたUnityの編集画面もすべてシーンの編集を行っている画面ということになる。

2, シーンの中身は階層構造 ・・・シーンの中は階層構造になっている。 構造は千差万別だけれども、基本的にはこんな感じ(?)で。なので、これまでに挙げた画像のヒエラルキビューは現在編集中のシーンの階層構造ということになる。

3, シーンとシーンをつなぐ ・・・ シーン(メニュー画面)とシーン(ゲーム画面)がそれぞれ独立していては、まったくゲームにならないので、スクリプトを使って、シーンとシーンをつなげます。基本的なパターンとしては、特定のボタンが押されたときに、Application.LoadLevel("シーン名");を呼んで、新しいシーンをロードします







プレハブの作り方

Unityを触ってちょっとずつ理解したこと3

プレハブの作り方 ・・・
プロジェクトビューで右クリック、Prefabと選択すると、空のプレハブが作られる。
ヒエラルキビューで編集したオブジェクトを空のプレハブに向かって、ドラッグ&ドロップ。
プレハブの作り方はこれでOK





Unityのプレハブとは

Unityを触ってちょっとずつ理解したこと2

プレハブ(Prefab)ってなんぞ? ・・・
Unityを触るとすぐさま出てくる単語の一つプレハブ。プレハブっていうと掘っ立て小屋のことしかイメージにないけど、それはだいたい正しい、、、かも。

3Dでキャラクターを動かすためには数多くのデータが必要になる。3Dの座標データ、3Dキャラクターを動かすための骨データ、3Dキャラクターの表面に張りつけるテクスチャ画像、3Dキャラクターを制御するスクリプトなどなど。プレハブはそれらを一まとめにしたもの。

例えば、3Dクリボーを作ろうと思ったら、3Dクリボーの座標データ、3Dクリボーの骨・アニメーションデータ、3Dクリボーのスクリプトなどが必要になるので、それらを1箇所にまとめて3Dクリボープレハブとして扱うことができる。

作ったプレハブはSceneビューやヒエラルキビューにドラッグ&ドロップして実際に配置することができる。プレハブ内部の属性をインスペクタビューで編集すると、編集した影響は配置したすべてのオブジェクトに及ぶので、ひとつひとつ編集する手間を省くことができる。

逆に、実際に配置したオブジェクト内部の属性を編集すると、プレハブとのリンクが外れて、今後プレハブの編集の影響が及ばなくなるので注意。(配置したオブジェクトを編集しようとすると、プレハブとのリンクが切れますよってダイアログが出てくる)