Categories: Unity

Unity:Standard AssetsのFirstPersonCharacterをマウスドラッグの視点操作に改造

今回は Standard Assets に含まれるスクリプト RigidbodyFirstPersonController を改造してマウス左ドラッグでカメラの視点操作ができるように改造してみました。

以前の記事 マウスドラッグでカメラを回転して視点を操作するスクリプト ではカメラ位置の操作ができませんでしたが、今回は Standard Assets スクリプトを改造する方法でカメラ位置の操作ができるようにしてみます。

シーンの作成

まずは Asset Store から Standard Assets をダウンロードしてプロジェクトにインストール。今回使用する Unity のバージョンは 2019.2.0f1 です。

次にシーンの作成。 以前の記事で使用している室内シーンを流用しました。模様替えをして Asset Store から別の床マテリアル Wooden Floor Materials を使用してみます。

こんな感じになりました。

RigidbodyFirstPersonControllerをシーンに追加

FPSキャラクターをシーンに追加します。

[Project]ウィンドウ > Assets > > Standard Assets > Characters > FirstPersonCharacter > Prefabs > RigidbodyFirstPersonController をシーンに追加します。
[Hierarchy]ウィンドウから RigidbodyFirstPersonController を選択してプレハブを分解しておきます。

視点操作を制御するスクリプトをいったん削除します。[Inspector]ウィンドウ > Rigidbody First Person Controller (Script) コンポーネントの歯車ボタン > Remove Component を選択。

ついでに子階層の Camera にアタッチされているコンポーネント Head bob (Script) は使用しないので削除します。

スクリプトの複製と改造

スクリプトファイル RigidbodyFirstPersonController を直接編集しないで、複製して別ファイルとして編集します。

[Project]ウィンドウ > Assets > > Standard Assets > Characters > FirstPersonCharacter > Scripts > RigidbodyFirstPersonController を複製して名前を RigidbodyFirstPersonController _mod に変更。

複製したスクリプトをエディタで開き、クラス名もファイル名と同じ RigidbodyFirstPersonController _mod に変更しておきます。

using System;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

namespace UnityStandardAssets.Characters.FirstPerson
{
    [RequireComponent(typeof(Rigidbody))]
    [RequireComponent(typeof(CapsuleCollider))]
    public class RigidbodyFirstPersonController_mod : MonoBehaviour

視点操作は、関数 Update() 処理の中で関数 RotateView() が実行されることで制御されています。関数 RotateView() の処理内容を見ると、別のスクリプトファイル MouseLook を呼び出して処理を行っていることが分かりました。

今回の改造内容はシンプルな方法として、関数 Update() 処理の中で実行されている関数 RotateView() の実行条件にマウス左ドラッグを追加することにしました。

さらにUIオブジェクトのトグルボタンで視点操作方法を切り替えるための処理として ChangeRotationMode()を追加。改造した部分のスクリプトはこのようになりました。マーカー行が改造部分です。

private void Start()
{
      m_RigidBody = GetComponent<Rigidbody>();
      m_Capsule = GetComponent<CapsuleCollider>();
      mouseLook.Init(transform, cam.transform);
}

// 視点操作切替えフラグ
public bool dragRotateView;

// ゲーム実行中の毎フレーム処理
private void Update()
{
      // 視点操作切替えフラグが false(視点移動がノーマルの場合)
      if (!dragRotateView)
      {
            // 視点移動処理を実行
            RotateView();
      }
      // 視点操作切替えフラグが true(マウス左ドラッグ視点移動が有効の場合)
      else if (CrossPlatformInputManager.GetButton("Fire1"))
      {
            // 視点移動処理を実行
            RotateView();
      }

      if (CrossPlatformInputManager.GetButtonDown("Jump") && !m_Jump)
      {
            m_Jump = true;
      }
}

// 視点操作切替え処理
public void ChangeRotationMode()
{
      // 判定フラグ変数"dragRotationMode"が"false"であれば
      if (!dragRotateView)
      {
            // 判定フラグ変数"dragRotationMode"に"true"を代入
            dragRotateView = true;
      }
      // でなければ(判定フラグ変数"dragRotationMode"が"true"であれば)
      else
      {
            // 判定フラグ変数"dragRotationMode"に"false"を代入
            dragRotateView = false;
      }
}

コンポーネントの設定

作成したスクリプトファイル RigidbodyFirstPersonController_mod をシーンに配置したRigidbodyFirstPersonControllerにアタッチ。[Inspector]ウィンドウ > Rigidbody First Person Controller (Script) コンポーネントの Cam フィールドに Main Camera を割り当て。移動速度やその他パラメータを調整します。Run Key 、Jump Force、Lock Cursor は無効にしました。

UIオブジェクトの作成

視点操作方法を切り替えるためのUIオブジェクトの Toggle を使用しました。

UIオブジェクトの Toggle のスクリプト Toggle (script) コンポーネントの On Value Changed (Boolean) プロパティはオブジェクトに RigidBodyFPSController を設定。 Function には RigidbodyFirstPersonController_mod > ChangeRotationMode() を設定します。

最後に、部屋が空っぽだとなんだか寂しいので、Asset Store から Acquire-Chan 3D Model を置いてみました。

WebGLビルド

今回の内容をWebGLでビルドしてみました。 画像クリックでファイルがダウンロード、再生されます。(ダウンロードサイズ:約15MB)

画面右下のトグルボタン Drag Rotate View で視点操作を切り替えられます。

  • キャラクター移動:前 W、左 A、後 S、右 Dキー
  • 視点移動:マウス移動/ マウス左ドラッグ

このコンテンツは アクワイアちゃんライセンス で提供されています。

今回の改造の問題点

マウスドラッグの視点移動が停止する前にマウスボタンを離した場合、次に左クリックした際、前回マウスボタンを離した座標に向かって視点移動が発生します。

これは視点移動を行う関数 RotateView() の実行処理をマウスボタンを離すことで強制終了しているからでしょう。やはり関数 RotateView() を改造してマウスドラッグで制御できるようにした方が良さそうなので、改めて試してみたいと思います。

corevale