UnityでOBJ形式のパリを読み込んで駆ける

# 同じ内容で話した勉強会の動画
- https://livestream.com/accounts/1839740/events/3063002/videos/55819831

# 今回の概要

![](https://www.evernote.com/shard/s22/sh/912b4fcc-7aaf-48d5-8898-156bd30a3cf9/1de02527be7629c8b7037f8019d3a533/deep/0/demo2.unity---Paris02---Web-Player.png)

Unityはさまざまな形式の3Dデータをインポートして利用できる。Colliderやカメラなどを設定すればすぐにでもステージとして利用できる。また簡易的なキャラクタ操作を実現するCharacter Controllerやユニティちゃも合わせて試す。

# モデルデータをUnityで使う

## TF3DM

http://tf3dm.com/

![](https://www.evernote.com/shard/s22/sh/4e4510db-3e26-42d7-bc65-5fd6b9e6aba6/c59d21d5bb59c58be4a1235cfde574fe/deep/0/Cursor-と-TF3DM---3D-Models-for-free.png)

さまざまなモデルデータが公開されているサイト。どうみても著作権的にブラックなものも見受けられるが手軽に試せる。今回はここにあるParisモデルを使う。

## ダウンロード

![](https://www.evernote.com/shard/s22/sh/e3a02ac8-9666-4b65-b863-4ce49fff987a/47e40cf2da988b579c506d4b9045cec7/deep/0/Cursor-と-Paris---3d-model---.obj,-.mtl.png)

ダウンロードボタンから<code>.obj</code>形式のファイルを取得する。<code>rar</code>形式のファイルなので対応した展開ソフトを使う。(The Unarchiver)

## Unityへのインポート

Unityでは新規プロジェクトを作り、プロジェクトビューのAssets配下に展開してデータを丸ごとドロップする。

![](https://www.evernote.com/shard/s22/sh/3037c5db-5b71-4916-a0ce-18b6b157e0fc/5e322507fa73c8d28864ba1ee8808a1a/deep/0/Cursor-と-Paris-と-Untitled---Paris02---PC,-Mac-&-Linux-Standalone.png)

ドロップ後、PCの性能にもよるが **それなりの時間** がかかる。インポートが完了するとプロジェクトビューにアイコンが表示され、選択するとインスペタでインポートの設定を調整できる。

![](https://www.evernote.com/shard/s22/sh/851ab0a5-a75c-4398-93a8-eeb67da2ef1d/6a5a871fd7efc54ce650b1603be9555a/deep/0/Cursor-と-Untitled---Paris02---PC,-Mac-&-Linux-Standalone.png)

人型のモデルなどアニメーションが必要な場合は<code>Rig</code>や<code>Animations</code>のタブを使うが今回は単なる建造物。ソフトによってスケール間が異なる場合はScale Factorを調整。
また当たり判定を生成する場合は<code>Generate Colliders</code>にチェックを入れる。

## モデルを配置

セッティングを調整後、プロジェクトビューのParisフォルダの中のParis2010_0をヒエラルキーにドロップするとシーンにモデルが配置される。

![](https://www.evernote.com/shard/s22/sh/aae78fc9-5c57-40ad-80a4-c18acc36a8ca/5d6bf4996e4aa8728d4c52bde2231015/deep/0/Cursor-と-Untitled---Paris02---Web-Player.png)

なんだか上空に配置されてしまっているのでインスペクタからPositionのyを-76に設定。あと暗いのでとりあえずヒエラルキーから<code>Create > Directional Light</code>

## シェーダーの調整

![](https://www.evernote.com/shard/s22/sh/1954ca71-d031-41a4-9bfb-8535a328893e/90fd493f63ce4be10fd3740b5c4b92f3/deep/0/Cursor-と-Untitled---Paris02---Web-Player-と-Paris---3d-model---.obj,-.mtl.png)

木の背景部分が表示されてしまっている。インポートしたデータは透過部分の設定が飛ぶなどの現象がよく起こる。こういった部分は地道に修正する。配置したモデルの子オブジェクトから<code>SidewakTree_MeshPart0</code>を見つけ、<code>Shader</code>を<code>Diffuse</code>から<code>Transparent Diffuse</code>を選択しなおす。

![](https://www.evernote.com/shard/s22/sh/921437c4-a6fd-4a4a-b39e-b0250414a228/115ef213b6ab6a020ad51129300c8da8/deep/0/Cursor-と-Untitled---Paris02---PC,-Mac-&-Linux-Standalone.png)

同様に街に立っている街灯の表示を修正するには<code>tree17</code>オブジェクトにも同じ設定をする。

## 空を付ける

空が単色は寂しいのでSkyBoxを設定する。<code> Assets > Import Package > Skyboxes
</code>としてSkyBoxのパッケージをインポート。インポートしたSkyBoxを設定するには<code>Edit > Render Setting > Skybox Material</code>として上部のボックスでSkyboxで検索し好きな空を選択する。

![](https://www.evernote.com/shard/s22/sh/c1e5c354-0214-4efd-8d63-3c04f234e774/c016bf2181c51afb58fa600f5066a68a/deep/0/Cursor-と-Select-Material-と-Untitled---Paris02---PC,-Mac-&-Linux-Standalone.png)

![](https://www.evernote.com/shard/s22/sh/23da5675-1dff-4aa7-befc-52c5add9102f/93484d4ea1539c6c12ee45d0a46c4328/deep/0/Cursor-と-Untitled---Paris02---Web-Player.png)

だいぶいい感じなった。カメラを適当な場所に移動して、そのままゲームの背景にすることもできる。例えばブロック崩しの後ろに置くなど。カメラ位置を変えるときはシーンビューでここだという位置を表示させ、カメラを選択して<code>GameObject > Align With View</code>するとカンタン。

# Chracter Controller

Unityには標準アセットとして一人称視点、三人称視点でのプレイヤーを扱うアセットが存在する。プレイヤーの機能をパラメータ調整だけで扱えるので便利ではあるが、全てを賄うのは難しいのである段階から改造したり、自作する必要がある。それぞれのアセットは書き換え可能なソースとして配布されているので中を読むことも出来る。

標準アセットはプロジェクト作成時のチェックボックスでも追加できるが、後からでも追加できる。<code>Assets > Import Package > Character Controller</code>

## 一人称視点で歩きまわる。

プロジェクトビューの<code>Assets > Standard Assets > Character Controller</code>の中にある<code>First Person Controller</code>のプレハブをヒエラルキーにドロップすればとりあえず使える。このプレハブにはMain Cameraが含まれているのでシーンに元々あるカメラは無効にしたほうが良い。

操作方法はいわゆるFPS形式

- W 前進
- S 交代
- A 左へ移動
- D 右へ移動
- マウス 視点変更
- Space ジャンプ

![](https://www.evernote.com/shard/s22/sh/f7af2fce-f2b2-4593-b59e-a918eb852d32/e11986e58d4bb51f9b833869a553d898/deep/0/Cursor-と-Untitled---Paris02---Web-Player.png)

パラメータを変更して挙動を調整できる。このままだと建物の隙間からの脱出が困難なのでジャンプ力の強化と移動スピードの強化はしたほうがいいかも。

![](https://www.evernote.com/shard/s22/sh/ba613060-7c89-4fbe-b991-1a3c799444c0/28e877a981b2f2cedb2d263992b47a7a/deep/0/Cursor-と-Untitled---Paris02---Web-Player.png)

<code>Movement > Max Forward Speed</code>を30に、<code>Jumping > Extra Height</code>も30にしてみる。これで屋上に登ったり、飛び移ったりとかなり自由に動ける。

![](https://www.evernote.com/shard/s22/sh/0895b2e5-5ccb-4eb4-b327-3d59e7f3dd5b/e3e637564ac2ed5ae0c43061eb4dc783/deep/0/Cursor-と-Untitled---Paris02---Web-Player-と-UnityでOBJ形式のパリを読み込んで駆ける-と-Paris---3d-model---.obj,-.mtl.png)

このままでもチェックポイントを回るゲームなんかは作れそうだ。

## 三人称視点で歩きまわる。

三人称視点のゲーム用にはThird Person Controllerを使う。同じようにシーンにドロップする。カメラは含まれていないので任意に配置する。するとUnity界ではよく知られた配管工が登場する。

![](https://www.evernote.com/shard/s22/sh/93e081c5-0e59-4243-ae62-07c5af736903/54fbe4babf3598b1774f39b58514b7aa/deep/0/Cursor-と-Untitled---Paris02---Web-Player-と-UnityでOBJ形式のパリを読み込んで駆ける-と-Paris---3d-model---.obj,-.mtl.png)

幾つかコンポーネントがアタッチされていて設定の調整ができる。

![](https://www.evernote.com/shard/s22/sh/ac30016d-5493-4692-92c9-2b39cf985210/35bd5f169c89336c202b219ac3b45696/deep/0/Cursor-と-Untitled---Paris02---Web-Player.png)

またジャンプ力不足でどこにも行けないのでまずはそこから。
<code>Jump Height</code>を30に。<code>Third Person Camera</code>の<code>Distance</code>を8にするとこんなかんじに。

![](https://www.evernote.com/shard/s22/sh/d04817d8-1533-4e7b-a3a9-790d2ad4bccd/5e9fc73044e97773013a6db6e6574631/deep/0/Cursor-と-Untitled---Paris02---Web-Player.png)

一人称と違い、三人称でゲームを構成する場合はカメラの制御は必要になる。距離や角度などが悪いとジャンプしたキャラクタが画角から外れてしまうなどの問題がある。

## Character Controllerのトラップ

Character Controllerは<code>Rigidbody</code>を使わない形で実装されており、物理演算はそのままでは出来ない。また衝突検知についてもColliderを使っていない。標準では衝突した対象への通知は行っている。

適当なオブジェクトを作りRigidbodyをつけてバラまいておき、次のスクリプトを付ける。

```UnityScript:TargetBallScript.js
#pragma strict

var original:Vector3;

function Start () {
	this.original = transform.position;	
}

function OnCollisionEnter(other:Collision){
	if (other.gameObject.CompareTag('Player')) {
		this.transform.position = this.original;
	}
}
```

Playerタグが付いているオブジェクトにぶつかると消えるはずだが、すごく渋い。プレイヤー自身に大きめのColliderを別途付けたりして対処。OnControllerColliderHitを使う方法もあるが、プレイヤー側に実装が集まる。

![](https://www.evernote.com/shard/s22/sh/1903cacf-ba24-43ee-aef3-40dd349148b2/610f9598ee05671a3dd96d597260ec60/deep/0/Cursor-と-Untitled---Paris02---Web-Player.png)


# ユニティちゃん

![](https://www.evernote.com/shard/s22/sh/8c0c1d69-6b09-4f4d-860f-8b60604dc4cd/2f43d820ef5cbf03ce327b343f5e4200/deep/0/Cursor-と-ActionCheck.unity---Paris02---Web-Player-と-UNITY-CHAN!.png)

知っている人は知っている、ユニティちゃんもキャラクター操作のサンプルになっている。

## 導入

Webで配布しているパッケージとアセットストアから導入できるパッケージとがある。独自のライセンスがあるので注意して使おう。

- アセットストアのユニティちゃん
	- 軽い。声などが入っていない。
	- https://www.assetstore.unity3d.com/jp/#!/content/18705
- Webページで配布しているユニティちゃん
	- データがものすごく多い。
	- http://unity-chan.com/

## ユニティちゃんを走らせる

Unity-Chanパッケージを導入後、(Webからのダウンロード、アセットストアどちらでもOK)プロジェクトビューの<code>UnityChan > Prefabs > for Locomotion</code>の下にあるunitychanをヒエラルキーにドロップ。また専用のカメラが必要になるので既存のカメラを取り除き、unitychanと同じフォルダにあるMainCameraをハイラルキーにドロップ。専用のライトもあるが、猛烈に明るい。

![](https://www.evernote.com/shard/s22/sh/908e8116-75e2-4d23-9534-20ca26d0d2d3/5d187f5d483a77aa0c7e4b8cbb87c185/deep/0/Cursor-と-demo2.unity---Paris02---Web-Player.png)

ちょっとカメラの位置が近いが走り回ったりジャンプが可能。

## ジャンプ力の調整

![](https://www.evernote.com/shard/s22/sh/414bf1c5-9c39-4991-913a-4340537f0525/8594cc208694e8983ec3a4d5c3b3ad04/deep/0/demo2.unity---Paris02---Web-Player.png)

ジャンプ力は<code>Unity Chan Control Script With Rigidbody</code>のJump Powerで設定する。追加ジャンプを考慮しても20くらいないと中庭の脱出はできない。このスクリプトはCharacter Controllerと違い、RigidbodyとMechanimを使ってコントロールする作りになっており汎用性が高い。


## カメラの調整

![](https://www.evernote.com/shard/s22/sh/dbfc6ce1-a465-4a9d-a3dd-ef185580572d/cfcd9aa3c42f2aadc3b7188982201092/deep/0/demo2.unity---Paris02---Web-Player.png)

UnityChanはカメラの位置を目印になるオブジェクトの座標を使ってコントロールしている。カメラの位置を変えるにはそれぞれのオブジェクトの位置を<code>GameObject > Align View to Selected</code>を使って確認し、シーンで調整して<code>GameObject > Aligin with View</code>で調整していくことで画面を作れる。

それぞれのオブジェクトに対応するカメラ位置は下記のとおり。

|オブジェクト|カメラ位置|
|:--|:--|
|LookAtPos|Altキーを押した時の視点(上を見上げる)|
|CamPos|背後からの視点(通常時)|
|FrontPos|前方からの視点(Ctrlキーをおした時)|
|JumpPos|ジャンプ時の視点|

ほどほどの視点に調整した。

![](https://www.evernote.com/shard/s22/sh/acd6e32f-7fd6-4584-8baa-ce431c3ad2d8/33fac5a0a1cc48edc17a0a3a682b1b99/deep/0/demo2.unity---Paris02---Web-Player.png)

![](https://www.evernote.com/shard/s22/sh/43a5d2aa-538d-4891-b874-747729d61844/b699b1cc47d0b15b73d2f56ae0027a55/deep/0/ライセンス表示について.pdf.png)