古い移動方法と新しい移動方法について【Unityゲーム制作】

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を細かく見ていきたいかな。と思う今日この頃。

タイトルとURLをコピーしました