Unity3D Extension扩展方法(一):扩展Transfrom

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;
    }

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

重设Transform:

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值