アクションゲームを作る CharacterController


今回はアクションゲームを作ってみたいと思います。Unityならアクションゲームも一瞬でできちゃいます。
全て手順付きで解説しますので、しっかりついてきてくださいね!



左右矢印キーで移動、スペースキーでジャンプです。

準備


まず、プロジェクトを作成してください。
次に作成するためのテストの場として地面を作っておきましょう。
メニューよりGameObject->CreateOther->Cubeを選択し、
拡大縮小ツールで下の画像の様に変形させてください。

また、そのままでは暗いのでDirectionalLightも設置しておきましょう。

こんな感じ
Action1.jpg

ここまでの操作がわからない方は別の記事を参考にしてくださいね。

プレイヤーの作成


次にプレイヤーとなる青い立方体を作成しましょう。
メニューよりGameObject->CreateOther->Cubeを選択し、拡大縮小ツールで上に伸ばします。
作成したCubeの名前をPlayerに変更しておきましょう。

次にProjectパネルを右クリック->Create->Materialを選択し作成したマテリアルの名前をPlayerに変更し、色を青く設定しましょう。

設定したマテリアルをプレイヤーに設定しましょう。
プレイヤーを青く設定できましたか?
色の設定はコチラに記載してあるのでわからない人は参照してください。
Action2.jpg

CharacterControllerの設定


Unityにはキャラクターの動きを簡単に作ることのできるCharacterControllerというコンポーネントが存在します。このCharacterControllerを利用することで移動や地形との当たり判定をほとんど自動でやってくれちゃいます。

それでは先程作成したPlayerにCharacterControllerを設定しましょう。
HierarchyパネルのPlayerを選択した状態でメニューのComponent->Physics->CharacterControllerを選択しましょう。
Action3.jpg

するとこんな警告が出ると思います。
Action4.jpg
この警告はPlayerにはすでにBoxColliderという箱状の当たり判定があるが、CharacterControllerで置き換えても大丈夫か?という警告です。
問題はありませんのでReplaceをクリックしましょう。

Action5.jpg

するとPlayerのInspectorパネルにCharacterControllerというコンポーネントが設定されるとおもいます。
このコンポーネントの各種値で登れる坂の限界(SlopeLimit)や登れる段差のサイズ(StepOffset)などが設定できます。

また、Center,Radius,Heightの値が壁などとの当たり判定が発生する範囲を設定できます。
Sceneパネルでは緑色の線で表示されている部分になります。
今後もし、プレイヤーが壁や床にめり込んでしまうことがアレばココの値を変更してみてください。
下の図は緑色の線が見やすくなるよう値をいじっていますが、初期の設定の値で特に困ることはないと思います。
Action6.jpg


CharacterControllerを制御する


上記までの状態では再生ボタンを押しても何も起こりません。
CharacterControllerを制御するためのスクリプトを追加し方向キーでの移動やジャンプの処理を追加して行きましょう。

Projectパネルを右クリック->Create->JavaScriptでスクリプトを追加し名前を
PlayerControllに変更してください。

PlayerControllをダブルクリックし編集画面を開き以下の通りスクリプトを記述してください。

#pragma strict

var speed : float = 6.0;
var jumpSpeed : float = 8.0;
var gravity : float = 20.0;

private var moveDirection : Vector3 = Vector3.zero;
private var controller:CharacterController;

function Start()
{
controller = GetComponent(CharacterController);
}


function Update()
{
//地面についているかどうか
if (controller.isGrounded) {

//移動方向を取得
moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;

//ジャンプ
if (Input.GetButton ("Jump")) {
moveDirection.y = jumpSpeed;
}
}

// 重力を計算
moveDirection.y -= gravity * Time.deltaTime;

// 移動
controller.Move(moveDirection * Time.deltaTime);
}


このスクリプトはUnity公式リファレンスのスクリプトをちょっと変更したものになっています。

追記 2014/01/21:
Input.GetAxis("Vertical")の処理が抜けていました。
コメントでご指摘を頂きました、ありがとうございます。


各種処理の解説をします。
function Start()
{
controller = GetComponent(CharacterController);
}

の部分のStart関数は実行時に一回だけ呼ばれます。
その中ではGetComponent関数を呼び出しCharacterControllerコンポーネントを取得しています。

CharacterControllerを通じて各種関数を呼び出すことでキャラクターの移動処理を簡略化することができます。
CharacterControllerの詳細はUnityリファレンスのCharacterControllerを参照してください。

そして、Update関数は毎フレーム呼ばれます。
この中でプレイヤーの移動やジャンプの処理をしています。

なにやら色々処理をしていますが、今回は細かいことはおいといて先に進みます。
細かい解説はのちのちの記事で記載して行きます。

ではスクリプトを保存しUnityの画面に戻りましょう。
次に作成したスクリプトをPlayerに反映させます。

ProjectパネルのPlayerControllをドラッグしてHierarchyパネルのPlayerにドロップしてください。
Action7.jpg
PlayerのInspectorパネルにPlayerControllの欄が追加されていればOKです。

SpeedやJnmpSpeedの値を変更すれば移動速度やジャンプ力を調整できます。

それでは再生してみましょう!
左右キーで移動でスペースキーでジャンプできればOKです。
うまく出来ましたでしょうか。

ステージの作成


ではそれっぽいステージを作って行きましょう。

Cubeをコピーして移動、拡大縮小、回転を加えてお好きなようにステージを作りましょう!

私はこんな風なステージを作りました。
Action8.jpg

カメラの追従


上記までの状態でゲームを再生するとプレイヤーが画面外に行ってしまいますね…。

画面を写しているカメラがプレイヤーと一緒に移動すればうまくいきそうです。
カメラをプレイヤーと一緒に移動する方法はいくつかありますが、今回は一番簡単な方法で実現しましょう。

プレイヤーとカメラに親子関係を設定することでカメラがプレイヤーにくっついて移動するようにします。
親子関係を設定するにはHierarchyパネルのMainCameraをドラッグしPlayerにドロップしてください。
下の画像の右側の様になれば正しく親子関係が設定できています。
Action9.jpg

親子関係が上手く設定できたらMeinCameraをプレイヤーが真ん中に映る位置に移動しましょう。

完成


ゲームを再生してみてプレイヤーが移動しても常に画面の中央に写っているようになれば完成です!

簡単にアクションゲームができてしまいましたね!
以上です。

<<他の記事を読む

[スポンサードリンク]


このエントリーをはてなブックマークに追加
posted by Unity3d at 2012年11月11日14:54 | Comment(16) | シンプルゲーム作成講座 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
これもつけとかないと、初心者はわからんやん
デモは上下もいけるのに、なんで左右しかうごかへんのって!!!!!!!
Input.GetAxis("Vertical")
Posted by あああ at 2013年12月24日 12:15
地面をすり抜けた。。。なんでだー
Posted by at 2014年08月02日 07:54
地面をすり抜けた。。。なんでだー
Posted by www at 2014年08月02日 07:55
Input Axis Vetical is not setup
と出て再生してもすぐに止まってしまうのですが、どうすればいいのでしょうか?
Posted by at 2014年12月26日 22:21
↑の者です。
バーティカルのスペルが間違ってました。
すみません
Posted by at 2015年01月02日 01:00
CharacterControllerというのがないんだが
Posted by at 2015年03月26日 21:16
こんにちは、
軸をロックしないとごろごろ転がってしまいますけど、その点はどうするんでしょうか?
Posted by at 2015年07月12日 21:09
↑ああ、軸ロックがありました、すみません、、、。
でも、Z軸ロックすると今度は床をすり抜けます。
これって何でしょうか?
Posted by at 2015年07月12日 21:13
スペリングミスなどはないのに、エラーのような表示が出てしまいテストプレイできませんでした。
これは何故でしょうか。
Posted by at 2015年09月24日 22:12
...Playerの枠にPlayer controll入れられない・・・
Posted by at 2015年11月17日 19:29
あ。入れれた。
Posted by at 2015年11月17日 19:32
unity5.2.3fで 前のバージョンなら移動できるのになぜか移動できない・・・Tell me ya.
Posted by at 2015年12月03日 17:29
できた・・・・けど原因がわからん
Posted by at 2015年12月03日 17:58
vector3 が見当たらないといわれます。vector3とはそもそも何なのでしょうか
Posted by at 2016年03月07日 14:47
地面に触れていない時、移動キーの入力を受け付けない仕様は修正した方がよろしいのでは...。初心者なので間違っているかもしれませんが、moveDirection = Vector3(Input.GetAxis("Horizontal") * 3, moveDirection.y , Input.GetAxis("Vertical") * 3);に書き換えれば、移動入力を地面についているときに限定する必要は無くなると思います。
Posted by at 2017年01月23日 12:47
コントロールの綴りはcontrolです。
語尾のエルは一つです。
Posted by at 2017年11月20日 22:24
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

×

この広告は1年以上新しい記事の投稿がないブログに表示されております。