【Unity】【C#】ユニティちゃんをサクっと簡単に動かす!(Unity4) 
2015/01/24 Sat [edit]
わりと自由に使えるユニティちゃん。ググると、Locomotion Starter Kit を利用したり、Animator を自分で作る方法があったが、多少面倒くさいな~と思ったので、Asset Store からインポートしたものだけでサクっと簡単に動かすテスト。
(※) Unity 4.6.1f2 / Windows8.1(x64) で確認
■インポート~ユニティちゃんを動かす
1.まず新しいプロジェクトを作ったら、「Window」メニューの「Asset Store」からユニティちゃんの3Dモデルをインポート。
Asset Store 内では、横にあるメニューから、「3Dモデル > キャラクター」で、「"Unity-chan!" model」を探す。たぶんすぐ見つかる。オフィシャルサイトからダウンロードしたパッケージを使っても良い(オフィシャルの方が最新版)。
2.とりあえず動き回れる床を作りたいので、「GameObject」メニューから「Plane」を作る。位置は原点に、大きさは適当に 100 くらいにしておく。


3.床が単色では何となくさびしいので、プロジェクトエクスプローラから「UnityChan>Stage>Textures」フォルダを開き、好きなテクスチャを Plane にドラッグ&ドロップする。 Tiling は 500 くらいにしておく。



4.このままだと真っ暗なので、「GameObject」メニューから「Directinal Light」を適当に置く。Intensity だけを 1 にしておく。ちなみにユニティちゃんのシェーダーは Directinal Light 1つが良いらしい。


5.次に、ユニティちゃんの 3Dモデルを配置する。一番簡単なのは、プロジェクトエクスプローラから「UnityChan>Prefabs>for Locomotion」フォルダの中にある「unitychan」を Hierarchy にドラッグ&ドロップすることだ。このプレファブにははじめから「Animator」「Capsule Collider」「Rigidbody」とユニティちゃんをキー操作で動かすスクリプト「UnityChanControlScriptWithRgidBody」が組み込まれているので、実はこれだけでプレイボタンで動かせる。特にパラメタを変更する必要はない。



6.ただしこのままだとちょっとカメラが遠いのと、カメラは固定でユニティちゃんが画面からはみ出たりすると見えなくなってしまうので、カメラをキャラに追従させたい。超簡単な方法は「Main Camera」を「unitychan」の子要素にしてしまう方法だ。Hierarchy で「Main Camera」を「unitychan」にドラッグ&ドロップして、カメラの位置を調整するだけで良い。こうするとユニティちゃんと一緒にカメラも動く。ここではアングルを正面からにしてみた。一応、これで完成。シーンは適当な名前で保存しておく。



(※) もう1つの方法はプロジェクトエクスプローラで「UnityChan>Scripts」フォルダに「CameraController」があるので、「Main Camera」に組み込んでも良い(「Component」メニューの「Script」で「CameraController」を追加)。Inspector で「Focus Obj」に Hierarchy の unitychan をドラッグ&ドロップすれば追従できる。また「Focus」のパラメタでカメラの中心を調整できる。これを使えばホイールでズームイン・アウトもできる。
>>「SmoothFollow に回転アングルと距離の遠近機能を付けたもの」を使っても良い。
7.空が寂しければ「Skybox」を追加しても良い。「Assets」メニューから「Import Package>Skyboxes」で素材をインポート。「Main Camera」に「Component」メニューから「Rendering>Skybox」を追加。Inspector で好きなものを選ぶ。またプロジェクトエクスプローラから「Standard Assets>Skyboxes」フォルダからドラッグ&ドロップでも変更できる。Game ビュー(タブ) にしておけば確認しやすい(※ Unity4 でのやり方。Unity5 では「Lighting」の設定項目に Skybox がある)。



