Unity3Dでキャラクター(プレイヤー)を移動させる2つの方法を実装していきます。
はじめに
「Unity 2020.3.26f1」ヴァージョンで作成しています。
3Dゲームで「キーボード入力」、「ゲームパット入力」などで、プレイヤー(キャラクター)を動かす二つの方法を実装していきます。
実装開始
まずは簡単にサンプル画面を作成してから実装していきます。
サンプル画面の作成
新規でシーンを作成。SolidColorに変更しておきます。
3Dオブジェクトの平面を追加して名前をGroundに、スケールも変更して広くしておきます。
次にプレイヤーとなるオブジェクトを追加、何でも良いですが、Sphere(球体)を追加。
名前をPlayerにしておきます。
分かりやすいように、マテリアルを作成して色を付けておきます。
プレイヤーにリジッドボディを追加。
スクリプトも追加しておきます。名前はPlayerMovementに。
これで事前準備が整いました。
InputManagerで実装
まずは昔からある「InputManager」を利用して移動する方法です。スクリプトを下記にします。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMovement : MonoBehaviour { [SerializeField] private float PlayerSpeed; private Rigidbody _rigidbody; private float movementX; private float movementZ; private Vector3 movement; void Start() { _rigidbody = GetComponent<Rigidbody>(); } void Update() { movementX = Input.GetAxisRaw("Horizontal"); movementZ = Input.GetAxisRaw("Vertical"); movement = new Vector3(movementX, 0.0f, movementZ); _rigidbody.velocity = movement * PlayerSpeed; } }
垂直、水平方向の入力を受け取りプレイヤーを動かしています。PlayerSpeedをセットして動けばOK
InputSystemで実装
次に「InputSystem」を利用して移動する方法です。
まずはPackageManagerからInputSystemをインストール
警告画面が出てくるのでYesを選択。簡単にいうとInputManagerを無効にしてInputSystemを有効にしてUnityを起動しなおすって感じですね。
Yesを選択すると、「ProjectSettings…」にあるPlayerの「Active Input Handing」が変更されます。Noを選択した場合はここで変更。
inputSystemPackage(New)にチェックがある状態で、InputManagerを動かすと、下記のエラーが表示されます。
InvalidOperationException: You are trying to read Input using the UnityEngine.Input class, but you have switched active Input handling to Input System package in Player Settings.
この場合、InputManager(Old)にするかBothに変更すればエラーは解消されます。Bothは両方って言う意味ですね。
PlayerInputの設定
設定がOKなら、PlayerにAddComponentでPlayerInputを追加。
「CreateActions…」で新規作成。名前は適当に「inputAction」にしておきます。
初期状態でいくつかのアクションが設定されているので、動かすだけなら特に変更する点はなし。
スクリプトは下記に変更。OnMoveでキー入力が取得できます。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; public class PlayerMovement : MonoBehaviour { [SerializeField] private float PlayerSpeed; private Rigidbody _rigidbody; private Vector3 movement; void Start() { _rigidbody = GetComponent<Rigidbody>(); } void OnMove(InputValue movementValue) { Vector2 movementVector = movementValue.Get<Vector2>(); movement = new Vector3(movementVector.x, 0.0f, movementVector.y); } void Update() { _rigidbody.velocity = movement * PlayerSpeed; } }
とりあえずプレイヤーを動かすだけです。
(Old)、(New)とあるので、InputSystemを使った方が良いのかな?ま、両方知っておけば損は無い気もするので、InputSystemを細かく見ていきたいかな。と思う今日この頃。