第 3 回 Unity

本日の内容


このドキュメントは http://edu.net.c.dendai.ac.jp/ 上で公開されています。

3-1. Unity の準備

Unity のインストール

Unity エディタのインストールには Unity Hub を使います。 まずは、 Unity Hub をインストールしてください。 ライセンスは個人の無料ライセンスを使用します (他のライセンスを持っている場合は使用を妨げません)。

Unity Editor はバージョンによりさまざまな差異があり、特定のバージョ ンで開発したものが他のバージョンでそのまま動く保証はありません。 そのため、チュートリアルなど、既に存在するものを動作させるには、適 応したバージョンのエディタを入手する必要があります。

Unity の gitignore

Unity の開発にも git ignore が開発されています。 https://github.com/github/gitignore/blob/main/Unity.gitignore よりダウンロードしておいてください。

3-2. Unity の構造

Unity Hub から Unity Editor を開くときに指定するのはフォルダです。 フォルダを移動やコピーして、その場所を Unity Hub から指定すれば、 同じ内容になります。 そのため、 git で管理もできます。unity 用に.gitignore が公開されて います。

Unity Editor を開くと3Dの画面の他に、次のペインが開かれています。
  1. Project
  2. Hierarchy
  3. Scene
  4. Inspector
  5. Game

また、ここでは Project に含まれる Assets フォルダについても説明しま す。

Project

フォルダの内容自体は project 画面に表示されます。 そこに特に参照を行うファイルを収めるために Assets フォルダが表示さ れます。 Unity では様々なファイルを参照しますが、それはこの Assets フォルダ内に 収めます。多彩なファイルを使用するため、中にフォルダを作り整理しながら ファイルを収めます。

Hierarchy, Scene

Unity Editor が編集するものはシーン(scene)です。 シーンファイルを作成または開き、保存をします。 一つのプロジェクトで複数のシーンを持ち、編集することができます。 保存先は Assets フォルダ内になります。 Scene フォルダを作成して、その中に整理することもできます。 オブジェクトを配置、管理するのが編集の仕事になります。

オブジェクトは最低限、名前とtransformコンポーネントを所持しているも のです。 多くのオブジェクトは実際に三次元モデルなどの形状を持っていて、Scene 画面に配置すると、実際に位置や向きのあるものとして認識できます。

シーンにオブジェクトを配置するには、 Hierarchy 画面またはScene画面を使用します。 右クリックで Create のサブメニューを使用して、 様々な基本的なオブジェクトを生成する方法と、 Assets フォルダの中からHierarchyドラッグ&ドロップで配置する方法があります。 他にはプログラムでオブジェクトを生成できますが、生成したオブジェクトは必ず Hierarchy 画面に表示されます。

Hierarchy 画面では、確実にオブジェクトを選択できる他、オブジェクトの 親子関係を築くことができます。 さらに、empty という空のオブジェクトを生成することもでき、 複数のオブジェクトを子オブジェクトとして関連付けて整理に使うとか、 実行したいプログラムを管理することなどができます。

また、色をつけるマテリアルや、プログラムなどのアセットをHierarchy 上 のオブジェクトにドラッグ&ドロップをすることで、アタッチすること ができます。

Scene 画面ではオブジェクトが3D画面として配置できます。 すべてのオブジェクトは transform コンポーネントを持ちます。 この transform コンポーネントは、位置、向き、倍率のパラメータを持つものです。 Scene画面では、オブジェクトのこの transform のパラメータを、 マウスで位置を変えたり、向きを変えたり、引き伸ばしたりなどの直感的な操作により編 集することが できます。

Inspector

Inspector 画面はオブジェクトの編集をするものです。 名前などの他、transform コンポーネントが含まれています。 empty object 以外は他にもコンポーネントを含んでいますが、 さらに、add component でコンポーネントを追加して、オブジェクトの機能 を増やせます。

transform コンポーネントには、位置、向き、倍率が X,Y,Z ごとにパラメー タとして指定できます。 Scene画面でマウスなどの操作で直感的にもこの値は操作できますが、 Inspector 画面で数値を直接入れることもできます。

その他具体的に形状があるオブジェクトであれば、その形状を意味するコン ポーネントが含まれます。

よく付加されるコンポーネントには次があります

