Unity

【Unity】プレイヤーキャラクターを動かす方法(矢印の方向に移動させるタイプ)【カメラ固定ゲーム向き】

本記事内には、アフィリエイトリンクを含む場合があります

Unity初心者は、まず初めに

”プレイヤーキャラクターを動かしたい(操作したい)”

と思うのが、世の常ではないでしょうか?

 

安心してください。

コードいらずで、簡単に実装できます!

 

私が知っている方法は、2つあります。

1つは、以前紹介した
Standard Assets (for Unity 2018.4)に入っているコードを、
操作したいモデルにアタッチする方法です↓

【ゲーム開発】VRoid Studioで作成したモデルをUnityで動かすまで【vrmファイルの導入とStandard Assets制御の適用】VRoid Studioは、 手軽に動かす3Dキャラクターモデルを製作するのに、とても便利なツールです。 これを使えば、 自分...

上の記事では、”VRoid Studio”という誰でも簡単にオリジナルキャラクターを作れるソフトから、モデルをもってきて動かす流れで説明していますが、
他にどんなモデルでも動かせます(Humanoidであれば)。

そして、

もう1つの方法は、
Unity-Chan! Modelというアセットに入っているコードをアタッチする。

本記事では、後者の方法を紹介します。

<完成イメージ>

 

1.2つの方法の使い分け

なぜ本ブログで2つの方法を紹介するのかというと、両者で動かし方が異なるからです。

Standard Assets (for Unity 2018.4)”のコードは、
グランドセフトオートや三國無双のような
左右のコマンドでキャラクターの向きを変える仕様となっています。

一方、
Unity-Chan! Model”のコードは、
方向キーの通りに、上下左右に移動(そちらを向いて前進)する仕様となっています。

クラッシュバンディクーやメタルギア、ボンバーマンのようなものです。

(プレステ1、2世代なので、最近のゲームで例えられません^^;)

2つの方法を知っておくと、作りたいゲームによって使い分けられますね。

触っているうちに詳しくなって、自分でコードを書いてカスタムを計れるようになってくるでしょう。

まずは、作れる体験をするのが大事!

簡単なのでサクッといってみましょう。

2.モデルとアセットの準備

プレイヤーキャラクターとして、操作したいモデルをUnityのassetsフォルダに入れてください。

(ファイルをドラッグ&ドロップで可能です)

Blenderなどから持ってくる場合は、fbxファイルとして出力したものが良いです。

VRoid Studioなどで作成したモデル(vrmファイル)の場合は、Unityで扱えるようにする外部Packageをインポートする必要があります。

その方法も、こちらに書いてます↓

【ゲーム開発】VRoid Studioで作成したモデルをUnityで動かすまで【vrmファイルの導入とStandard Assets制御の適用】VRoid Studioは、 手軽に動かす3Dキャラクターモデルを製作するのに、とても便利なツールです。 これを使えば、 自分...

動かしたいモデルの準備がない人は、Unityのアセットストアから無料で使えるモデルが配布されているので、それを使用して、モデルを動かせるか試してみてください。

 

モデルをUnityに入れたら、そのRig設定で「Humanoid」を選択し、Applyを押します。

ここでエラーとなる場合は、モデルのリギングが上手くできていません(ダウンロードしたものの中には、ボーンすら仕込まれていないことも)。

そして、モデルをSceneに配置します。
動かすための場として、Cubeを地面様になるように作成しておきます(TransformをX:20、Z:20にするなど)。

ちなみに、モデルのMaterialの割り当ては、それからでもできます。

 

次に、動かすためのコードを入手しましょう。

アセットストアから、"Unity-Chan! Model"というアセットをダウンロード&インポートします。

3.モデルに動かすコンポートネントを設定する

Sceneに配置したモデルに対して、以下のコンポーネントをアタッチし、パラメータ等を設定します。

※モデルを配置したら、キャラが真っ黒になりますが、それは仕様で、逆光となってしまうからです。RotationのY:180にすることは習慣づけましょう^^;

Animator

HumanoidでApplyしたモデルであれば、自動でついています。

Controllerの丸いところ(◎)をクリックし、「UnityChanLocomotions」に変えます。

 

Character Controller

プレイヤーキャラクターの行動制限やコライダー(当たり判定スペース)の設定となります。

「Add Component」で「Character Controller」を検索し、アタッチしましょう。

各パラメータの数値は、お使いのモデルに適した数値を設定してください。
(Center YやHeight、Radiusはモデルに適した大きさに設定へ)

 

Character Control Script

「Add Component」をクリックして、”Character”と入力しただけで、候補として出てくるコンポーネントです(unity-chan!Modelをインポートしてるため)。

