56
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UnityAdvent Calendar 2013

Day 2

Transform拡張

Last updated at Posted at 2013-11-30

Transformを拡張して私なりに使いやすくしてみたことについて書こうと思います。
主にtransform.positionについて書いていきます。
C#です。

transform.position.xなどに値を代入するには
下記のようにして代入していると思います。

transform.position = new Vector3(3.0f, 0.0f, 0.0f);
transform.position = Vector3.right * 3.0f;

いくつか書き方があると思いますが
大体これらに近い記述になると思います。
ですがUnityを使用したことのある方なら

transform.position.x = 3.0f;

と、書こうとした人がたくさんいると思います。
ですが、これではUnityの仕様ではエラーになってしまいます。
なので便利な関数とかを用意していないかと探してみたところ
下記のように書く事ができるみたいです。

transform.position.Set(3.0f, 0.0f, 0.0f);

罠です。これではできません。
一見positionxyzに値を代入してくれそうに見えますが、
実際に実行してみると中の値は何も変わりません。
エラーも警告も出ません。

結局使えそうな関数などを見つけることができなかったので
私なりにC#の拡張メソッドを利用して使いやすくしてみました。
ついでなのでposition以外で使いそうなtransform系のものも追加しました。

TransformExtension.cs
using UnityEngine;

public static class TransformExtension {

	private static Vector3 vector3;

	#region SetPosition
	public static void SetPosition(this Transform transform, float x, float y, float z) {
		vector3.Set(x, y, z);
		transform.position = vector3;
	}
	public static void SetPositionX(this Transform transform, float x) {
		vector3.Set(x, transform.position.y, transform.position.z);
		transform.position = vector3;
	}
	public static void SetPositionY(this Transform transform, float y) {
		vector3.Set(transform.position.x, y, transform.position.z);
		transform.position = vector3;
	}
	public static void SetPositionZ(this Transform transform, float z) {
		vector3.Set(transform.position.x, transform.position.y, z);
		transform.position = vector3;
	}
	#endregion
	
	#region AddPosition
	public static void AddPosition(this Transform transform, float x, float y, float z) {
		vector3.Set(transform.position.x + x, transform.position.y + y, transform.position.z + z);
		transform.position = vector3;
	}
	public static void AddPositionX(this Transform transform, float x) {
		vector3.Set(transform.position.x + x, transform.position.y, transform.position.z);
		transform.position = vector3;
	}
	public static void AddPositionY(this Transform transform, float y) {
		vector3.Set(transform.position.x, transform.position.y + y, transform.position.z);
		transform.position = vector3;
	}
	public static void AddPositionZ(this Transform transform, float z) {
		vector3.Set(transform.position.x, transform.position.y, transform.position.z + z);
		transform.position = vector3;
	}
	#endregion
	
	#region SetLocalPosition
	public static void SetLocalPosition(this Transform transform, float x, float y, float z) {
		vector3.Set(x, y, z);
		transform.localPosition = vector3;
	}
	public static void SetLocalPositionX(this Transform transform, float x) {
		vector3.Set(x, transform.localPosition.y, transform.localPosition.z);
		transform.localPosition = vector3;
	}
	public static void SetLocalPositionY(this Transform transform, float y) {
		vector3.Set(transform.localPosition.x, y, transform.localPosition.z);
		transform.localPosition = vector3;
	}
	public static void SetLocalPositionZ(this Transform transform, float z) {
		vector3.Set(transform.localPosition.x, transform.localPosition.y, z);
		transform.localPosition = vector3;
	}
	#endregion
	
	#region AddLocalPosition
	public static void AddLocalPosition(this Transform transform, float x, float y, float z) {
		vector3.Set(transform.localPosition.x + x, transform.localPosition.y + y, transform.localPosition.z + z);
		transform.localPosition = vector3;
	}
	public static void AddLocalPositionX(this Transform transform, float x) {
		vector3.Set(transform.localPosition.x + x, transform.localPosition.y, transform.localPosition.z);
		transform.localPosition = vector3;
	}
	public static void AddLocalPositionY(this Transform transform, float y) {
		vector3.Set(transform.localPosition.x, transform.localPosition.y + y, transform.localPosition.z);
		transform.localPosition = vector3;
	}
	public static void AddLocalPositionZ(this Transform transform, float z) {
		vector3.Set(transform.localPosition.x, transform.localPosition.y, transform.localPosition.z + z);
		transform.localPosition = vector3;
	}
	#endregion
	
	#region SetLocalScale
	public static void SetLocalScale(this Transform transform, float x, float y, float z) {
		vector3.Set(x, y, z);
		transform.localScale = vector3;
	}
	public static void SetLocalScaleX(this Transform transform, float x) {
		vector3.Set(x, transform.localScale.y, transform.localScale.z);
		transform.localScale = vector3;
	}
	public static void SetLocalScaleY(this Transform transform, float y) {
		vector3.Set(transform.localScale.x, y, transform.localScale.z);
		transform.localScale = vector3;
	}
	public static void SetLocalScaleZ(this Transform transform, float z) {
		vector3.Set(transform.localScale.x, transform.localScale.y, z);
		transform.localScale = vector3;
	}
	#endregion
	
	#region AddLocalScale
	public static void AddLocalScale(this Transform transform, float x, float y, float z) {
		vector3.Set(transform.localScale.x + x, transform.localScale.y + y, transform.localScale.z + z);
		transform.localScale = vector3;
	}
	public static void AddLocalScaleX(this Transform transform, float x) {
		vector3.Set(transform.localScale.x + x, transform.localScale.y, transform.localScale.z);
		transform.localScale = vector3;
	}
	public static void AddLocalScaleY(this Transform transform, float y) {
		vector3.Set(transform.localScale.x, transform.localScale.y + y, transform.localScale.z);
		transform.localScale = vector3;
	}
	public static void AddLocalScaleZ(this Transform transform, float z) {
		vector3.Set(transform.localScale.x, transform.localScale.y, transform.localScale.z + z);
		transform.localScale = vector3;
	}
	#endregion

	#region SetEulerAngles
	public static void SetEulerAngles(this Transform transform, float x, float y, float z) {
		vector3.Set(x, y, z);
		transform.eulerAngles = vector3;
	}
	public static void SetEulerAnglesX(this Transform transform, float x) {
		vector3.Set(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
		transform.eulerAngles = vector3;
	}
	public static void SetEulerAnglesY(this Transform transform, float y) {
		vector3.Set(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
		transform.eulerAngles = vector3;
	}
	public static void SetEulerAnglesZ(this Transform transform, float z) {
		vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
		transform.eulerAngles = vector3;
	}
	#endregion

	#region AddEulerAngles
	public static void AddEulerAngles(this Transform transform, float x, float y, float z) {
		vector3.Set(transform.eulerAngles.x + x, transform.eulerAngles.y + y, transform.eulerAngles.z + z);
		transform.eulerAngles = vector3;
	}
	public static void AddEulerAnglesX(this Transform transform, float x) {
		vector3.Set(transform.eulerAngles.x + x, transform.eulerAngles.y, transform.eulerAngles.z);
		transform.eulerAngles = vector3;
	}
	public static void AddEulerAnglesY(this Transform transform, float y) {
		vector3.Set(transform.eulerAngles.x, transform.eulerAngles.y + y, transform.eulerAngles.z);
		transform.eulerAngles = vector3;
	}
	public static void AddEulerAnglesZ(this Transform transform, float z) {
		vector3.Set(transform.eulerAngles.x, transform.eulerAngles.y, transform.eulerAngles.z + z);
		transform.eulerAngles = vector3;
	}
	#endregion
	
	#region SetLocalEulerAngles
	public static void SetLocalEulerAngles(this Transform transform, float x, float y, float z) {
		vector3.Set(x, y, z);
		transform.localEulerAngles = vector3;
	}
	public static void SetLocalEulerAnglesX(this Transform transform, float x) {
		vector3.Set(x, transform.localEulerAngles.y, transform.localEulerAngles.z);
		transform.localEulerAngles = vector3;
	}
	public static void SetLocalEulerAnglesY(this Transform transform, float y) {
		vector3.Set(transform.localEulerAngles.x, y, transform.localEulerAngles.z);
		transform.localEulerAngles = vector3;
	}
	public static void SetLocalEulerAnglesZ(this Transform transform, float z) {
		vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, z);
		transform.localEulerAngles = vector3;
	}
	#endregion

	#region AddLocalEulerAngles
	public static void AddLocalEulerAngles(this Transform transform, float x, float y, float z) {
		vector3.Set(transform.localEulerAngles.x + x, transform.localEulerAngles.y + y, transform.localEulerAngles.z + z);
		transform.localEulerAngles = vector3;
	}
	public static void AddLocalEulerAnglesX(this Transform transform, float x) {
		vector3.Set(transform.localEulerAngles.x + x, transform.localEulerAngles.y, transform.localEulerAngles.z);
		transform.localEulerAngles = vector3;
	}
	public static void AddLocalEulerAnglesY(this Transform transform, float y) {
		vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y + y, transform.localEulerAngles.z);
		transform.localEulerAngles = vector3;
	}
	public static void AddLocalEulerAnglesZ(this Transform transform, float z) {
		vector3.Set(transform.localEulerAngles.x, transform.localEulerAngles.y, transform.localEulerAngles.z + z);
		transform.localEulerAngles = vector3;
	}
	#endregion

}

すみません。なんかすごく長くなってしまいました。
使い方としては

transform.SetPositionX(3.0f);

と書けばtransform.position.xにだけ値を代入することができます。
よさそうだなと思ったら使ってみてください。

56
56
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
56
56

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?