サンマプログラミング

ゲームプログラマーとして主にUnity&UnrealEngineについての記事を掲載させてもらいます。時々DirectXとか・・・どうぞ見てらえれば幸いです。

UnityのTransform拡張メソッドクラスについてのあれこれ

 しょっぱなの記事ということでいまさらですが、UnityのTransform型を拡張することによってコードを見やすくしようと思います。

 まず拡張メソッドクラスというのは簡単にいってしまえば、Unityの搭載されている型宣言に自作したメソッドを追加できる用クラスを追加で作るものです。

これをすることによって毎回書くコードの短縮をすることができるので作業がはかどります。

 拡張のしかたとしてはクラス宣言はclassの前にstaticとclass名のあとにExtensionsをつける。メソッドの宣言はstaticをつけ、引数の部分にthis 型名を宣言する。

もちろんpublic宣言でお願いします。型によってできないものもあるので注意です。

 

(例)クラス ⇒ public static class 型名Extensions

 メソッド ⇒ public static void メソッド名(this 型名 変数名, 宣言したい引数)

 

 今回はTransformの拡張なので検証した結果では、どうもX軸の回転角度設定だけUnityのバグみたいでおかしくなります。なので各Update以外は使用してもいいですが,各Updateだけバグります。なのでコメントで記載しています。回転の加算は別の方法でやっているので大丈夫だと思います。あと豆知識ですが、/を3回打つと下のようなフォーマットが出現します。

 

下に自分が使っているクラスを掲載します。参考になれば幸いです。あとX軸の回転角度設定の部分ついてはなにか解決策があればコメントしてもらえれば大変助かります。なにぶん読みづらいかもしれませんがすいません(> <)

using UnityEngine;

/// <summary>
/// Transform型の拡張メソッドクラス
/// </summary>
public static class TransformExtensions
{
/// <summary>
/// X,Y,Z軸座標設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸座標</param>
/// <param name="y">Y軸座標</param>
/// <param name="z">Z軸座標</param>
public static void SetPosition(this Transform transform, float x, float y, float z)
{
transform.position = new Vector3(x, y, z);
}

/// <summary>
/// X軸座標を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸座標</param>
public static void SetPositionX(this Transform transform, float x)
{
transform.position = new Vector3(x, transform.position.y, transform.position.z);
}

/// <summary>
/// Y軸座標を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸座標</param>
public static void SetPositionY(this Transform transform, float y)
{
transform.position = new Vector3(transform.position.x, y, transform.position.z);
}

/// <summary>
/// Z軸座標を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸座標</param>
public static void SetPositionZ(this Transform transform, float z)
{
transform.position = new Vector3(transform.position.x, transform.position.y, z);
}

/// <summary>
/// ローカルXYZ軸座標を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸座標</param>
/// <param name="y">Y軸座標</param>
/// <param name="z">Z軸座標</param>
public static void SetLocalPosition(this Transform transform, float x, float y, float z)
{
transform.localPosition = new Vector3(x, y, z);
}

/// <summary>
/// ローカルX軸座標を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸座標</param>
public static void SetLocalPositionX(this Transform transform, float x)
{
transform.localPosition = new Vector3(x, transform.position.y, transform.position.z);
}

/// <summary>
/// ローカルY軸座標を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸座標</param>
public static void SetLocalPositionY(this Transform transform, float y)
{
transform.localPosition = new Vector3(transform.localPosition.x, y, transform.localPosition.z);
}

/// <summary>
/// ローカルZ軸座標を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸座標</param>
public static void SetLocalPositionZ(this Transform transform, float z)
{
transform.localPosition = new Vector3(transform.localPosition.x, transform.localPosition.y, z);
}

/// <summary>
/// XYZ軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸加算数値</param>
/// <param name="y">Y軸加算数値</param>
/// <param name="z">Z軸加算数値</param>
public static void AddPosition(this Transform transform, float x, float y, float z)
{
transform.SetPositionX(x + transform.position.x);
transform.SetPositionY(y + transform.position.y);
transform.SetPositionZ(z + transform.position.z);
}

/// <summary>
/// X軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸加算数値</param>
public static void AddPositionX(this Transform transform, float x)
{
transform.SetPositionX(x + transform.position.x);
}

/// <summary>
/// Y軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸加算数値</param>
public static void AddPositionY(this Transform transform, float y)
{
transform.SetPositionY(y + transform.position.y);
}

/// <summary>
/// Z軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸加算数値</param>
public static void AddPositionZ(this Transform transform, float z)
{
transform.SetPositionZ(z + transform.position.z);
}

/// <summary>
/// ローカルXYZ軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸加算数値</param>
/// <param name="y">Y軸加算数値</param>
/// <param name="z">Z軸加算数値</param>
public static void AddLocalPosition(this Transform transform, float x, float y, float z)
{
transform.SetLocalPositionX(x + transform.localPosition.x);
transform.SetLocalPositionY(y + transform.localPosition.y);
transform.SetLocalPositionZ(z + transform.localPosition.z);
}

/// <summary>
/// ローカルX軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸加算数値</param>
public static void AddLocalPositionX(this Transform transform, float x)
{
transform.SetLocalPositionX(x + transform.localPosition.x);
}

/// <summary>
/// ローカルY軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸加算数値</param>
public static void AddLocalPositionY(this Transform transform, float y)
{
transform.SetLocalPositionY(y + transform.localPosition.y);
}

/// <summary>
/// ローカルZ軸座標に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸加算数値</param>
public static void AddLocalPositionZ(this Transform transform, float z)
{
transform.SetLocalPositionZ(z + transform.localPosition.z);
}

/// <summary>
/// XYZ軸方向の回転角を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸方向回転角</param>
/// <param name="y">Y軸方向回転角</param>
/// <param name="z">Z軸方向回転角</param>
public static void SetRotation(this Transform transform, float x, float y, float z)
{
transform.rotation = Quaternion.Euler(x, y, z);
}

/// <summary>
/// X軸方向の回転角を設定(Updateでは使用しないこと)
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸方向回転角</param>
public static void SetRotationX(this Transform transform, float x)
{
transform.rotation = Quaternion.Euler(x, transform.eulerAngles.y, transform.eulerAngles.z);
}

/// <summary>
/// Y軸方向の回転角を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸方向回転角</param>
public static void SetRotationY(this Transform transform, float y)
{
transform.rotation = Quaternion.Euler(transform.eulerAngles.x, y, transform.eulerAngles.z);
}

/// <summary>
/// Z軸方向の回転角を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸方向回転角</param>
public static void SetRotationZ(this Transform transform, float z)
{
transform.rotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, z);
}

