【Unity3D / Extension】 扩展方法01 —— 扩展Transfrom

版权声明:本文为 ls9512 原创文章,转载请注明出处! https://blog.csdn.net/ls9512/article/details/73332013

C#提供了强大而又便利的扩展方法,是我们可以为C#原生、以及各种第三方库中的实例类型增加自定义的方法,这些类的实现,通常是无法看到也无法改变的,但是,通过扩展方法,我们可以为其增加一些极其便利的自定义行为。


MSDN上,对扩展方法的定义如下:

扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。


Transform是Unity中最常用的组件之一,初学Unity时便会发现,当我们要修改物体位置的某一轴坐标时,很不方便,比如只修改X轴的位置一般需要这么写:

transform.position = new Vector3(x, transform.position.y, transform.position.z);

接下来看一下对位置修改进行扩展该怎么做:

	public static void SetPositionX(this Transform transform, float x)
	{
		transform.position = new Vector3(x, transform.position.y, transform.position.z);
	}

	public static void SetPositionY(this Transform transform, float y)
	{
		transform.position = new Vector3(transform.position.x, y, transform.position.z);
	}

	public static void SetPositionZ(this Transform transform, float z)
	{
		transform.position = new Vector3(transform.position.x, transform.position.y, z);
	}

新建一个静态类,然后添加以上静态方法即可。


实现以上扩展方法后,修改物体X轴的坐标,就可以写成这样:

transform.SetPositionX(x);

是不是简单了很多?这是扩展方法在Unity中最基本的运用之一。接下来我们看看,还可以对Transform做哪些扩展。

和修改位置一样,很容易就能实现修改旋转的扩展:

	public static void SetEulerAnglesX(this Transform transform, float x)
	{
		transform.eulerAngles = new Vector3(x, transform.eulerAngles.y, transform.eulerAngles.z);
	}

	public static void SetEulerAnglesY(this Transform transform, float y)
	{
		transform.eulerAngles = new Vector3(transform.eulerAngles.x, y, transform.eulerAngles.z);
	}

	public static void SetEulerAnglesZ(this Transform transform, float z)
	{
		transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, z);
	}

修改缩放也是一样的:

	public static void SetLocalScaleX(this Transform transform, float x)
	{
		transform.localScale = new Vector3(x, transform.localScale.y, transform.localScale.z);
	}

	public static void SetLocalScaleY(this Transform transform, float y)
	{
		transform.localScale = new Vector3(transform.localScale.x, y, transform.localScale.z);
	}

	public static void SetLocalScaleZ(this Transform transform, float z)
	{
		transform.localScale = new Vector3(transform.localScale.x, transform.localScale.y, z);
	}

以上方法,是基于世界坐标队伍体的修改,可以稍加修改实现模型坐标的位置、旋转扩展,这儿就不再贴出几乎完全重复的代码了。


以下再例举一些我常用的Transform扩展。


查找所有子节点中指定的节点:

	public static Transform FindInAllChild(this Transform transform, string name)
	{
		var list = transform.GetComponentsInChildren<Transform>();
		for (var i = 0; i < list.Length; i++)
		{
			var t = list[i];
			if (t.gameObject.name == name)
			{
				return t;
			}
		}
		return null;
	}

删除所有子节点:

	public static void ClearChild(this Transform transform)
	{
		for (var i = 0; i < transform.childCount; i++)
		{
			var go = transform.GetChild(i).gameObject;
			Object.Destroy(go);
		}
	}

寻找父节点中的组件:

	public static T FindComponentInParents<T>(this Transform transform) where T : Component 
	{
		var component = transform.GetComponent<T>();
		if (component != null)
		{
			return component;
		}
		return transform.parent != null ? FindComponentInParents<T>(transform.parent) : null;
	} 

获取组件,如果没有,则添加,这个很常用,可以省去一些逻辑判断代码。

	public static T GetOrAddComponent<T>(this Transform transform) where T : Component
	{
		return transform.GetComponent<T>() ?? transform.gameObject.AddComponent<T>();
	}

重设Transform:

	public static void ResetLocal(this Transform transform)
	{
		transform.localPosition = Vector3.zero;
		transform.localRotation = Quaternion.identity;
		transform.localScale = Vector3.one;
	}


根据实际开发的需要,还可以实现很多很有用的扩展,接下来的文章中,我会再例举一些常用的和各种有意思的扩展方法。


猜你喜欢

转载自blog.csdn.net/ls9512/article/details/73332013