今回はインポートから地面~空まで作ってしまったが、既に何らかのシーンがある場合、要点を抜き出せば、「UnityChan>Prefabs>for Locomotion」フォルダの中にある「unitychan」をシーンにつっこんで、「Main Camera」を「unitychan」の子要素にすれば良いということだ。
■キャラの周りを旋回するカメラを作る
ここからは少しオマケ的になるが、もうちょっとカメラのアングルを自由に動かしたいので、カメラ操作のスクリプトを自作しよう。
仕様としては先ほどの「Main Camera」を「unitychan」の子要素の状態で調整した上で、キャラの周りをぐるぐる回るようなカメラを作ってみる。ついでにズームイン・アウトもスムーズにしてみる。
1.もし「Main Camera」に「CameraController」を組み込んであるのだったら、スクリプトを「Remove Component」で解除する。次いで新しく「CameraController2」とでもして C# スクリプトを作成しよう(Inspector の Add Component から「New Script」で作成)。

2.作成したスクリプトファイルを MonoDevelop などエディタで開いたら、以下のスクリプトをコピペする。
public class CameraController2 : MonoBehaviour {
public GameObject player; //キャラのオブジェクト
public Vector3 focus = Vector3.zero; //中心座標調整用
public float angle = 45f; //回転量(度)
public float drag = 0.3f; //マウスドラッグでの移動量倍率(移動px x N倍)
public float wheel = 2f; //ホイール量の倍率(0.1 x N倍)
private float scrollAmount = 0f; //ホイール量のキュー
private const float SCROLL_DEC = 0.025f; //フレームごとのホイール減算量
private Vector3 startPos; //マウス移動始点
// Use this for initialization
void Start () {
if (player == null) {
player = GameObject.Find("unitychan");
}
}
// Update is called once per frame
void Update () {
//キャラを中心に左旋回
if (Input.GetKey(KeyCode.Z)) {
Camera.main.transform.RotateAround(player.transform.position + focus,
player.transform.up, angle * Time.deltaTime);
}
//キャラを中心に右旋回
if (Input.GetKey(KeyCode.X)) {
Camera.main.transform.RotateAround(player.transform.position + focus,
player.transform.up, -angle * Time.deltaTime);
}
//キャラを中心に上旋回
if (Input.GetKey(KeyCode.C)) {
Camera.main.transform.RotateAround(player.transform.position + focus,
player.transform.right, -angle * Time.deltaTime);
}
//キャラを中心に下旋回
if (Input.GetKey(KeyCode.V)) {
Camera.main.transform.RotateAround(player.transform.position + focus,
player.transform.right, angle * Time.deltaTime);
}
//マウスドラッグで回転
Vector3 movePos = Vector3.zero;
if (Input.GetMouseButtonDown(0)) {
startPos = Input.mousePosition;
}
else if (Input.GetMouseButton(0)) {
movePos = Input.mousePosition - startPos;
startPos = Input.mousePosition;
}
else if (Input.GetMouseButtonUp(0)) {
startPos = Vector3.zero;
}
if (movePos != Vector3.zero) {
Camera.main.transform.RotateAround(player.transform.position + focus,
player.transform.up, movePos.x * drag);
Camera.main.transform.RotateAround(player.transform.position + focus,
player.transform.right, movePos.y * drag);
}
//キャラを中心に近くへ
if (Input.GetKey(KeyCode.LeftShift)) {
Vector3 dir = player.transform.position + focus - Camera.main.transform.position;
Camera.main.transform.position += dir.normalized * Time.deltaTime;
}
//キャラを中心に遠くへ
if (Input.GetKey(KeyCode.LeftAlt)) {
Vector3 dir = player.transform.position + focus - Camera.main.transform.position;
Camera.main.transform.position -= dir.normalized * Time.deltaTime;
}
//ホイールで遠近
scrollAmount += Input.GetAxis("Mouse ScrollWheel") * wheel;
if (scrollAmount > 0) {
Vector3 dir = player.transform.position + focus - Camera.main.transform.position;
Camera.main.transform.position += dir.normalized * Time.deltaTime;
scrollAmount -= SCROLL_DEC;
scrollAmount = (scrollAmount < 0) ? 0 : scrollAmount;
}
if (scrollAmount < 0) {
Vector3 dir = player.transform.position + focus - Camera.main.transform.position;
Camera.main.transform.position -= dir.normalized * Time.deltaTime;
scrollAmount += SCROLL_DEC;
scrollAmount = (scrollAmount > 0) ? 0 : scrollAmount;
}
}
void setCameraPositionJumpView() {
//UnityChanControlScriptWithRgidBody のコールバック(Jump中カメラ)
}
}
3.スクリプトを保存したら、Unity のエディタに戻って、「Main Camera」の Inspector の「Player」に Hierarchy から「unitychan」をドラッグ&ドロップする(設定しない場合は自動で「unitychan」を探す)。また回転の中心をキャラの中心あたりにしたいので、Focus パラメタを調整する。これはユニティちゃんなどキャラの基準座標は、地面と接地する足元になっているためだ。

