• Unity中自定义扩展方法


    问题背景

    在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题,

    Transfrom tran;
    
    float pos_x=1,pos_y=1,pos_z=1;
    
    tran.position=new Vector3(pos_x,pos_y,pos_z);

    像这种情况,在开发中很繁琐,多次使用,还有很多种情况,比如只设置X坐标,或者Y坐标,总这样写很麻烦,就萌生出一个想法,自己封装一下吧,于是扩展方法出来了。

    扩展方法定义

    顾名思义,扩展方法就是扩展的方法,对应到面向对象中为一个类提供扩展方法,通俗来想,我们要或得到这个脚本然后增加成员来扩展方法的目的,但是这种情况在拿不到源代码的情况下就无效了,

    并且我们人为的去改变源代码会破坏源代码的稳定性,所以扩展方法就来了,一定有人在开发中用过DoTween这个插件,这个插件就是从iTween这个插件通过扩展方法这种实现方式来得,

    在你使用时你会发现就像用原生函数一样方便没有任何插件的感觉。

    扩展方法的特征

    1.实现扩展方法的类必须是静态类并且类的名称和实现扩展方法的类无关

    2.实现扩展方法的类方法必须是静态方法

    3.实现扩展方法的类方法的第一个参数必须是使用this关键字指明要实现扩展方法的类

    具体代码:

    KuoZhanMethods.cs扩展方法脚本
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    using UnityEngine;
    
    public  static  class KuoZhanMethods {
        /// <summary>
        /// string转int扩展方法(无参)
        /// </summary>
        /// <param name="str">第一个参数必须使用this关键字指定要使用扩展方法的类型</param>
        /// <returns></returns>
        public static int ToInt(this string str)
        {
            return int.Parse(str);
        }
        /// <summary>
        /// 设置物体X坐标(有参)
        /// </summary>
        /// <param name="tran">当前Transform</param>
        /// <param name="pos_x">X坐标</param>
        public static void SetPosition_X(this Transform tran,float pos_x)
        {
            tran.position = new Vector3(pos_x,tran.position.y,tran.position.z);
        }
        /// <summary>
        /// 设置物体Y坐标(有参)
        /// </summary>
        /// <param name="tran">当前Transform</param>
        /// <param name="pos_y">Y坐标</param>
        public static void SetPosition_Y(this Transform tran, float pos_y)
        {
            tran.position = new Vector3(tran.position.x, pos_y, tran.position.z);
        }
        /// <summary>
        /// 设置物体Z坐标(有参)
        /// </summary>
        /// <param name="tran">当前Transform</param>
        /// <param name="pos_z">Z坐标</param>
        public static void SetPosition_Z(this Transform tran, float pos_z)
        {
            tran.position = new Vector3(tran.position.x, tran.position.y,pos_z);
        }
        /// <summary>
        /// 设置物体坐标
        /// </summary>
        /// <param name="tran">当前Tranfrom</param>
        /// <param name="pos_x">X坐标</param>
        /// <param name="pos_y">Y坐标</param>
        /// <param name="pos_z">Z坐标</param>
        public static void SetPosition_Pos(this Transform tran, float pos_x,float pos_y,float pos_z)
        {
            tran.position = new Vector3(pos_x, pos_y, pos_z);
        }
        /// <summary>
        /// 设置文本中字体颜色
        /// </summary>
        /// <param name="str">当前字符串</param>
        /// <param name="colorValue">色值</param>
        /// <returns></returns>
        public static string ChangeTxtColor(this string str,string colorValue)
        {
            StringBuilder strB = new StringBuilder();
            return strB.Append("<color=#").Append(colorValue).Append(">").Append(str).Append("</color>").ToString();
        }
    }
    KuoZhanMethodsText.cs测试脚本
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class KuoZhanMethodsText : MonoBehaviour {
        public Transform trans;
        public Text t;
        void Start () {
            //测试扩展方法string转Int
              string s = "12346";
              Debug.Log(s.ToInt());
    
    
            //测试扩展方法设置自定义坐标
            trans.SetPosition_X(-1);
            trans.SetPosition_Y(-1);
            trans.SetPosition_Z(-1);
            trans.SetPosition_Pos(-2, -2, -2);
    
            //测试扩展方法设置文本颜色
            t.text = s.ChangeTxtColor("814c24");
        }
    }

     扩展方法使用的利弊:

     使用扩展方法的好处是自由而任性地使用扩展方法对类进行扩展,而且扩展方法在Visual Studio中的智能提示会以蓝色向下箭头进行标识。

     使用扩展方法的劣处是扩展方法在使用时应遵守就近原则,即在最小的范围内使用扩展方法,对具体类而非抽象类实现扩展方法。使用扩展方法是因为在逻辑层需要这样的功能,所以我们没必要去改变抽象层的逻辑,因为这样会破坏面向对象的开闭原则,“污染”整个代码。举一个简单的例子,我们知道.NET中的基类是object,如果我们对这个类进行扩展,毫无疑问它会影响所有继承自object的类,这样就会造成“污染”,显然在这使用是不明智的。

     欢迎指正。

  • 相关阅读:
    layui弹出层使用方法之最详解
    rem实现简单的响应式布局
    layui数据库查询及数据处理
    header头设置解决 “已拦截跨源请求:同源策略禁止读取位于 http://back/test/test 的远程资源。(原因:CORS 头缺少 'Access-Control-Allow-Origin')。”
    mysql多表联查
    centos 7 安装独立环境 tcp6占用80端口解决方法
    JS for_of遍历数组
    通过几张图搞定json数据处理
    MQTT Broker mosquitto
    前言
  • 原文地址:https://www.cnblogs.com/answer-yj/p/10794327.html
Copyright © 2020-2023  润新知