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

サポートサイト http://unity-yb.github.io/


[話者] の本でUnityを学ぶ。ただしこの本は

という動作環境の説明になっていて、現在の主流の

  • Unity 4.x
  • C#

の環境とズレがある。
そこで、その差を埋めながら学ぶのをこのブログに記録しておくぞ。

[合いの手] ネットではver3の本は今となっては役に立たないぞとか言われてるけど、そうなの?


[話者] そんなことはないぞ。後述するけどパーティクルもアニメーションも旧システムが残されてるから、それを選べば、この本はそのまま実行できる。

さて http://unity3d.com/unity/download/archive で無料版Unityを取得する。

環境

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 バランスゲーム

f:id:itouhiro:20130930235222p:plain

[話者] 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#に書き換えるのは、この章では以下だけだ。

  1. Vector3(0,0,1)new Vector3(0,0,1)
  2. 小数点のある数字 30.0 はfをつける → 30.0f


[合いの手] この章はスクリプト2行しか書かないからね。


[話者] 他にもJSでfunction Update()C#void Update() も違うけど、これは最初から入力されて用意されてるから問題じゃないだろ。



Chapter 3 モバイル向けにビルド


Chapter2で作ったサンプルを、モバイル向けに再設計している。ソースコードを2行書き換えている。
PlayerSettingのBundleIdentifier(バンドル識別子)に「地域コード.開発者名.アプリ名」使うののが一般的らしい。「jp.yamada.BallAndCube」みたいに。


この章はそれだけかな。



Chapter 4 迷路ゲーム

f:id:itouhiro:20131002161230p:plain


あらかじめ説明しとくと、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#は本物と同じだぞ。
JavaScriptC#に書き換えるのは、この章では以下だ。

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-JavaScriptyield WaitForSeconds(2.0);は単にC#yield return new WaitForSeconds(2.0);と書き換えるだけでは動作しないんだよね。以下に詳しく書いてある。今回はInvoke()で置き換えた。


ちなみに、
JSでVector3(0,0,1) のように数値を指定する場合、C#new Vector3(0,0,1) と書くが、JSでVector3.forwardのように既に指定済みの数値を使う場合、C#でもVector3.forwardでよい。

この要領で、ほかも書き換えればいい。


[合いの手] 今回はJavaScriptC#の書き換え箇所も多めだね。


[話者] でもyieldを除けば、機械的な書き換えですむから難しくないよ。


Unity3とUnity4の違いだが、フォント関連に違いがある。

「Unity3.4ではモバイルでダイナミックフォントが使えない」とこの本に書いてあるが、Unity4.0以降はモバイルでもダイナミックフォント使えるようになってる。だからデスクトップ(Windows/Mac)の設定のままで、モバイル(Android/iPhone)でも文字表示できるぞ。

f:id:itouhiro:20131002190510p:plain


あと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;

f:id:itouhiro:20131005215057j:plain