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

左右で方向転換/トップ

Unity2018.1.5f1
Windows10

左右で方向転換/トップ

今回は以前書いた記事の操作方法を整理して紹介します。

【UnityC#講座】ユニティちゃんたちをドラクエっぽく一列に移動や順番変更させる【List、for文、NavMeshAgent】

WS・↑↓キーで前後に移動、AD・←→キーで左右に回転し、ついでにスペースキーでジャンプをするようにしました。

いつものごとくユニティちゃんと床のPlanを出しておいてください。

■AnimatorControllerの設定

AnimatorControllerを出します。

Project > Create > AnimatorController

Stateを出す

まだBlend TreeのState(四角いの)しかありませんが、以下のようになるようにセットしていきます。

左右で方向転換/AnimatorController完成図

罫線上にあるBlend Treeは罫線上で右クリックし、

Create State > From New Blend Tree

で出します。
Jumpはこれも同じようにし、

Create State > Empty

で作り名前をInspector上で変えます。

Blend Treeの設定

次にBlend Treeをクリックしてください。

左右で方向転換/AnimatorController/Blend Tree完成図

この画面を作るため、Blend TreeをクリックしInspectorを設定します。

左右で方向転換/AnimatorController/Blend Tree/Inspector

赤枠のところに注意して設定してください。
Motionの欄の右下の+ボタンでアニメーションを入れる欄を3つ作ります。
後ろ歩き、待機、前走行のアニメーションを入れます。
Thresholdの値の編集は下のAutomate Thresholdsのチェックを外すとできるようになります。

後ろ歩きは-1
待機は0
前走りは1

このようにセットしてください。
次に罫線の画面の左上のBase Layerをクリックして戻ります。

左右で方向転換/AnimatorController/Base Layerに戻る

Parametersの設定

次はParametersを設定します。

左右で方向転換/AnimatorController/Parameters

赤枠のParametersになっているかチェックしてから赤枠の+ボタンをクリックしBoolを選びJumpingと入力します。
BlendはBlend Treeを作った時点で勝手になっているはずですが、なければFloatで作ってください。

Transitionを設定する

TransitionはStateをつなぐ矢印です。
まずはBlend TreeからJumpへ向かうTransitionをクリックしてください。

左右で方向転換/AnimatorController/Transition

そしてInspectorの設定をしましょう。

左右で方向転換/AnimatorController/Transition設定

Has Exit Timeはチェックが入っているとアニメーションを最後まで流します。
そうするとアニメーションの急な切り替えに対応できないのでチェックを外します。
Conditionsは右下の+ボタンを押し空欄を出したらJumpingを選びます。
Blend TreeからJumpに向かう方のTransitionはTrue、戻す方をFalseにしてください。

スポンサーリンク

Jump Stateの設定

これで最後です。
Motionにジャンプのアニメーションを入れてください。
あと名前の欄をJumpにしてインターを押すと罫線上のStateの名前も変わります。

左右で方向転換/AnimatorController/Motion

できたらユニティちゃんのAnimatorにセットします。

左右で方向転換/AnimatorController/Animatorにセット

■スクリプトを書く

タグを設定する

次はユニティちゃんにアタッチするスクリプトを書きますが、その前にタグをセットしましょう。
今回はPlaneにGroundタグをつけ、ユニティちゃんがそれに接している時だけジャンプができるようになります。

PlaneのInspectorの左上を見てください。

左右で方向転換/タグ

Tagの欄のAdd Tagをクリックします。

左右で方向転換/Add Tag

Tagの項の+ボタンをクリック、出てきた入力欄にGroundと入力します。

左右で方向転換/Tagsの+ボタン

そしてまたPlaneのInspectorでGroundをセットします。

左右で方向転換/Groundタグ

