【UnityC#講座】ユニティちゃんでもっとスカイリム風に操作したい 前編【カメラ】
この記事の続きです。
■Animator Controllerを設定する
次はユニティちゃんにアニメーションさせるためにAnimator Controllerの設定をします。
名前は「UnityChanAnime」にしました。
Project > Create > Animator Controller
Stateの設定をする
Stateは長方形のものです。
画面上を右クリックして以下のように操作して出します。
Create State > Empty
一番最初に出したものがEntryとつながります。
名前はInspectorに入力してインターで変えられます。
Stateはドラッグして動かし、マウスホイールの回転でズームアップ&アウトができます。
Stateは6つ出して以下のように名付けてください。
Idle
Front
Back
Right
Left
Jump
Motionを設定する
次はStateのInspectorでMotionを設定します。
Motionの空欄の右端の丸ぽちをクリックし、ユニティちゃんアセットに付属していたアニメーションを入れます。
それぞれこのような名前のものを入れてください。
Idle > WAIT00
Front > RUN00_F
Back > WALK00_B
Right > RUN00_R
Left > RUN00_L
Jump > JUMP00
Parametersの設定をする
次は左上にあるParametersをクリックします。
その右下にある+ボタンをクリックしてBoolを選びます。
そして画像のようにFront、Back、Right、Left、Jumpの5つを作ってください。
Transitionの設定をする
TransitionはStateをつなぐ矢印の線です。
矢印を出す方のStateを右クリックしてMake Transitionを選び、つなげたいStateをクリックします。
AnyStateから4つのStateにつながり、そこからExitにつながります。
JumpはExitにつながるだけです。
次はAny Stateから伸びるTransitionをクリックしてそのInspectorを見てください。
Settingsをクリックすると出てくるCan Transition Toのチェックを外します。
このチェックが入っていると連続でアニメーションを作動させるのでおかしな動きになります。
次は下部のConditionsの+ボタンをクリックしてください。
つながっているStateと同じ名前のParametersをセットしTrueにします。
これを4つともやってください。
それが済んだら今度はその4つのStateからExitにつながるTransitionの設定をします。
まず4つともHas Exit Timeのチェックを外してください。
このチェックが入っているとアニメーションを最後まできっちり流すので不自然になります。
次にまたConditionsの設定をStateと同じ名前のParametersでしますが今度はFalseにします。
最後はJumpからExitに伸びているTransitionですが、こちらは最後までアニメーションを流したいのでHas Exit Timeのチェックを外しません。
ConditionsにJumpのFalseを入れるだけで良いです。
これでAnimator Controllerの設定は終わりです。
PlayerのAnimatorに入れましょう。
スポンサーリンク
■ユニティちゃんを動かす
Playerのスクリプトを書く
さあまずはPlayerを動かす「PlayerController」スクリプトを書きましょう。
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class PlayerController : MonoBehaviour { | |
//Rigidbodyを入れる | |
Rigidbody rb; | |
//移動スピード | |
public float speed = 2f; | |
//ジャンプ力 | |
public float thrust = 150; | |
//Animatorを入れる変数 | |
private Animator animator; | |
//カメラを入れる | |
[SerializeField] private Transform came; | |
//ユニティちゃんを入れる | |
[SerializeField] private GameObject unityChan; | |
//前後左右移動とそのアニメーションへの遷移を止める | |
[SerializeField]bool stopMove; | |
void Start() | |
{ | |
rb = GetComponent<Rigidbody>(); | |
animator = GetComponent<Animator>(); | |
} | |
void Update() | |
{ | |
//A・Dキー、←→キーで横移動 | |
float x = Input.GetAxisRaw("Horizontal") * Time.deltaTime * speed; | |
//W・Sキー、↑↓キーで前後移動 | |
float z = Input.GetAxisRaw("Vertical") * Time.deltaTime * speed; | |
//Trueの時は前後左右移動とそのアニメーションへの遷移が可能 | |
if (stopMove) | |
{ | |
//前移動 | |
if (z > 0) | |
{ | |
//前移動中の時はユニティちゃんがカメラの方向を向く | |
transform.rotation = Quaternion.Euler(new Vector3(transform.rotation.x, | |
came.eulerAngles.y, transform.rotation.z)); | |
//前走りのアニメーションへ遷移 | |
animator.SetBool("Front", true); | |
} | |
else | |
{ | |
//前走りのアニメーションからExitへ遷移 | |
animator.SetBool("Front", false); | |
} | |
//後ろ移動 | |
if (z < 0) | |
{ | |
animator.SetBool("Back", true); | |
} | |
else | |
{ | |
animator.SetBool("Back", false); | |
} | |
//右移動 | |
if (x > 0) | |
{ | |
animator.SetBool("Right", true); | |
} | |
else | |
{ | |
animator.SetBool("Right", false); | |
} | |
//左移動 | |
if (x < 0) | |
{ | |
animator.SetBool("Left", true); | |
} | |
else | |
{ | |
animator.SetBool("Left", false); | |
} | |
} | |
//stopMoveがFalseになったら前後左右移動アニメからExitに遷移する | |
else | |
{ | |
animator.SetBool("Front", false); | |
animator.SetBool("Back", false); | |
animator.SetBool("Right", false); | |
animator.SetBool("Left", false); | |
} | |
//Playerの位置に前方x上下キーと右方向x左右キーの値を加え続けて移動 | |
transform.position += transform.forward * z + transform.right * x; | |
//Jumpはスペースキーかジョイスティックのボタン3 | |
//それらとstopMove変数がTrueの時ジャンプできる | |
if (Input.GetButton("Jump") && stopMove) | |
{ | |
//前後左右移動アニメをオフにする | |
animator.SetBool("Front", false); | |
animator.SetBool("Back", false); | |
animator.SetBool("Right", false); | |
animator.SetBool("Left", false); | |
//thrustの分だけ上方に力がかかる | |
rb.AddForce(transform.up * thrust); | |
//CharacterController上のどこを遷移していてもJumpアニメーションを出せる | |
animator.Play("Jump"); | |
} | |
} | |
//GroundDecisionスクリプトから呼び出す | |
public void GroundDecisionTrue() | |
{ | |
//地面にGroundDecisionのコライダーが触れていたらTrue | |
stopMove = true; | |
//地面に触れている時はジャンプアニメーション出ない | |
animator.SetBool("Jump", false); | |
} | |
//GroundDecisionスクリプトから呼び出す | |
public void GroundDecisionFalse() | |
{ | |
//地面からGroundDecisionのコライダーが離れたらFalse | |
stopMove = false; | |
} | |
} |
WASDキー、あるいは上下左右キーで移動、向きはカメラが向く方向で変えてスペースキーでジャンプします。
できたらPlayerに入れてください。
PlayerのInspectorの設定をする
Playerにスクリプトを入れたら次はInspectorの設定をします。
CameにMain Cameraを、Unity ChanにはunitychanをそれぞれHierarchyからドラッグ&ドロップするか空欄の右にある丸をクリックして選択します。
これだけでも一応動きますがまだ地面に接しているという判定ができていないのでアニメーションとジャンプができません。
さて、最後の仕上げと行きましょう。
地面判定のスクリプトを書く
GroundDecisionに入れる同名の「GroundDecision」スクリプトを書きます。
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class GroundDecision : MonoBehaviour { | |
//Playerを変数にする | |
GameObject player; | |
//PlayerControllerを変数にする | |
PlayerController pc; | |
void Start () { | |
//親オブジェクトのPlayerを検索して変数に入れる | |
player = transform.root.gameObject; | |
//PlayerにアタッチしているPlayerControllerスクリプトを入れる | |
pc = player.GetComponent<PlayerController>(); | |
} | |
//地面に接している間、PlayerControllerの | |
//GroundDecisionTrue();を呼び続ける | |
void OnTriggerStay(Collider other) | |
{ | |
pc.GroundDecisionTrue(); | |
} | |
//地面から離れた時、PlayerControllerの | |
//GroundDecisionFalse();を呼び続ける | |
void OnTriggerExit(Collider other) | |
{ | |
pc.GroundDecisionFalse(); | |
} | |
} |
できたらGroundDecisionへドラッグ&ドロップです。
あとGroundDecisionのSphere ColliderのIs Triggerにチェックが入っているかチェックしてください。
されていたらさっそく動かしてみましょう。
□
今回はここまでです。
お疲れさまでした。
この作品はユニティちゃんライセンス条項の元に提供されています
■他に使用したアセット
Terrainの装飾に使いました。
■関連記事
【UnityC#講座】3D人型モデルの動かし方をユニティちゃんで学ぶ【Animator】
【UnityC#講座】ユニティちゃんにキソラちゃんがついてくるようにする【NavMeshAgent、Blend Tree】
【UnityC#講座】ユニティちゃんをスカイリム風に操作する
【UnityC#講座】ユニティちゃんでもっとAnimator Controllerを上手く使いたい
【UnityC#講座】AnimatorControllerを使いまわす【AnimatorOverrideController】
【UnityC#講座】AnimatorControllerの使い方
【UnityC#講座】ユニティちゃんをマウスカーソルの方向に移動させる
【UnityC#講座】上下キーで前進後退、左右キーで方向替える移動法【ユニティちゃん】
スポンサーリンク