Box Collider などのコライダー
他のオブジェクトと衝突判定のため
Rigid Body
オブジェクトの動作に物理演算をさせる

アタッチされたプログラムの public 変数に関しては、それぞれInspector 画面で編集が可能になります。 特に GameObject 型の変数の場合、Assets フォルダ内のPrefab化されたオ ブジェクトやHierarchy 内のオブジェクトをドラッグ&ドロップすると、 参照することができます。

また、マテリアルなど、Assets に生成するものについても、それを選択す れば、パラメータの編集が可能です。

Game

Game 画面は実際にScene のプログラムを動かすものです。 実際にはカメラの映像の出力が画面に出て、Game画面が選択されていれば、 キー入力なども、そこに入力されます。

Assets

前述したように Assets フォルダは Project 画面に表示されるフォルダで す。 Unity Editor から参照可能なファイルはすべて個々に入れる必要がありま す。 右クリックで空のフォルダが作れるほか、Hierarchy 画面からオブジェクトを 持ってくると、Prefab 化と呼ばれる、オブジェクトが部品として保存され ます。 Prefab 化したオブジェクトは、プログラムから生成することにより、 Hierarchy 画面、 Scene 画面に置くことができます。

また、マーケットプレイスなどから unitypackage ファイルを import する と、 Assets にファイルが追加されます。

3-3. Unity の動作原理

イベントドリブン

Unity の動作はイベントドリブン方式です。 起動時に全オブジェクトのStartメソッドを呼び出し、その後、 Updateメソッドを呼び出すことを繰り返します。 したがって、プログラミングとしては Start メソッドで初期化をするコー ドを書き、 Updateメソッドは繰り返し呼び出されますから、毎回ちょっとずつの動作 を書きます。 そのため、Time.deltaTime で前回の Update 呼び出しから経過した時間 を得ることができます。 動作を時間の関数で記述できれば、この時間を使って動作を表すことができます。

Lesson 1.3-5. Smooth the Camera with LateUpdate

カメラの移動などでUpdate よりスムーズに動かすために Update の代わり に LateUpdate を用いることがあります。

lesson 4.1-7. Get a reference to the Player Action Map

なお、Start に対して、オブジェクト間の生成のタイミングなどを考慮した 初期化のメソッドとして Awakeメソッド、OnEnableメソッドがあり、lesson 4.1-7 付近で説明されて います。

イベントの生成と処理

特定の事象に対して、イベントを発生させることができます。 そしてそのイベントにより、 On... という名前のついているメソッドが 呼び出されます。

InputAction

lesson 1.4-3. Add a MoveAction variable, lesson 2.1-4. Configure a new moveAction variable, lesson 2.1-5. Get Vector2 values for Input, lesson 2.2-3. Set up a new fireAction variable

InputSystemによる、ユーザ操作を受け付けるには、 public InputAction で変数(ここでは action とします)を宣言し、 Inspectorでその変数に対して、AddBinding でキーなどを割り当てておきます。 startメソッドで action.Enable() をします。 update において、 add binding なら action.triggerd で判定。 add Composite なら action.ReadValue<Vector2>() で向きを取得で きる。

collider

Collider 同士が衝突したとき、衝突判定ができます。

isTriggerをoff
Collider が固体として動作し、衝突すると跳ね返ります。 衝突すると、OnCollisionEnterが呼び出されます。
isTriggerをon
Collider をすり抜けることができるようになります。 衝突すると、OnTriggerEnterが呼び出されます。

tag

lesson 3.2-4. Add a new game over trigger

衝突先など、他のオブジェクトと関連してイベントが発生したとき、 イベントに対応したメソッド(On...)の呼び出しに対して、 引数に相手が渡されます(ここでは Collision 型の引数 collision とします)。 ここで、相手のオブジェクトの型に応じて処理を変える場合、ダブルディス パッチを使う場面ですが、 Unity では Tag という文字列で判定します。


