C#とUnity4で書籍『Unity入門』(1)

Unity入門 ~高機能ゲームエンジンによるマルチプラットフォーム開発~
- 作者: 高橋啓治郎
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/10/01
- メディア: 大型本
- 購入: 15人 クリック: 609回
- この商品を含むブログ (24件) を見る
の本でUnityを学ぶ。ただしこの本は
- Unity 3.4
- JavaScript
という動作環境の説明になっていて、現在の主流の
- Unity 4.x
- C#
の環境とズレがある。
そこで、その差を埋めながら学ぶのをこのブログに記録しておくぞ。
ネットではver3の本は今となっては役に立たないぞとか言われてるけど、そうなの?
そんなことはないぞ。後述するけどパーティクルもアニメーションも旧システムが残されてるから、それを選べば、この本はそのまま実行できる。
さて http://unity3d.com/unity/download/archive で無料版Unityを取得する。
環境
- Unity 4.2.1
- Windows 7 64bit
Chapter 1 Unityスタートガイド
Unity3.4の後、2013年10月現在はいろいろUnityも変わった。この本の説明との違いを挙げると‥‥
- Unity Android / Unity iPhoneを無料版で使用できる。
- Unity3.5より、パーティクルシステムが新しくなった。Shuriken(シュリケン)と呼ばれる。以前のも使用可能。
- Unity4.0より、アニメーションシステムが新しくなった。Mecanim(メカニム)と呼ばれる。以前のも使用可能。
- Unity4.0より、モバイル版でもダイナミックフォント使用可能になった。
- Unity4.2より、デスクトップ版のみリアルタイムシャドウを無料版で使用できる。
- Unity3.5より、外部バージョン管理システムを無料版で使用できる。Unity4.2ではForceTextも可能。
- Unity3.5でFlash出力(プレビュー版)が有効になり、Unity4.0以降は製品版を購入できたが、Unity4.2の前にFlash出力停止された。
いろいろ無料になってるんだね。
Chapter 2 バランスゲーム
Sceneビューの操作、この本Mac基準に書いてあるので
- 視線旋回
- Altキー+マウスドラッグ
- 視点の平行移動
- Altキー+コマンドキー(WindowsではCtrlキー)+マウスドラッグ
- ズームアップ
- マウスホイール
- オブジェクトに視点合わせ
- [F]キー
とか書いてあるけど、Windowsなら
- 視線旋回
- 右ドラッグ(右クリックしたあと押したままマウス移動)
- 視点の平行移動
- ホイールドラッグ(ホイールをクリックしたあと押したままマウス移動)
で可能だ。‥‥と思ったのだが、「Alt+ドラッグ」と「右ドラッグ」は挙動が違う。
- 「Alt+ドラッグ」は(0,0,0)中心の回転
- 「右ドラッグ」はSceneパネル最下部中央を中心とした回転
板に[Component - Physics - RigidBody]を与えた上で IsKinematic をONにしているが、これRigidBodyを与えない場合でも同じ挙動なんだよな。PhysicMaterialもRigidBodyなくても指定できるし。
Windowsアプリにしたら、いきなり最大化でどう停止するかこまった。Alt+Enterで通常のウィンドウに戻った。
Unity3とUnity4の違いは、この章では現れなかった。
JavaScript(JS)をC#に書き換えるのは、この章では以下だけだ。
Vector3(0,0,1)
をnew Vector3(0,0,1)
に- 小数点のある数字
30.0
はfをつける →30.0f
この章はスクリプト2行しか書かないからね。
他にもJSで
function Update()
→ C#でvoid Update()
も違うけど、これは最初から入力されて用意されてるから問題じゃないだろ。
Chapter 3 モバイル向けにビルド
Chapter2で作ったサンプルを、モバイル向けに再設計している。ソースコードを2行書き換えている。
PlayerSettingのBundleIdentifier(バンドル識別子)に「地域コード.開発者名.アプリ名」使うののが一般的らしい。「jp.yamada.BallAndCube」みたいに。
この章はそれだけかな。
Chapter 4 迷路ゲーム
あらかじめ説明しとくと、UnityのJavaScriptでは
function OnTriggerEnter (other : Collider) { .. }
を
function OnTriggerEnter (other : Collider):void { .. }
と書くこともできる。関数の返り値の型「:void」とか「:int」とかは書いてもいいけど省略できるんだ。ちなみに本物のJavaScriptでは「:void」とか指定するとダメだぞ。“Unityの” JavaScriptは特殊なんだ。
で C#の場合、関数は
void OnTriggerEnter (Collider other) { .. }
のように書く。
- 「function」は要らない
- JavaScriptで「:void」「:Collider」のように書いていた「:」以下の型指定を、関数名・変数名の「前」に書く
これを守ればあとは機械的に書き換えればよい。
UnityのJavaScriptは本物と違うのか‥‥。
そうなのさ。でもC#は本物と同じだぞ。
JavaScriptをC#に書き換えるのは、この章では以下だ。
Trap.js→Trap.cs
function OnTriggerEnter (other : Collider) ↓ void OnTriggerEnter(Collider otherObj) //C#では「function」はいらない。返り値の型を明示。 var respawn : GameObject = GameObject.FindWithTag("Respawn"); ↓ GameObject respawn = GameObject.FindWithTag("Respawn"); または var respawn = GameObject.FindWithTag("Respawn"); //C#では代入文など型を推定できる場合、型を「var」とも書ける。
Goal.js→Goal.cs
var labelStyle : GUIStyle; private var ballCount : int; // public class Goal : MonoBehaviour { .. } の中に書くこと private var counter : int; private var cleared : boolean; ↓ public GUIStyle labelStyle; private int ballCount; private int counter; private bool cleared; ballCount = GameObject.FindGameObjectsWithTag("Ball").length; ↓ ballCount = GameObject.FindGameObjectsWithTag("Ball").Length; var sw : int = Screen.width; var sh : int = Screen.height; GUI.Label(Rect(sw/6, sh/3, sw*2/3, sh/3), "CLEAR !!", labelStyle); ↓ int sw = Screen.width; int sh = Screen.height; GUI.Label(new Rect(sw/6, sh/3, sw*2/3, sh/3), "CLEAR !!", labelStyle); function OnTriggerEnter (otherObj : Collider) { ‥‥ yield WaitForSeconds(2.0); Application.LoadLevel("Title"); ↓ void OnTriggerEnter(Collider otherObj) { ‥‥ Invoke("ChangeSceneToTitle", 2.0f); //Unity-JavascriptのyieldはC#では同じようには使えない void ChangeSceneToTitle() { Application.LoadLevel("Title"); }
こんな感じ。Unity-JavaScriptのyield WaitForSeconds(2.0);
は単にC#でyield return new WaitForSeconds(2.0);
と書き換えるだけでは動作しないんだよね。以下に詳しく書いてある。今回はInvoke()で置き換えた。
- 「Coroutines++ | Unity Gems」 http://unitygems.com/coroutines/
- 「Unity初心者が学ぶ「未来事象の正しい文法」」 http://gamesonytablet.blogspot.jp/2012/12/unity.html
ちなみに、
JSでVector3(0,0,1)
のように数値を指定する場合、C#でnew Vector3(0,0,1)
と書くが、JSでVector3.forward
のように既に指定済みの数値を使う場合、C#でもVector3.forward
でよい。
この要領で、ほかも書き換えればいい。
今回はJavaScript→C#の書き換え箇所も多めだね。
でもyieldを除けば、機械的な書き換えですむから難しくないよ。
Unity3とUnity4の違いだが、フォント関連に違いがある。
「Unity3.4ではモバイルでダイナミックフォントが使えない」とこの本に書いてあるが、Unity4.0以降はモバイルでもダイナミックフォント使えるようになってる。だからデスクトップ(Windows/Mac)の設定のままで、モバイル(Android/iPhone)でも文字表示できるぞ。
あとAndroidの[戻る]ボタンで終了するために、TitleScreen.csとGravityController.csのUpdate()に以下を入れておくとよい。
//PCでESC or Androidで[戻る] if(Input.GetKey(KeyCode.Escape)) Application.Quit();
思ったんだが、これは画面横より縦のほうがいい気がする。縦にする場合、操作方向が変わるので以下の変更が必要だ。
//Physics.gravity = new Vector3(-accel.y, accel.z, accel.x) * 50.0f; Physics.gravity = new Vector3(accel.x, accel.z, accel.y) * 50.0f;