スクリプトを書いてアタッチする

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//CapsuleColliderとRigidbodyを追加
[RequireComponent(typeof(CapsuleCollider))]
[RequireComponent(typeof(Rigidbody))]
public class HorizontalRotation : MonoBehaviour {
public Vector3 movePos;
//移動スピード
float speed = 2.5f;
//方向転換のスピード
float angleSpeed = 200;
//
//[SerializeField]bool jumpSwitch = true;
//足場に接しているかどうか
[SerializeField] bool onGround = true;
//Animatorを収納する変数
Animator animator;
//Rigidbodyを入れる
Rigidbody rb;
//Capsule Colliderを入れる
CapsuleCollider caps;
void Start()
{
//AnimatorのComponentを取得する
animator = GetComponent<Animator>();
//Rigidbodyコンポーネントを取得
rb = GetComponent<Rigidbody>();
//RigidbodyのConstraintsを3つともチェック入れて
//勝手に回転しないようにする
rb.constraints = RigidbodyConstraints.FreezeRotation;
//CapsuleColliderコンポーネントを取得
caps = GetComponent<CapsuleCollider>();
//CapsuleColliderの中心の位置を決める
caps.center = new Vector3(0, 0.76f, 0);
//CapsuleColliderの半径を決める
caps.radius = 0.23f;
//CapsuleColliderの高さを決める
caps.height = 1.6f;
}
void Update()
{
//WSキー、↑↓キーで移動する
float z = Input.GetAxisRaw("Vertical") * Time.deltaTime * speed;
//前進の後退
//後退は前進の3分の1のスピードになる
if (z > 0)
{
transform.position += transform.forward * z;
} else
{
transform.position += transform.forward * z / 3;
}
//ADキー、←→キーで方向を替える
float x = Input.GetAxisRaw("Horizontal") * Time.deltaTime * angleSpeed;
transform.Rotate(Vector3.up * x);
//zの値によって待機、前進、後退が切り替わる
animator.SetFloat("Blend", z * 100);
//スペースキーでジャンプ
if (Input.GetButton("Jump") && onGround)
{
//真上に向かって力を与える
rb.AddForce(transform.up * 500);
//ジャンプのアニメーションを出す
animator.SetBool("Jumping", true);
onGround = false;
}
}
//Groundタグのオブジェクトに触れていたら
//ジャンプのアニメーションを消す
void OnCollisionEnter(Collision col)
{
if (col.gameObject.tag == "Ground")
{
animator.SetBool("Jumping", false);
onGround = true;
}
}
}
view raw 29.cs hosted with ❤ by GitHub

アタッチしたらInspectorでRigidbodyとCapsuleColliderがセットされていることを確認してください。
なかったら下のAdd Componentから自力でセットしましょう。

そして動かすとこのようになります。
操作はWS・↑↓キーで前後に移動、AD・←→キーで左右に回転し、スペースキーでジャンプです。

ちゃんと動かせたでしょうか?

■カメラをマウスで動かすスクリプト

ついでにカメラも軽く動かすことにしましょう。

【UnityC#講座】3D人型モデルを三人称視点で動かす【ユニティちゃん】

こちらで紹介した方法を簡略化したもので、マウスを横に移動させるとそれに合わせて回転します。
あとマウスの中ボタンスクロールで距離が変わります。

まず空のオブジェクトを出してAxisと名付け、以下のスクリプトをアタッチしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Axis : MonoBehaviour {
//Cameraが追うオブジェクトをInspectorで入れる
[SerializeField] GameObject target;
//Main CameraをInspectorで入れる
GameObject cam;
//Cameraが回転するスピード
[SerializeField] float rotate_speed = 3;
//Axisの位置を指定する変数
[SerializeField] Vector3 axisPos;
//マウススクロールの値を入れる
[SerializeField] float scroll;
//マウスホイールの値を保存
[SerializeField] float scrollLog;
void Start()
{
//Main Cameraを取得
cam = Camera.main.gameObject;
//取得したMain Cameraをこのオブジェクトの子にする
cam.transform.parent = this.transform;
//CameraのAxisに相対的な位置をlocalPositionで指定
cam.transform.localPosition = new Vector3(0, 5, -10);
}
void Update()
{
//Axisの位置をユニティちゃんの位置+axisPosで決める
transform.position = target.transform.position + axisPos;
//マウススクロールの値を入れる
scroll = Input.GetAxis("Mouse ScrollWheel") * 10;
//マウススクロールの値は動かさないと0になるのでここで保存する
scrollLog += Input.GetAxis("Mouse ScrollWheel");
//Cameraの位置、Z軸にスクロール分を加える
cam.transform.localPosition
= new Vector3(cam.transform.localPosition.x,
cam.transform.localPosition.y,
cam.transform.localPosition.z + scroll);
//マウスのX方向への移動の値をY軸に入れる
transform.eulerAngles += new Vector3(
0,
Input.GetAxis("Mouse X") * rotate_speed
, 0);
//Cameraをtargetのオブジェクトの方向に常に向かせる
cam.transform.LookAt(target.transform.position);
}
}
view raw 29a.cs hosted with ❤ by GitHub

結果はこのようになります。

左右で方向転換/Cameraをスクリプトで動かす

今回はこれで終わります。

■関連記事

【UnityC#講座】Cameraをターゲットに向かせる、画面を分割する、切り替える

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

【UnityC#講座】ユニティちゃんの表情を替える【SetLayerWeight】

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

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

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

スポンサーリンク

目次に戻る