★★2021年8月訂正★★
残念なことに"Unity-Chan!Model"に「CharacterControlScript」が含まれなくなったみたいです。
でも、大丈夫。次のスクリプトを作成してアタッチしてください。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterControlScript : MonoBehaviour
{
//移動処理に必要なコンポーネントを設定
    public Animator animator;                 //モーションをコントロールするためAnimatorを取得
    public CharacterController controller;    //キャラクター移動を管理するためCharacterControllerを取得
 
    //移動速度等のパラメータ用変数(inspectorビューで設定)
    public float speed;         //キャラクターの移動速度
    public float jumpSpeed;     //キャラクターのジャンプ力
    public float rotateSpeed;   //キャラクターの方向転換速度
    public float gravity;       //キャラにかかる重力の大きさ
 
    Vector3 targetDirection;        //移動する方向のベクトル
    Vector3 moveDirection = Vector3.zero;

 
    // Start関数は変数を初期化するための関数
    void Start () {
		
	}
	
	// Update関数は1フレームに1回実行される
	void Update () {
 
        moveControl();  //移動用関数
        RotationControl(); //旋回用関数

 
        //最終的な移動処理
        //(これが無いとCharacterControllerに情報が送られないため、動けない)
        controller.Move(moveDirection * Time.deltaTime);
    }
 
    void moveControl()
    {
     //★進行方向計算
        //キーボード入力を取得
        float v = Input.GetAxisRaw("Vertical");         //InputManagerの↑↓の入力       
        float h = Input.GetAxisRaw("Horizontal");       //InputManagerの←→の入力
 
        //カメラの正面方向ベクトルからY成分を除き、正規化してキャラが走る方向を取得
        Vector3 forward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized;   
        Vector3 right = Camera.main.transform.right; //カメラの右方向を取得
 
        //カメラの方向を考慮したキャラの進行方向を計算
        targetDirection = h * right + v * forward;
 
     //★地上にいる場合の処理
        if (controller.isGrounded)      
        {
            //移動のベクトルを計算
            moveDirection = targetDirection*speed;
 
            //Jumpボタンでジャンプ処理
            if (Input.GetButton("Jump"))    
            {
                moveDirection.y = jumpSpeed;
            }
        }
        else        //空中操作の処理(重力加速度等)
        {
            float tempy = moveDirection.y;
            //(↓の2文の処理があると空中でも入力方向に動けるようになる)
            moveDirection = Vector3.Scale(targetDirection, new Vector3(1, 0, 1)).normalized; //◆ コメントアウト解除
            moveDirection *= speed; //◆ コメントアウト解除
            moveDirection.y = tempy - gravity * Time.deltaTime;
        }
 
     //★走行アニメーション管理
        if (v > .1 || v < -.1 || h > .1 || h < -.1) //(移動入力があると)
        {
            animator.SetFloat("Speed", 1f); //キャラ走行のアニメーションON
        }
        else    //(移動入力が無いと)
        {
            animator.SetFloat("Speed", 0f); //キャラ走行のアニメーションOFF
        }
    }
 
    void RotationControl()  //キャラクターが移動方向を変えるときの処理
    {
        Vector3 rotateDirection = moveDirection;
        rotateDirection.y = 0;
 
        //それなりに移動方向が変化する場合のみ移動方向を変える
        if (rotateDirection.sqrMagnitude > 0.01)
        {
            //緩やかに移動方向を変える
            float step = rotateSpeed * Time.deltaTime;
            Vector3 newDir = Vector3.Slerp(transform.forward, rotateDirection, step);
            transform.rotation = Quaternion.LookRotation(newDir);
        }
    }
}

 

アタッチしたら、AnimatorやControllerの空欄に、上記のコンポーネントをドラッグ&ドロップします。

その他パラメータは、図のように任意に設定します。

これらのコンポーネントを設定すれば、もう動きます!

実行してみてください。

★もし動かない場合★

Animatorの「Apply Root Motion」のチェックを外してみてください。

「Min Move Distance」の値を少し大きくしたりすると改善することも…。

このコードでは、矢印キーの「←↑↓→」または「AWSD」でカメラが映し出す空間を基準に、移動方向が決まります。

なので、カメラの位置設定に注意しましょう。

以上~

ABOUT ME
いなも@システマライフハッカー
”仙豆”を開発することを夢見て、健康食品会社で働いていたものの、2016年に出会ったロシアの武術”システマ”こそ、その糸口があると感銘し、勝手にシステマ普及活動を始める。 一方で、クリエイティブなモノ作りが好きで、DX社会で楽しみを見出せる"Unity”を活かして、”スマートかつ快適な暮らし”のヒントを発信している。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA