目次
【Unity】MMDモデルを使ってボールを蹴って物体を壊すゲームを作ろう!
その1
その2
その3
その4
その5
その6(完結)
オブジェクトの配置
その3の続きになります。
ついにゲーム画面らしくSceneにモノを追加していく作業になります。
画面上段のSceneタブを押下してAnimator画面からScene画面に戻りましょう。
床の追加
床はplaneやterrainツールなどでもいいのですが、
今回はcubeで作ります。
GameObject→Create Other→Cubeを押下し、cubeを作成します。
作成したらInspectorを以下のように調整しておきましょう。
名前:Floor
Position : x 0 y -1 z 0
Scale : x 30 y 1 z 30
キャラクターの追加
gontaもすでに追加されているかもしれませんが、
追加されていなければ、D&Dして追加して下さい。
Inspectorの設定は
Position : x 0 y 0 z 0
にしておきましょう。
ここで一旦実行します。
暗いですね。
ではライトを追加しましょう。
ライトの追加
GameObject→Create Other→Direction Lightを選択して、
ライトを追加します。
Position : x 0 y 10 z -10
Rotation : x 50 y -30 z 0
辺りでOKです。
実行してみるとライトの恩恵を受けて明るくなりました。
キャラクターを動かそう
ようやくコードが書けます!長かったですね…。
スクリプトを組んでキャラクターを操作出来るようにしていきます。
Create→C# Scriptを選択して、csファイルを生成します。
名前はCharacterSetupとしました。
ダブルクリックし、ファイルを開き以下のように記述してください。
using UnityEngine;
using System.Collections;
public class CharacterSetup : MonoBehaviour {
private float speed = 6.0f;
private Vector3 moveDirection;
private CharacterController character;
// Use this for initialization
void Start () {
//Componentに登録されているCharacterControllerを取得します。
character = GetComponent<CharacterController>();
}
// Update is called once per frame
void Update () {
// 上下キーが押されたら
if(Input.GetAxis("Vertical") != 0){
float varticalMove = Input.GetAxis("Vertical");
moveDirection = new Vector3(0 , 0 , varticalMove);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
}
// 左右キーが押されたら
if(Input.GetAxis("Horizontal") != 0){
transform.Rotate(0 , 100 * Time.deltaTime * Input.GetAxis("Horizontal") , 0);
}
character.Move(moveDirection * Time.deltaTime);
}
}
もし、入力ミスがあった場合は、
コードエラーは以下のようにこじんまりと教えてくれますが、
Consoleタブを開けば詳細に見ることが出来ます。
入力が出来ましたら、gontaにD&Dしてスクリプトを登録、そして実行!
…
キーボードの左右キーは効くのですが、上下に動きませんね…。
それもそのはず、スクリプトに書いたCharacterControllerが無いからです。
では、CharacterControllerをgontaに追加してあげましょう。
gontaを選択して、Inspectorの一番下にあるAdd Componentを押下。
Physics→Character Controllerを選択。
これでCharacterControllerが追加出来ました。
ちょっと調整します。
Center : x 0 y 1 z 0
radius : 0.6
にします。
Character Controller
上手く説明出来ないので詳しくは公式を見て欲しいですが、キャラクター制御用の判定を行う専用コンポーネント…という感じでしょうか。
この外枠にあるカプセルコライダー型のものがCharacterControllerになります。
追加が終わったら早速実行します。
おお!上下キーも効くようになりましたね!
しかし、このままではT字型のポーズで固まったまま移動しています。
というわけでその3まで作成していたAnimatorもつなぎこみます。
まずAnimatorSetupをgontaにD&Dします.
するとこのようにAnimatorコンポーネントに登録されます。
そしてCharacterSetup.csを以下のように変更します。
using UnityEngine;
using System.Collections;
public class CharacterSetup : MonoBehaviour {
private float speed = 6.0f;
private Vector3 moveDirection;
private CharacterController character;
private Animator animator;
// Use this for initialization
void Start () {
//Componentに登録されているCharacterControllerを取得します。
character = GetComponent<CharacterController>();
animator = GetComponent<Animator>();
}
// Update is called once per frame
void Update () {
// 上下キーが押されたら
if(Input.GetAxis("Vertical") != 0){
float varticalMove = Input.GetAxis("Vertical");
animator.SetFloat("speed" , varticalMove);
moveDirection = new Vector3(0 , 0 , varticalMove);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
}
// 左右キーが押されたら
if(Input.GetAxis("Horizontal") != 0){
transform.Rotate(0 , 100 * Time.deltaTime * Input.GetAxis("Horizontal") , 0);
}
character.Move(moveDirection * Time.deltaTime);
}
}
たった三行追加するだけですね。
private Animator animator;
animator = GetComponent<Animator>();
animator.SetFloat("speed" , varticalMove);
変更出来たら実行してみましょう!
走ったー!gontaが走りました!お疲れ様です!
何故走るのか?
animator.SetFloat("speed" , varticalMove);
キモはやはりここになります。
Animatorを作成した時にspeedというパラメータを作成したのを
覚えているでしょうか?
そこに値を渡している、という処理になるのですが、
値を渡すだけでtransitionが働き、自動でIdle→Forwardと状態遷移を行ってくれます。
もちろんIsAttackというフラグを新たに作って攻撃遷移を作ったり、
ジャンプモーションなんか作る場合も、Animatorにパラメータを追加、cs側で値を受け渡すだけでOKです。
別のcsファイルからでも値を渡すだけ、別のゲームにAnimatorを持って行って値を貰えばその状態遷移が出来る、と再利用性の高さが最大のメリットだと思います。
その5につづく
次はゲームステージの作成と当たり判定などをやります。
今回長かった。分割すれば良かったかな。
多分その6ぐらいまで続きます…。