オブジェクトの位置を操作する時,Translate()
を実行するか position
を書き換えるかで悩む事は無いでしょうか。
今回は,どちらの方法で操作するかを簡単に切り替えられる拡張メソッドを作りました。
本稿では,Cube を使って御説明いたします。
(Unity 2019.4.17f1)
はじめに
オブジェクトの移動にTranslate()
とposition
のどちらを採るか,悩ましい問題だと思います。
Translate()
は,GameObject
の移動量を指定する関数です。
対してposition
は,GameObject
の位置を司る変数です。
オブジェクトの位置を操作するたびに,両方を試すのは大変ですよね。
そこで今回,これらを簡単に切り替える方法を考えました。
スクリプトの用意
まずは,拡張メソッド用のスクリプトを用意します。
これで,Unity 独自クラスであるTransform
にTranslateOrPosition()
というメソッドを追加できました。
次に,この拡張メソッドの使用例を挙げます。
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
ディレクティブで指定します。
これはSetPosition
を拡張クラスとするうえで,静的(static
)にする必要があったためです。
public static class SetPosition
次に位置変更方法を Inspector 上で切り替えるため,setPositionMethod
を宣言します。
// 位置変更方法の切り替え [SerializeField] SetPositionMethod setPositionMethod = default;
Inspector 上の変更を反映させるため,OnValidate()
メソッドを使用します。
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]