4.これでカメラ操作は完成。操作方法はコメントにも書いておいたが、キャラに向かって、[Z]で左旋回、[X]で右旋回、[C]で上旋回、[V]で下旋回、[Shift](左)でズームイン、[Alt](左)でズームアウトにしておいた。ついでにホイールのズームイン・アウト、マウスドラッグで旋回も対応しておいた。
(※) angle、wheel、SCROLL_DEC の値などは適宜調整しても良い。インスペクターでも調整できる。
(※) setCameraPositionJumpView() はユニティちゃんを動かすスクリプトからのコールバックだが使ってない。ジャンプ中カメラを換えたりするときに使うみたいだが、ここでは単なるエラー出力防止用だ(ジャンプするとコンソールに「SendMessage setCameraPositionJumpView has no receiver!」と出るので。放っておいても別に構わない)。
>>「SmoothFollow に回転アングルと距離の遠近機能を付けたもの」を使っても良い。
■Web Player 用にビルドする。ついでに WebTemplate を適用する方法 (Unity4)
最後にこれもオマケだが、Web Player 用に Build するとき、Web テンプレートを使う方法。
1.インストールした Unity のフォルダ「Unity>Editor>Data>Resources>WebPlayerTemplates」をエクスプローラー等で開く。
2.ここに一般配布などされているWeb テンプレートをフォルダごとコピーする。またはプロジェクトエクスプローラにフォルダをつっこんでも良い。ただしその場合は、そのプロジェクト専用になる。
3.「File」メニューから「Build&Settings...」を開き、「Web Player」を選び、「Add Current」を押し、現在のシーンを登録する。

4.下にある「Player Settings...」を押すと Inspector に「Resolution and Presentation」という項目があるので、それをクリックして展開すると、先ほどコピーしたテンプレートが出てくるので選択する。

5.「Build&Settings...」に戻って「Build」ボタンを押すと出力するフォルダを聞いてくるので、適当なフォルダを作成して、出力する。
6.「~.html」と「~.unity3d」ファイルが出来るので、サーバーにアップすれば表示できる。ローカルでもブラウザに「~.html」をつっこめば確認できる。
最後まで読んだ方、お疲れ様でした(笑)。アニメーションも「UnityChan>Amimators」にいくつか入っているので、「Animator」を「UnityChanActionCheck」や「UnityChanARPose」に換えれば、色んなポーズを見ることができます。蹴りのモーションもなかなかいいね。このサンプルでも止まっているとき、Space キーを押すと背伸びするけど、とても可愛い。
(関連記事)
【Unity】【C#】ユニティちゃんを飛行させる!
【Unity】SDユニティちゃんを動かす!
【Unity】クエリちゃんを動かす!
【Unity】SDクエリちゃんを動かす!
【Unity】プロ生ちゃんを動かす!
【Unity】SDプロ生ちゃんを動かす!
【Unity】【C#】SmoothFollow に回転アングルと距離の遠近機能を付けてみる

- 関連記事
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/161-5096e9b4
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |