当前位置:网站首页>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的编译技巧的话可以看我之前的文章,要是还有其他问题的话欢迎大家私聊我
边栏推荐
猜你喜欢
从苹果、SpaceX等高科技企业的产品发布会看企业产品战略和敏捷开发的关系
技术分享 | 实战演练接口自动化如何处理 Form 请求?
【LeetCode每日一题】——682.棒球比赛
Trill keyword search goods - API
MySQL使用GROUP BY 分组查询时,SELECT 查询字段包含非分组字段
Douyin share password url API tool
Douyin API interface
基于FPGA的FIR滤波器的实现(4)— 串行结构FIR滤波器的FPGA代码实现
Pinduoduo API interface (attach my available API)
Redis源码-String:Redis String命令、Redis String存储原理、Redis字符串三种编码类型、Redis String SDS源码解析、Redis String应用场景
随机推荐
Strongly recommend an easy-to-use API interface
常见激活函数及其导数
【推荐系统】:协同过滤和基于内容过滤概述
【预约观看】Ambire 智能钱包 AMA 活动第四期即将举行
2022-08-09 第四小组 修身课 学习笔记(every day)
Internet phone software or consolidation of attack must be "free" calls security clearance
【Pytorch】nn.Linear,nn.Conv
技能在赛题解析:交换机防环路设置
【Pytorch】nn.ReLU(inplace=True)
Unity程序员如何提升自己的能力
Implementation of FIR filter based on FPGA (5) - FPGA code implementation of parallel structure FIR filter
Production and optimization of Unity game leaderboards
从 dpdk-20.11 移植 intel E810 百 G 网卡 pmd 驱动到 dpdk-16.04 中
6月各手机银行活跃用户较快增长,创半年新高
Shell:三剑客之awk
EasyPlayer针对H.265视频不自动播放设置下,loading状态无法消失的解决办法
Spatial Pyramid Pooling -Spatial Pyramid Pooling (including source code)
SQL sliding window
matplotlib
prometheus学习4Grafana监控mysql&blackbox了解