んななのゲーム開発備忘録

ゲーム制作の進捗と開発メモなど掲載しています。

UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かしてすーっと止める

UnityではRigidBodyコンポーネントのAddForce()で力を加えて徐々に加速させられます。
どんどん加速していくのでゲームに使う時は速度制限が必要です。
そんな時に使えるTipsです。

手っ取り早く使いたい方は

RigidBody _rb;
Vector3 _moveVector;                  // 移動速度の入力
public float moveForceMultiplier;     // 移動速度の入力に対する追従度
_rb.AddForce(moveForceMultiplier * (moveVector - _rb.velocity));

を使えばおっけーです。moveVectorは目的に応じて中身が変わります。
これを使うとどう動くか見たい場合は記事の一番最後の動画を見てみてください(。・ω・。)


どういうもの?

RigidBodyのAddForce()を使ってキャラクターなどを移動する際は最大の移動速度を決めておいて、
それ以上の速度になった時にAddForce()をやめるっていう方法をよく見ます。

簡単でわかりやすい方法ですが、キャラクターを止める力が働かないので移動速度が速くなってしまうと
全然止まらないのが欠点だと思います。

今回紹介するのはAddForceの引数に移動させたい速度の入力と、現在の移動速度を含めることで
すーっと動きはじめて、すーっと動きが止まる、そんな移動方法です。


実装

ソースコードは次の通り。

RigidBody _rb;
public bool isUseCameraDirection;    // カメラの向きに合わせて移動させたい場合はtrue
public float moveSpeed;              // 移動速度
public float moveForceMultiplier;    // 移動速度の入力に対する追従度
public GameObject mainCamera;
float _horizontalInput;
float _verticalInput;

void Start()
{
    _rb = GetComponent<RigidBody>();

    if(mainCamera == null)
        mainCamera = GameObject.FindGameObjectWithTag("MainCamera");
}

void Update()
{
    _horizontalInput = Input.GetAxis("Horizontal");
    _verticalInput = Input.GetAxis("Vertical");
}

void FixedUpdate()
{
    Vector3 moveVector = Vector3.zero;    // 移動速度の入力

    if(isUseCameraDirection)
    {
        Vector3 cameraForward = mainCamera.transform.forward;
        Vector3 cameraRight = mainCamera.transform.right;
        cameraForward.y = 0.0f;    // 水平方向に移動させたい場合はy方向成分を0にする
        cameraRight.y = 0.0f;

        moveVector = moveSpeed * (cameraRight.normalized * _horizontalInput + cameraForward.normalized * _verticalInput);
    } else
    {
        moveVector.x = moveSpeed * _horizontalInput;
        moveVector.z = moveSpeed * _verticalInput;
    }

    _rb.AddForce(moveForceMultiplier * (moveVector - _rb.velocity));
}


すーっと止まるのは

_rb.AddForce(moveForceMultiplier * (moveVector - _rb.velocity));

この行で入力移動速度と現在の移動速度の差に応じて力を加えるからで、
入力がなくなったときには入力移動速度は0になるので、減速する方向に力が加わるって寸法ですね( -v- 。)

参考にmoveForceMultiplierを変化させたときのキャラクターの挙動を示した動画を載せておきます。
値が大きいほどきびきび動きます。
好みに合わせて値を設定するとよさそうです。


UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かす(その1)

UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かす(その2)

UnityでRigidBodyのAddForce()に速度制限をつけてすーっと動かす(その3)


以上、Unityのキャラクターの移動方法に関するTipsでした。

Arbor2のUISetTextFromParametersで書式指定してテキスト表示する

ゲームエンジンUnityのステートマシンエディタアセットArbor 2 を使って

UIのテキストに書式指定で値を表示しようとしてちょっと手間取った話です。

 

手っ取り早く方法だけ知りたい方は

「UISetTextFromParametersのBehaviorで書式指定方法はToString()メソッドと同じ」

だけ覚えておけばおっけーです!

(stringの書式指定はstring.formatの{0:F2}とかしか使ったことなかったので時間がかかってしまったのです)

 

Arbor 2はステートマシン(こういう時、こういう条件を満たしたらこれをするというのを図で表したもの)を使ってゲームの挙動が作れる便利アセットです。

作ったステートマシンはUnity Editorでのテスト中にステートの遷移が視覚的にわかるのでうまく使えばバグの少ないゲームづくりができそうです(。・ω・。)

arbor.caitsithware.com

今回の記事で紹介するのはArbor 2のState Behaviorの「UISetTextFromParameters」で書式指定してテキストを表示する方法について。

 

Arbor 2では挙動をコントロールしたいゲームオブジェクトにFSM (Finite State Machine)を追加して、FSMの各ステートでのふるまい (Behavior)を管理します。

利用できるBehaviorは様々あって、必要であればコードを書いて自作もできます。

 

UISetTextFromParametersは名前の通りUIのテキストにArbor 2で管理しているパラメータの値を表示するBehaviorで、プロパティはリンクの通り。

UISetTextFromParameter — Arbor リファレンス 2.1.2 ドキュメント

 

Formatを使えば書式指定できるみたいですが、書式指定の方法についてとくに書いてなくって初心者は詰まってしまいました。

UISetTextFromParametersでどのようにFormatが指定されてるかソースコードを見てみるとParameterで与えた変数のToString()メソッドに引数としてFormatを与えているようです(ソースコードは載せていいのかわからなかったので載せてません)。

 

ToString()メソッドでの書式指定についてはこちらが参考になりました。

tsubakit1.hateblo.jp

 

ということでいまいち締まらないけどこんな感じで記事は終わりです。

書いてるうちにうまくなっていくと信じたいところですね...( -v- 。)

はじめましての投稿です

はじめまして。んななです。

個人でゲーム制作やってます。

Twitterでゲーム制作の進捗をちょくちょくつぶやいています。

twitter.com

このブログでは開発中のゲームの進捗や、その際に詰まってしまった問題とその解決策なんかの備忘録を書いていきたいなと思っています。

 

投稿頻度は少なくても、ほそぼそと続けていけたらいいなぁ(。・ω・。)