Unity常用的一些简易扩展方法
Unity常用的一些简易扩展方法
引言
在unity项目的日常开发中,会发现unity现有的一些类的方法不是特别够用,但有些方法使用频率又很高,这时候,我们就可以用到Extension Method 扩展方法,实现自定义的扩展方法。
其次,扩展方法也可以使写法更简便一些。
附:Unity官方教程:教程
实现方法
步骤一
创建一个静态类,没有任何继承。
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// unity扩展类
/// image
/// </summary>
public static class ImageExtension
{}
步骤二
创建一个静态方法,这个方法的第一个参数使用this,类型为你需要扩展的类名,如Transform,Image等,之后的参数根据自己需求添加。
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// Unity扩展类
/// Image
/// </summary>
public static class ImageExtension
{/// <summary>/// 改变图片的透明度/// </summary>/// <param name="image"></param>/// <param name="a">透明度,[0, 1]</param>public static void ChangeAlpha(this Image image, float alpha){Color oldColor = image.color;image.color = new Color(oldColor.r, oldColor.g, oldColor.b, alpha);}
}
使用方式
Image img;
img.ChangeAlpha(1);
常用的一些扩展
以下的扩展是我自己在使用的过程中,觉得比较好使的一些扩展。
图片Image
using UnityEngine;
using UnityEngine.UI;/// <summary>
/// Unity扩展类
/// Image
/// </summary>
public static class ImageExtension
{/// <summary>/// 改变图片的透明度/// </summary>/// <param name="image"></param>/// <param name="a">透明度,[0, 1]</param>public static void ChangeAlpha(this Image image, float alpha){Color oldColor = image.color;image.color = new Color(oldColor.r, oldColor.g, oldColor.b, alpha);}
}
Gameobject
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// Unity扩展类
/// Gameobject
/// </summary>
public static class GameobjectExtension
{/// <summary>/// 改变对象的层级/// </summary>/// <param name="gameobject">对象</param>/// <param name="layerName">层级名称</param>public static void ChangeLayer(this GameObject gameobject, string layerName){int layer = LayerMask.NameToLayer(layerName);if (gameobject){foreach (Transform traform in gameobject.GetComponentsInChildren<Transform>(true)){traform.gameObject.layer = layer;}}}/// <summary>/// 改变对象的层级/// </summary>/// <param name="gameobject">对象</param>/// <param name="layer">层级编号</param>public static void ChangeLayer(this GameObject gameobject, int layer){if (gameobject){foreach (Transform traform in gameobject.GetComponentsInChildren<Transform>(true)){traform.gameObject.layer = layer;}}}/// <summary>/// 给对象加上元件/// 对象身上不存在这个元件/// 存在则不作处理/// </summary>/// <typeparam name="T">元件</typeparam>/// <param name="gameObject">对象</param>/// <returns></returns>public static T AddComponentIfNotFound<T>(this GameObject gameObject) where T : Component{T component = gameObject.GetComponent<T>();if (component == null){component = gameObject.AddComponent<T>();}return component;}/// <summary>/// 移除物体上挂载的脚本/// </summary>/// <typeparam name="T"></typeparam>/// <param name="gameObject"></param>public static void Remove<T>(this GameObject gameObject) where T : MonoBehaviour{if (gameObject.GetComponent<T>()){GameObject.Destroy(gameObject.GetComponent<T>());}}
}
MonoBehaviour
using System.Collections;
using UnityEngine;
using UnityEngine.Events;/// <summary>
/// Unity扩展类
/// MonoBehaviour
/// </summary>
public static class MonoBehaviourExtension
{/// <summary>/// 起协程/// 先等待延迟,然后运行事件/// </summary>/// <param name="action">事件</param>/// <param name="time">延迟时间</param>/// <returns></returns>public static Coroutine WaitSomeTime(this MonoBehaviour mono, float time, UnityAction action){return mono.StartCoroutine(WaitSomeTime(action, time));}private static IEnumerator WaitSomeTime(UnityAction action, float time){yield return new WaitForSeconds(time);if (action != null){action();}}/// <summary>/// 起协程/// 先等待延迟,然后运行事件/// </summary>/// <param name="action">事件</param>/// <param name="time">延迟时间</param>/// <returns></returns>public static Coroutine WaitOneUpdate(this MonoBehaviour mono, UnityAction action){return mono.StartCoroutine(WaitOneUpdate(action));}private static IEnumerator WaitOneUpdate(UnityAction action){yield return null;if (action != null){action();}}/// <summary>/// 起协程/// 先等待延迟,然后运行事件/// </summary>/// <param name="action">事件</param>/// <param name="time">延迟时间</param>/// <returns></returns>public static Coroutine WaitEndOfFrame(this MonoBehaviour mono, UnityAction action){return mono.StartCoroutine(WaitrEndOfFrame(action));}private static IEnumerator WaitrEndOfFrame(UnityAction action){yield return null;if (action != null){action();}}
}
Transform
using UnityEngine;
using System.Collections.Generic;/// <summary>
/// transform扩展类
/// </summary>
public static class TransformExtension
{/// <summary>/// 改变对象的层级/// </summary>/// <param name="tran">对象</param>/// <param name="layerName">层级名称</param>public static void ChangeLayer(this Transform tran, string layerName){int layer = LayerMask.NameToLayer(layerName);if (tran){foreach (Transform traform in tran.GetComponentsInChildren<Transform>(true)){traform.gameObject.layer = layer;}}}/// <summary>/// 改变对象的层级/// </summary>/// <param name="tran">对象</param>/// <param name="layer">层级编号</param>public static void ChangeLayer(this Transform tran, int layer){if (tran){foreach (Transform traform in tran.GetComponentsInChildren<Transform>(true)){traform.gameObject.layer = layer;}}}/// <summary>/// 设置绝对位置的x坐标/// </summary>/// <param name="transform"><see cref="Transform" />对象</param>/// <param name="newValue">x 坐标值</param>public static void SetPositionX(this Transform transform, float newValue){Vector3 originalPos = transform.position;originalPos.x = newValue;transform.position = originalPos;}/// <summary>/// 设置绝对位置的y坐标/// </summary>/// <param name="transform"><see cref="Transform" />对象</param>/// <param name="newValue">y 坐标值</param>public static void SetPositionY(this Transform transform, float newValue){Vector3 originalPos = transform.position;originalPos.y = newValue;transform.position = originalPos;}/// <summary>/// 设置绝对位置的z坐标/// </summary>/// <param name="transform"><see cref="Transform" />对象</param>/// <param name="newValue">z 坐标值</param>public static void SetPositionZ(this Transform transform, float newValue){Vector3 originalPos = transform.position;originalPos.z = newValue;transform.position = originalPos;}
}
结语
写的不好,望各种大佬指正。
Unity常用的一些简易扩展方法相关推荐
- Unity学习笔记--Extension Method 扩展方法
引言 最近跟着麦克学习Unity的时候,学习到了类的扩展方法.比如你现在有一个已有的类,你想给它加一个方法,当然如果是你自己写的类可以直接在这个方法里面写,但是如果是Unity自带的类,我们不可能直接 ...
- WebAPi添加常用扩展方法及思维发散
前言 在WebAPi中我们通常需要得到请求信息中的查询字符串或者请求头中数据再或者是Cookie中的数据,如果需要大量获取,此时我们应该想到封装一个扩展类来添加扩展方法,从而实现简便快捷的获取. We ...
- distinct返回null报错_C#之集合常用扩展方法与Linq
一.集合的常用扩展方法(lambda的方式) 1.Where() 根据条件选择数据 2.Select() 根据数据条件转换成新的数据类型,类似于DTO转换类 3.Max() 根据条件选择最大值 4.M ...
- C#高级编程——C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)——图文详解加源码
C#高级编程--C#扩展方法+接口,定义统一的搜索接口,基于Unity(三)--图文详解加源码 前言
- .Net6.0系列-6 .Net 6LinQ(二)常用扩展方法
一.本节学习LinQ的扩展方法 LinQ的where返回的IEnumerable,所有的括号中都可以写lamada表达式,list,数组等都可以用LinQ 以下这些方法都是可以和Where一起使用的 ...
- 【Unity】Unity开发进阶(七)双刃剑:扩展方法
文章目录 扩展方法 扩展方法声明 如何使用 举个例子 基本原则 扩展方法的优劣分析 总结 扩展方法 C#在3.0版本中引入了"扩展方法",既有静态方法的优点,又使调用它们的代码的可 ...
- Unity自定义扩展方法
问题背景 在使用unity开发过程中,通常会遇到一种情况,比如说给物体重新赋值坐标的问题, Transfrom tran:float pos_x=1,pos_y=1,pos_z=1;tran.posi ...
- c# 扩展方法奇思妙用高级篇六:WinForm 控件选择器
在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象.但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器.好在我们有扩展方法,可以很方便的打造一个. ...
- Spring8:一些常用的Spring Bean扩展接口
前言 Spring是一款非常强大的框架,可以说是几乎所有的企业级Java项目使用了Spring,而Bean又是Spring框架的核心. Spring框架运用了非常多的设计模式,从整体上看,它的设计严格 ...
最新文章
- 使用apache的ab对想迪科技站点www.thinkdee.com进行压力测试
- python numpy np.lexsort()(使用键序列执行间接稳定排序)(具体没太搞懂区别?)
- 解决Linux报错:/bin/bash^M: 坏的解释器: 没有那个文件或目录
- 浅析Python中的序列化存储的方法
- FS_S5PC100 UBOOT-2011.12移植,支持DM9000
- 保证一致性吗_谈了千百遍的缓存数据一致性问题
- 《Python自然语言处理》第二章 习题解答 练习6
- 微信JS SDK网页接口
- Install R language on Linux RHEL5 or RHEL6
- c 语言赋值运算符,C/C+编程笔记:运算符—所有编程语言的基础!一文带你搞懂它...
- 网状meta分析怎么入门?网状meta分析与meta分析区别
- android rom root权限,教你刷机包获取ROOT权限的方法
- 厦门高考成绩查询2021,2021厦门市地区高考成绩排名查询,厦门市高考各高中成绩喜报榜单...
- 文献综述是什么?怎么写?内附简洁模板
- UIUC计算机科学系博士,伊利诺伊大学香槟分校计算机系统博士排名
- bt torrent文件
- XILINX DDR3 VIVADO(二)写模块
- Qiyuan - 接小球游戏4.0
- Latex 中导入visio画的图片,去除多余留白
- 阿里云服务器CPU第三代Intel Xeon可扩展处理器(Ice Lake)性能评测