if(collision.gameObject.CompareTag("タグの文字列"){
    処理
}

これを実施するには、InspectorでTagを生成、指定しておきます。

オブジェクト指向の機能

Unity はオブジェクト指向の考え方が取り込まれていますが、全てがプログ ラムとして扱えないため、次のような仕組みがある。

コンポーネント

既存の拡張機能を利用するには、通常はクラスライブラリを使用したり、ク ラスを継承したりします。 Unity では、オブジェクトごとにコンポーネントを付加することでオブジェ クトの機能を追加します。

なお、 transform コンポーネントは全てのオブジェクトに始めから付加されています。

アタッチ

コンポーネントではなく特定のファイルをオブジェクトに付加する方法として、 Assets フォルダからファイルをオブジェクトにドラッグ&ドラッグして 付加する「アタッチ」という方法があります。 C#プログラムやマテリアルなどは、この方法でアタッチします。 アタッチされたものもInspector でパラメータの編集ができます。

プレファブ(Prefab)

lesson 2.2-2. Make the projectile into a prefab, lesson 2.2-5. Launch projectile on spacebar press

オブジェクトをプログラムなどで生成するには、オブジェクトのプレファブ 化をします。 これは、オブジェクトを Hierarchy 画面から Assets フォルダ内にドラッ グ&ドロップすることで、ファイル化します。 そして、このファイルをプログラムか らpublic GameObject 変数からInspector 画面経由で参照することで、 Instantiateメソッドで Hierarchy 内に新しいオブジェクトを生成できます。

3-4. Unity固有の機能

Sceneでの操作

Sceneではさまざまな操作で視点が切り替わります。 メニューからではできない操作がありますので、操作を熟知する必要があ ります。

視点を動かす

lesson 1.1-3 Add your vehicle to the scene
  1. Hold right-click and WASD to fly to the vehicle, then try to rotate around it. With the vehicle selected and your mouse in the Scene view, press F to focus on it. Hold alt + left-click (on MacOS: option + left-click) to rotate around the focal point or hold alt + right-click to zoom in and out. Use the scroll wheel to zoom in and out and hold the scroll wheel to pan. If anything goes wrong, press Ctrl + Z (macOS: Cmd + Z) to undo until it’s fixed.

Important: You will orbit around the last object that you framed in the Scene view. So it’s important that you first Frame the vehicle (by pressing F), and only then try rotating around it.

視点の切り替え

lesson 2.3-6. Change the perspective of the camera Toggle between Perspective and Isometric view in Scene view to appreciate the difference Select the camera and change the Projection from “Perspective” to “Orthographic”

Inspectorでのオブジェクトの値のバインディング

Unity では Inspector 領域で選択したオブジェクトに コンポーネントを追加し、パラメータを編集できます。 さらに、特定のコンポーネントのパラメータについては、独自のインター フェイスが用意されたり、 Scene画面と連動して編集できたり、 別の専用の編集画面が用意されたりします。

Input Actionオブジェクトの編集

lesson 1.4-4. Assign bindings to the action

Script において、 UnityEngine.InputSystem の InputAction 型の変数 を public で宣言すると、様々な入力と紐付け(bind)することができます。

コライダー編集

lesson 2.4-3. Add collider and trigger components

衝突判定をするには、オブジェクトに衝突判定用の境界を付与する必要 があります。 これをコライダー(Collider)といいます。 設定や処理の簡素化などの目的のため、オブジェクトの正確な輪郭を設定せず、 長方形を含む様々な基本図形を設置します。

Inspector画面でコライダーのコンポーネントでEdit Colliderのボタンを押す と、Scene画面で黄緑色のコライダーの枠と、ハンドルが示されます。 これをマウスなどで編集することで、コライダーの範囲を編集できます。

lesson 4.1-5. Explore the default Input Action Map

InputSystemの機能やメリットなどは 4.1-5 に詳しく説明されています。

lesson 4.1-6. Generate a C# class for the Input_Actions

Input Action のアセットから C# のコードを生成することが書かれていま す。

アニメーション編集

lesson 3.3 Don't Just Stand There Inspector で Animator コンポーネントの Controller をダブルクリックす ると、 Animator Controller の画面が開きます。

Layer
トリガーごとの状態遷移
parametor
speed_f でスピードを設定など、様々なパラメータの設定
右側の画面
各トリガーごとの状態遷移図。 状態を右クリックするとデフォルト状態の設定などの設定が可能。 状態をクリックすると、Inspector 画面にその状態のパラメータが表示される。

パーティクルの編集

lesson 3.4-1 Customize an explosion particle
坂本直志 <sakamoto@c.dendai.ac.jp>
東京電機大学工学部情報通信工学科