Tsuの雑記¯\_(ツ)_/¯

主に製作メモ・備忘録として使用。製作したアプリのリンクもあります。

【Unity】回転を Rotate で行うか rotation で行うか切り替える【拡張メソッド】

オブジェクトの向きを操作する時,Rotate() を実行するか rotation を書き換えるかで悩む事は無いでしょうか。

今回は,どちらの方法で操作するかを簡単に切り替えられる拡張メソッドを作りました。

本稿では,Cube を使って御説明いたします。

(Unity 2019.4.17f1)

--

はじめに

オブジェクトの回転にRotate()rotationのどちらを採るか,悩ましい問題だと思います。

Rotate()は,GameObjectの回転量を指定する関数です。

docs.unity3d.com

対してrotationは,GameObjectの向きを司る変数です。

docs.unity3d.com

オブジェクトの向きを操作するたびに,両方を試すのは大変ですよね。

そこで今回,これらを簡単に切り替える方法を考えました。


スクリプトの用意

まずは,拡張メソッド用のスクリプトを用意します。

unity3d.com

これで,Unity 独自クラスであるTransformRotateOrRotation()というメソッドを追加できました。

次に,この拡張メソッドの使用例を挙げます。

NewBehaviourScript.cs

using UnityEngine;
// 拡張メソッドを使用するため
using static TsuGames.SetRotation;

public class NewBehaviourScript : MonoBehaviour
{
    // Cube
    [SerializeField] Transform cube = null;
    // 向き変更方法の切り替え
    [SerializeField] SetRotationMethod setRotationMethod = default;
    // 向き変更速度
    [SerializeField, Range(0, 1000)] float speed = 500f;

    void OnValidate()
    {
        // 向き変更方法の切り替えを反映
        ExtensionShowHideMethod = showHideMethod;
    }

    void Start()
    {
        // Cube を取得
        cube = GameObject.Find("Cube").transform;
    }

    void Update()
    {
        // ワールド座標のX軸で回転
        cube.RotateOrRotation(Vector3.right, Time.deltaTime * speed, Space.World);
    }
}


解説

まずは拡張メソッドクラスであるSetRotationを,using staticディレクティブで指定します。

docs.microsoft.com

これはSetRotationを拡張クラスとするうえで,静的(static)にする必要があったためです。

public static class SetRotation

次に向き変更方法を Inspector 上で切り替えるため,setRotationMethodを宣言します。

// 向き変更方法の切り替え
[SerializeField] SetRotationMethod setRotationMethod = default;

Inspector 上の変更を反映させるため,OnValidate()メソッドを使用します。

docs.unity3d.com

    void OnValidate()
    {
        // 向き変更方法の切り替えを反映
        ExtensionShowHideMethod = showHideMethod;
    }
</font>

これで,向き変更方法の切り替えが可能となりました。

<figure class="figure-image figure-image-fotolife" title="向き変更方法の切り替えを Inspector 上で行っている例">[f:id:tsu_games:20191210225201p:plain:alt=Inspector 上の setRotationMethod 列挙型が Inspector に表示されている画像]<figcaption>向き変更方法の切り替えを Inspector 上で行っている例</figcaption></figure>


---
#おわりに

この拡張メソッドは,飽くまで製作中の補助機能として考えました。

`Rotate()`と`rotation`のどちらが適切か分かった部分から,それぞれの命令に書き換えた方が良いと思います。

以上,移動を`Rotate()`で行うか`rotation`で行うか切り替える拡張メソッドの紹介でした。

Unity における似た処理を切り替える拡張メソッドは,他にも提案しております。

[https://tsu-games.hatenablog.com/entry/set-active-or-enabled:embed:cite]

[https://tsu-games.hatenablog.com/entry/translate-or-position:embed:cite]