【UnityC#講座】ユニティちゃんでもっとスカイリム風に操作したい 後編【Animator Controller】

【UnityC#講座】ユニティちゃんでもっとスカイリム風に操作したい 前編【カメラ】

この記事の続きです。

■Animator Controllerを設定する

次はユニティちゃんにアニメーションさせるためにAnimator Controllerの設定をします。
名前は「UnityChanAnime」にしました。

Project > Create > Animator Controller

Stateの設定をする

もっとスカイリム風/Animator Controller/State

Stateは長方形のものです。
画面上を右クリックして以下のように操作して出します。

Create State > Empty

一番最初に出したものがEntryとつながります。
名前はInspectorに入力してインターで変えられます。
Stateはドラッグして動かし、マウスホイールの回転でズームアップ&アウトができます。

Stateは6つ出して以下のように名付けてください。

Idle
Front
Back
Right
Left
Jump

Motionを設定する

もっとスカイリム風/Animator Controller/Motion

次はStateのInspectorでMotionを設定します。
Motionの空欄の右端の丸ぽちをクリックし、ユニティちゃんアセットに付属していたアニメーションを入れます。
それぞれこのような名前のものを入れてください。

Idle > WAIT00
Front > RUN00_F
Back > WALK00_B
Right > RUN00_R
Left > RUN00_L
Jump > JUMP00

Parametersの設定をする

もっとスカイリム風/Animator Controller/Parameters

次は左上にあるParametersをクリックします。
その右下にある+ボタンをクリックしてBoolを選びます。
そして画像のようにFront、Back、Right、Left、Jumpの5つを作ってください。

Transitionの設定をする

もっとスカイリム風/Animator Controller/Transition

TransitionはStateをつなぐ矢印の線です。
矢印を出す方のStateを右クリックしてMake Transitionを選び、つなげたいStateをクリックします。
AnyStateから4つのStateにつながり、そこからExitにつながります。
JumpはExitにつながるだけです。

もっとスカイリム風/Animator Controller/Transition/Settings

次はAny Stateから伸びるTransitionをクリックしてそのInspectorを見てください。
Settingsをクリックすると出てくるCan Transition Toのチェックを外します。
このチェックが入っていると連続でアニメーションを作動させるのでおかしな動きになります。

もっとスカイリム風/Animator Controller/Transition/Conditions

次は下部のConditionsの+ボタンをクリックしてください。
つながっているStateと同じ名前のParametersをセットしTrueにします。
これを4つともやってください。

もっとスカイリム風/Animator Controller/Transition/Has Exit Time

それが済んだら今度はその4つのStateからExitにつながるTransitionの設定をします。
まず4つともHas Exit Timeのチェックを外してください。
このチェックが入っているとアニメーションを最後まできっちり流すので不自然になります。

もっとスカイリム風/Animator Controller/Transition/Conditions/False

次にまたConditionsの設定をStateと同じ名前のParametersでしますが今度はFalseにします。

もっとスカイリム風/Animator Controller/Transition/Conditions/Jump

最後はJumpからExitに伸びているTransitionですが、こちらは最後までアニメーションを流したいのでHas Exit Timeのチェックを外しません。
ConditionsにJumpのFalseを入れるだけで良いです。

これでAnimator Controllerの設定は終わりです。
PlayerのAnimatorに入れましょう。

もっとスカイリム風/Animator Controller/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;
}
}
view raw 16a.cs hosted with ❤ by GitHub

WASDキー、あるいは上下左右キーで移動、向きはカメラが向く方向で変えてスペースキーでジャンプします。

できたらPlayerに入れてください。

PlayerのInspectorの設定をする

もっとスカイリム風/PlayerController設定

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();
}
}
view raw 16b.cs hosted with ❤ by GitHub

できたらGroundDecisionへドラッグ&ドロップです。
あとGroundDecisionのSphere ColliderのIs Triggerにチェックが入っているかチェックしてください。

もっとスカイリム風/GroundDesicion/Spehe Collider/Is Triggerにチェック

されていたらさっそく動かしてみましょう。

もっとスカイリム風/完成

今回はここまでです。
お疲れさまでした。

ユニティちゃんライセンス

この作品はユニティちゃんライセンス条項の元に提供されています

■他に使用したアセット


Terrainの装飾に使いました。

■関連記事

【UnityC#講座】3D人型モデルの動かし方をユニティちゃんで学ぶ【Animator】

【UnityC#講座】ユニティちゃんにキソラちゃんがついてくるようにする【NavMeshAgent、Blend Tree】

【UnityC#講座】ユニティちゃんをスカイリム風に操作する

【UnityC#講座】ユニティちゃんでもっとAnimator Controllerを上手く使いたい

【UnityC#講座】AnimatorControllerを使いまわす【AnimatorOverrideController】

【UnityC#講座】AnimatorControllerの使い方

【UnityC#講座】ユニティちゃんをマウスカーソルの方向に移動させる

【UnityC#講座】上下キーで前進後退、左右キーで方向替える移動法【ユニティちゃん】

スポンサーリンク

目次に戻る