nirasan's tech blog

趣味や仕事の覚え書きです。Linux, Perl, PHP, Ruby, Javascript, Android, Cocos2d-x, Unity などに興味があります。

ドットインストールの「Unity入門」でUnityに入門してみる

はじめに

http://dotinstall.com/lessons/basic_unity の勉強メモ

Unityのインストール

  • ダウンロード
  • インストール
  • 起動

プロジェクトの作成

  • [File] > [New Project]
  • [Set] で新しいプロジェクト用のディレクトリを(作成して)指定
  • [Create Project] で作成
    • デフォルトで立ち上がっているプロジェクト「AngryBots.unity」を保存するか聞かれるので [Don't Save]

構成要素説明

  • Scene: 画面 / ウィンドウの"Scene"に表示
  • GameObject: 画面上のもの / プレイヤー、敵、背景など / ウィンドウの"Hierarkey"に
  • Component: GameObjectの位置や属性や振る舞いなどの要素 / "Hierarkey"で選択したGameObjectのものが"Inspector"に表示
  • Assets: 画像や3Dモデルなどの共通部品 / "Project"の"Assets"に表示

シーンの保存

  • [File] > [Save Scene]

GameObjectの作成

  • "Hierarkey"の"Create"から種類を指定して作成
  • 立方体の"Cube"を作成

視点の移動

  • 画面左上の手のひらアイコンで"Scene"上の視点の移動
    • 左上のアイコンは手のひらから順にショートカットキーの q / w / e / r に対応
  • ドラッグで平面の移動
  • option + ドラッグで角度の移動
  • 二本指スワイプ上下でズームインズームアウト
  • Scene右上の立方体と円錐6つのアイコンでも切り替え可能
    • x, y, z に対応する円錐をクリックで、その軸からの視点に切り替え
    • 立方体をクリックで、遠近法のon/off
    • shift + クリックで、いい感じに斜め上からの視点に切り替え、よくわかんなくなったらこれ

GameObjectの移動

  • 十字矢印アイコン(ショートカットキー:w)でGameObjectの移動
  • x, y, z 軸をドラッグで、軸にそって平行移動
  • 真ん中をドラッグで任意の移動

GameObjectの回転

  • 円型矢印アイコン(ショートカットキー:e)でGameObjectの回転
  • 移動と同じ要領で、軸にそった回転と、任意の回転

GameObjectの拡大縮小

  • 一番右のアイコン(ショートカットキー:r)でGameObjectの拡大縮小
  • 移動と同じ要領で、軸にそった拡大縮小と、任意の拡大縮小

位置情報コンポーネント Transform を使う

  • "Hierarkey"の"Cube"選択で、"Inspector"に"Cube"にひもづく"Component"が表示される
  • "Transform"が位置情報のComponentなので、ここからもGameObjectの位置を変更できる
  • わからなくなったら、Position を 0, 0, 0 で、Rotation を 0, 0, 0 で、Scale を 1, 1, 1 にすると、とりあえず真ん中に来る
  • x, y, z などのラベルは、ドラッグするとスライダー的に数値の変更ができる
  • カメラを中央に持ってきて、移動して回転して、Cubeを映してみる、カメラの映像はSceneの右下にプレビューが出る
  • 現在のSceneで表示している視点に、カメラの位置と角度を合わせたい場合は、Hierarkeyからカメラを選択して、メニューから [GameObject] > [Align With View] を選択する

色情報コンポーネント Material を使う

  • Assets を右クリック、[Create] > [Material] で新規の Material Component の作成
  • 名前を Floor に変更
  • Inspector から Main Color で色を選択して変更
  • Floor コンポーネントを、Hierarkey の Cube にドラッグアンドドロップで、Component の割当
  • Hierarkey の Cube を Floor という名前に変更
  • Floor オブジェクトの Transform コンポーネントの Scale を 10, 1, 10 とかにして床っぽくする
  • Floor コンポーネントに画像を貼付ける
    • Assets に画像を追加
    • Floor の Inspector の None(Texture) と書いてあるボックスに、画像をドラッグアンドドロップ
    • Tiling で縦横の貼付ける枚数を指定

物理エンジン情報コンポーネント Rigidbody を使う

  • 球体を作って床の上に落とす
  • Hierarkey に球体の GameObject、Sphere を追加
  • 名前を Ball に
  • Position を 0, 10, 0 にして、床の真上に
  • Inspector の Add Component から、Rigidbody コンポーネントを追加して、物理特性を付与
    • [Add Component] > [Physics] > [Rigidbody]
  • Mass が重量、100 に
  • Use Gravity が重力の影響を受けるかどうか
  • 画面上部中央の再生ボタンをクリックで、ボールが床に落ちる、もう一度再生ボタンをクリックで終了
  • ボールがはねるようにするには、Physics Material を作成して、Ball オブジェクトに割り当てる必要がある
  • Assets 右クリックで [Create] > [Physics Material] で作成し、名前を BallMaterial にする
  • Inspector の Bounciness を 0.9 にすると弾性がつく

Directional Light を使う

  • Hierarkey > Create > Directional Light で、全方位的に太陽みたいに照らすライトを作成
  • 再生モードに入るとライトに照らされて色が出ているのがわかる
  • 再生モード中もオブジェクトの移動などができるが、このときにした変更は、再生モード終了時に破棄されるので注意
  • 再生モード中のウィンドウ色は [Unity] > [Preference] の [Colors] から、Playmode tint のカラーパレットで変更可能。ここで灰色からピンクとかにすると再生モード中だとわかりやすいというが、目が痛い

GameObjectの階層

  • HierarkeyでGameObjectを別のGameObjectにドラッグアンドドロップすると親子にできる
  • 親子のオブジェクトは同時に移動、回転する
  • 親子でなく並列にしたい場合は、[GameObject] > [Create Empty] で空のオブジェクトを作って、そこに入れる

Prefab を使う

  • GameObjectをHierarkeyからAssetsにドラッグアンドドロップすると、使い回しのできる部品になる。これをPrefabという
  • PrefabをSceneにドラッグアンドドロップすると、コピーがシーン上に作られる
  • Prefabへの変更(Componentの追加など)は、シーン上のコピーすべてに反映される

Script の追加

はじめての Script

  • Script Component の Inspector から open でエディタを開く
  • Start は起動時の処理、Update はゲームループ中の処理
  • 変数宣言は var x : int = 5;
  • グローバル変数は Inspector から初期値の変更が可能
  • ログは Debug.Log() で表示
  • 最新のログは左下に出る / ログコンソールは [Window] > [Console] で出現

ユーザー入力を受け付ける

  • Input.GetButtonUp("Jump") が真ならスペース押下
  • "Jump" が space キーになっているのは、[Edit] > [Project Setting] > [Input] の [Positive Button] で確認できる
  • var x : int = Input.GetAxis("Horizontal"); transform.Transelate(x * 0.2, 0, 0); で左右キー入力でオブジェクトの移動。
    • Horizontal に左右キーが割り当てられている
    • transform.Translate() でオブジェクトの移動

衝突判定をする

  • RigidbodyのConstrainsは位置と回転の固定
    • 回転なしで、x軸しか動かない場合は Freeze Position の y, z と Freeze Rotation の x, y, z にチェックを入れる
  • 衝突判定には Rigidbody を割り当てたオブジェクトのスクリプトで OnCollisionEnter() を定義する
    • 引数で obj : Collision を受け取れ、obj.gameObject.name で衝突相手の GameObject の名前がとれる

動的に GameObject を作成する

  • 生成する Prefab 用の変数として var ball : Transform; をグローバルに宣言
  • スペース押下でオブジェクトを生成するコード if (Input.OnButtonUp("Jump")) { Instantiate(ball, transform.position, transform.rotation ); }
  • 空の Ballbox オブジェクトと、Sphere の Prefab の Ball を用意
  • Ballbox にスペース押下でオブジェクトを生成するスクリプトを割当、スクリプトコンポーネントの ball に Ball の Prefab を割り当てる

OnGUI を使う

  • スクリプトで function OnGUI () {} にGUIを定義できる
  • GUI.Label(Rect(10, 10, 200, 50), "Game Over", style); で文字の表示
  • style の部分はグローバル変数で var style : GUIStyle; と定義しておくと、Inspector から文字色やフォントの大きさを設定できる

別のシーンを呼び出す

  • Application.LoadLevel("GameOver"); でシーンの遷移ができる
  • シーンの遷移が発生する場合は、[File] > [Build Settings] で使用するシーンをすべて登録する必要がある

ゲームを書き出す

  • [File] > [Build Settings] でシーンの並びを Main, GameOver にして、Platform を PC で、[Build And Run]
  • 画面サイズを 640 x 480 にして、Windowed にチェックをして [Play!] で実行できる

さいごに

  • 以上で #20 までの内容
  • #21 - #26 はこれまでのものを使ってミニゲームを作る内容なので割愛
  • Unity をインストールして立ち上げると、いきなりサンプルの3Dゲームが立ち上がるので何やったらいいかわからない感が半端ないんですが、入門をひととおりやってみて、さわるのが怖くなくなったのがよかったと思いました。作成者の百式管理人さんありがとうございました。