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

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

【Unity】移動を Translate で行うか position で行うか切り替える【拡張メソッド】

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

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

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

(Unity 2019.4.17f1)


はじめに

オブジェクトの移動にTranslate()positionのどちらを採るか,悩ましい問題だと思います。

Translate()は,GameObjectの移動量を指定する関数です。

docs.unity3d.com

対してpositionは,GameObjectの位置を司る変数です。

docs.unity3d.com

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

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


スクリプトの用意

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

unity3d.com

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

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

NewBehaviourScript.cs

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

public class NewBehaviourScript : MonoBehaviour
{
    // Cube
    [SerializeField] Transform cube0 = null;
    // Cube (1)
    [SerializeField] Transform cube1 = null;
    // 位置変更方法の切り替え
    [SerializeField] SetPositionMethod setPositionMethod = default;
    // 位置変更速度
    [SerializeField, Range(0, 10)] float speed = 1f;

    void OnValidate()
    {
        // 位置変更方法の切り替えを反映
        ExtensionSetPositionMethod = setPositionMethod;
    }

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

    void Update()
    {
        // Cube (1) のX軸を正の方向に移動
        cube0.TranslateOrPosition(Vector3.right * speed * Time.deltaTime, cube1);
    }
}


解説

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

docs.microsoft.com

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

public static class SetPosition

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

// 位置変更方法の切り替え
[SerializeField] SetPositionMethod setPositionMethod = default;

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

docs.unity3d.com

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

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

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


---
#おわりに

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

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

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

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

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

[https://tsu-games.hatenablog.com/entry/rotate-or-rotation:embed:cite]