当前位置:网站首页>Unity开发者必备的C#脚本技巧
Unity开发者必备的C#脚本技巧
2022-08-11 06:44:00 【是小A】
- 注释代码
Ctrl+K+C组合键可快速注释选中代码块或光标所在处代码行,Ctrl+K+U取消注释
- 对齐代码
按下Ctrl+K+F组合键可快速将选中代码块或光标所在处代码与上下文对齐
- 比较距离
将两点直接的距离与一个固定距离进行比较时,可使两点相减后取平方(即sqrMagnitude),然后用该值与某个距离值的平方进行比较。不建议使用Vector3.Distance方法获取两点之间的距离,然后与给定的距离值进行比较。因为Vector3.Distance(a,b)相当于(a-b).magnitude,即求平方根,而sqrMagnitude方法省去了求平方根的操作,所以比magnitude执行快,代码如下:
//建议使用:
Vector3 a = new Vector3(1, 1, 0);
Vector3 b = new Vector3(0, 0, 0);
float value=1.0f;
if((a-b).sqrMagnitude<value*value)
{
}
//不建议:
if(Vector3.Distance(a,b)<value)
{
}
- 移动代码行
按下Alt+键盘上/下键,即可使鼠标光标所在代码行上移/下移
- 自定义脚本模板
在你Unity版本安装目录下依次打开:Editor/Data/Resources/ScriptTemplates即可看到一堆脚本模板,选择你常用的脚本模板进行修改
- 随机获取布尔值
Unity里面的随机类Random中使用Random.value可以返回0~1之间的随机数,所以可以让其返回值与0.5f进行比较,就可以获取一个随机布尔值True或false,有点类似于JAVA中的随机类
- 字符串性能优化
某些字符串在整个项目中不会改变且被频繁使用,可将其存储在静态只读变量中,从而节省内存分配
static readonly string Fire1="Fire1";
void Update(){
Input.GetAxis(Fire1);
//不建议直接使用字符串
Input.GetAxis("Fire1");
}
- 初始化缓存组件引用
某个组件需要被频繁的访问时,可以在程序初始化时获取到该组件的引用,而不是在需要时才去获取,也就是减少使用GetComponent< T>(),从而避免由于重复获取引起的性能开销
private MeshRenderer mesh;
private void Awake()
{
mesh = GetComponent<MeshRenderer>();//初始化时提前缓存组件引用
}
void Update()
{
mesh.material.color = Color.red;
}
- 打开查找与替换模式
按下Ctr+F组合键可快速打开查找模式:(可选择当前文档或整个项目等查找匹配字符串)
- 定位到函数或者变量
鼠标光标放置在变量或函数方法处,按下F12可快速定位到其定义的代码行
- Visual Studio语句自动补全
使用VS写脚本时,输入 if、for、switch、foreach、try、while等语句后可双击Tab键完成语句补全
- 风格化Debug.Log的输出信息
使用debug.log输出字符串信息时,可以用富文本标记来强调内容
Debug.Log("<color=green>程序初始化加载资源</color>"+"bundle is loading");
- 查找函数或者变量的所有引用
鼠标光标放置在变量或函数处,按下Shift+F12组合键可快速查看其所有引用,单击某一引用即可定位到其代码行
- 脚本不挂载到游戏对象也能执行
一般来说,脚本都是要挂载到游戏对象上才能执行,但Unity提供了一个方法可以不用挂载脚本到游戏对象上也可以在程序运行时执行某个方法的语句。只需要在脚本的方法声明[RuntimeInitializeOnLoad(RuntimeInitializeLoadType.BeforeSceneLoad)] 即可,常用于程序初始化前做一些额外的初始化工作,代码如下:
(注意:必须是静态方法上声明才会生效)
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
private static void AfterSceneInit()
{
Debug.Log("场景加载之后执行");
}
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
private static void BeforeSceneInit()
{
Debug.Log("场景加载之前执行");
}
- Compare Tag方法比较游戏对象
当使用到游戏对象的标签Tag进行比较时,从性能上考虑,建议使用CompareTag方法,而不用=去进行判断
if(gameObject.CompareTag("Player")){}
//等效于
if(gameObject.tag=="Player"){}
- 数据类型struct和class的序列化
需要给数据类型struct和Class在面板上赋值,可以在struct和Class声明前添加[System.Serializable]
[System.Serializable]
public class UIData
{
public Text txt;
public Image IMG;
}
[System.Serializable]
public struct ObjData
{
public Transform pos;
public string name;
}
public class NewBehaviourScript : MonoBehaviour
{
public UIData mgUIData;
public ObjData myObjData;
}
- 高亮显示Debug.Log对应出游戏对象
使用Debug.Log方法输出信息时,可将gameObject作为此方法的第二个参数,当程序运行时,单击Console面板中对应的输出信息,可在Hierarchy面板中高亮显示挂载了此脚本的游戏物体
private void Awake()
{
Debug.Log("程序初始化", gameObject);
}
- 检查脚本中空的Start和Updata函数
检查空的MonoBehavior Start和Update方法,无论你有无写逻辑,它Start函数都会执行一次,Update函数也是会每帧执行一次。如果没有逻辑实现就将其删掉,因为跑空函数多少会损耗效率
- 养成写成#region和#endregion的好习惯
写代码除了养成写注释的好习惯外,也要养成写#region和#endregion 的好习惯,当你的代码有成百上千,甚至更多行时,使用该语句可将两者之间包含的代码块折叠,方便阅读
以上就是我总结的Unity开发必备脚本技巧,如果还想了解Unity的编译技巧的话可以看我之前的文章,要是还有其他问题的话欢迎大家私聊我
边栏推荐
- 结合均线分析k线图的基本知识
- Redis测试
- NFT 的价值从何而来
- Multiscale communication in cortical-cortical networks
- 【预约观看】Ambire 智能钱包 AMA 活动第四期即将举行
- 【软件测试】(北京)字节跳动科技有限公司终面HR面试题
- 皮质-皮质网络的多尺度交流
- Daily SQL - find each of the students school gpa minimum (window)
- Unity程序员如何提升自己的能力
- Douyin get douyin share password url API return value description
猜你喜欢
Shell:三剑客之awk
Edge provides label grouping functionality
Daily sql-statistics of the number of professionals (including the number of professionals is 0)
Redis源码-String:Redis String命令、Redis String存储原理、Redis字符串三种编码类型、Redis String SDS源码解析、Redis String应用场景
Taobao sku API interface (PHP example)
Implementation of FIR filter based on FPGA (5) - FPGA code implementation of parallel structure FIR filter
STM32CUBEIDE(11)----输出PWM及修改PWM频率与占空比
MindManager2022全新正式免费思维导图更新
Daily sql-seek the sum of successful investments in 2016
第一个C函数:如何实现板级初始化?
随机推荐
pytorch,numpy两种方法实现nms类间+类内
概念名词解释
sql--7天内(含当天)购买次数超过3次(含),且近7天的购买金额超过1000的用户
一张图了解JVM八大原子操作
Douyin get douyin share password url API return value description
为什么C#中对MySQL不支持中文查询
maxwell concept
SQL滑动窗口
下一代 无线局域网--强健性
Internet phone software or consolidation of attack must be "free" calls security clearance
博途PLC 1200/1500PLC ModbusTcp通信梯形图优化汇总(多服务器多从站轮询)
基于FPGA的FIR滤波器的实现(4)— 串行结构FIR滤波器的FPGA代码实现
每日sql:求好友申请通过率
Taobao product details API interface
ROS 话题通信理论模型
6月各手机银行活跃用户较快增长,创半年新高
【软件测试】(北京)字节跳动科技有限公司二面笔试题
PIXHAWK飞控使用RTK
拼多多API接口(附上我的可用API)
语音信号处理:预处理【预加重、分帧、加窗】