/// <summary>
/// ローカルのXYZ軸方向の回転角を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">ローカルのX軸方向回転角</param>
/// <param name="y">ローカルのY軸方向回転角</param>
/// <param name="z">ローカルのZ軸方向回転角</param>
public static void SetLocalRotation(this Transform transform, float x, float y, float z)
{
transform.localRotation = Quaternion.Euler(x, y, z);
}

/// <summary>
/// ローカルのX軸方向の回転角を設定(Updateでは使用しないこと)
/// </summary>
/// <param name="transform"></param>
/// <param name="x">ローカル系のX軸方向回転角</param>
public static void SetLocalRotationX(this Transform transform, float x)
{
transform.localRotation = Quaternion.Euler(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
}

/// <summary>
/// ローカルのY軸方向の回転角を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="y">ローカルのY軸方向回転角</param>
public static void SetLocalRotationY(this Transform transform, float y)
{
transform.localRotation = Quaternion.Euler(transform.eulerAngles.x, y, transform.eulerAngles.z);
}

/// <summary>
/// ローカルのZ軸方向の回転角を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="z">ローカルのZ軸方向回転角</param>
public static void SetLocalRotationZ(this Transform transform, float z)
{
transform.localRotation = Quaternion.Euler(transform.eulerAngles.x, transform.eulerAngles.y, z);
}

/// <summary>
/// XYZ軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸方向加算数値</param>
/// <param name="y">Y軸方向加算数値</param>
/// <param name="z">Z軸方向加算数値</param>
public static void AddRotation(this Transform transform, float x, float y, float z)
{
transform.Rotate(x, y, z, Space.World);
}

/// <summary>
/// X軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸方向加算数値</param>
public static void AddRotationX(this Transform transform, float x)
{
transform.Rotate(x, 0, 0, Space.World);
}

/// <summary>
/// Y軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸方向加算数値</param>
public static void AddRotationY(this Transform transform, float y)
{
transform.Rotate( 0, y, 0, Space.World);
}

/// <summary>
/// Z軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸方向加算数値</param>
public static void AddRotationZ(this Transform transform, float z)
{
transform.Rotate(0, 0, z, Space.World);
}

/// <summary>
/// ローカルのXYZ軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">ローカルのX軸方向加算数値</param>
/// <param name="y">ローカルのY軸方向加算数値</param>
/// <param name="z">ローカルのZ軸方向加算数値</param>
public static void AddLocalRotation(this Transform transform, float x, float y, float z)
{
transform.Rotate(x, y, z, Space.Self);
}

/// <summary>
/// ローカルのX軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">ローカルのX軸方向加算数値</param>
public static void AddLocalRotationX(this Transform transform, float x)
{
transform.Rotate(x, 0, 0, Space.Self);
}

/// <summary>
/// ローカルのY軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="y">ローカルのY軸方向加算数値</param>
public static void AddLocalRotationY(this Transform transform, float y)
{
transform.Rotate(0, y, 0, Space.Self);
}

/// <summary>
/// ローカルのZ軸方向の回転角に数値加算
/// </summary>
/// <param name="transform"></param>
/// <param name="z">ローカルのZ軸方向加算数値</param>
public static void AddLocalRotationZ(this Transform transform, float z)
{
transform.Rotate(0, 0, z, Space.Self);
}


/// <summary>
/// ローカル座標系のXYZ軸方向の拡縮値を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸拡縮値</param>
/// <param name="y">Y軸拡縮値</param>
/// <param name="z">Z軸拡縮値</param>
public static void SetLocalScale(this Transform transform, float x, float y, float z)
{
transform.localScale = new Vector3(x, y, z);
}

/// <summary>
/// ローカル座標系のX軸方向の拡縮値を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸拡縮値</param>
public static void SetLocalScaleX(this Transform transform, float x)
{
transform.localScale = new Vector3(x, transform.localScale.y, transform.localScale.z);
}

/// <summary>
/// ローカル座標系のY軸方向の拡縮値を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸拡縮値</param>
public static void SetLocalScaleY(this Transform transform, float y)
{
transform.localScale = new Vector3(transform.localScale.x, y, transform.localScale.z);
}

/// <summary>
/// ローカル座標系のZ軸方向の拡縮値を設定
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸拡縮値</param>
public static void SetLocalScaleZ(this Transform transform, float z)
{
transform.localScale = new Vector3(transform.localScale.x, transform.localScale.y, z);
}

/// <summary>
/// ローカル座標系のXYZ軸方向の拡縮値に加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸拡縮加算値</param>
/// <param name="y">Y軸拡縮加算値</param>
/// <param name="z">Z軸拡縮加算値</param>
public static void AddLocalScale(this Transform transform, float x, float y, float z)
{
transform.SetLocalScaleX(transform.localScale.x + x);
transform.SetLocalScaleY(transform.localScale.y + y);
transform.SetLocalScaleZ(transform.localScale.z + z);
}

/// <summary>
/// ローカル座標系のX軸方向の拡縮値に加算
/// </summary>
/// <param name="transform"></param>
/// <param name="x">X軸拡縮加算値</param>
public static void AddLocalScaleX(this Transform transform, float x)
{
transform.SetLocalScaleX(transform.localScale.x + x);
}

/// <summary>
/// ローカル座標系のY軸方向の拡縮値に加算
/// </summary>
/// <param name="transform"></param>
/// <param name="y">Y軸拡縮加算値</param>
public static void AddLocalScaleY(this Transform transform, float y)
{
transform.SetLocalScaleY(transform.localScale.y + y);
}

/// <summary>
/// ローカル座標系のZ軸方向の拡縮値に加算
/// </summary>
/// <param name="transform"></param>
/// <param name="z">Z軸拡縮加算値</param>
public static void AddLocalScaleZ(this Transform transform, float z)
{
transform.SetLocalScaleZ(transform.localScale.z + z);
}
}