• Unity开发者必备的C#脚本技巧


    • 注释代码

    Ctrl+K+C组合键可快速注释选中代码块或光标所在处代码行,Ctrl+K+U取消注释

    • 对齐代码

    按下Ctrl+K+F组合键可快速将选中代码块或光标所在处代码与上下文对齐

    • 比较距离

    将两点直接的距离与一个固定距离进行比较时,可使两点相减后取平方(即sqrMagnitude),然后用该值与某个距离值的平方进行比较。不建议使用Vector3.Distance方法获取两点之间的距离,然后与给定的距离值进行比较。因为Vector3.Distance(a,b)相当于(a-b).magnitude,即求平方根,而sqrMagnitude方法省去了求平方根的操作,所以比magnitude执行快,代码如下:

    1. //建议使用:
    2. Vector3 a = new Vector3(1, 1, 0);
    3. Vector3 b = new Vector3(0, 0, 0);
    4. float value=1.0f;
    5. if((a-b).sqrMagnitude<value*value)
    6. {
    7. }
    8. //不建议:
    9. if(Vector3.Distance(a,b)<value)
    10. {
    11. }


     

    • 移动代码行

    按下Alt+键盘上/下键,即可使鼠标光标所在代码行上移/下移

    • 自定义脚本模板

    在你Unity版本安装目录下依次打开:Editor/Data/Resources/ScriptTemplates即可看到一堆脚本模板,选择你常用的脚本模板进行修改

    • 随机获取布尔值

    Unity里面的随机类Random中使用Random.value可以返回0~1之间的随机数,所以可以让其返回值与0.5f进行比较,就可以获取一个随机布尔值True或false,有点类似于JAVA中的随机类

    • 字符串性能优化

    某些字符串在整个项目中不会改变且被频繁使用,可将其存储在静态只读变量中,从而节省内存分配

    1. static readonly string Fire1="Fire1";
    2. void Update(){
    3. Input.GetAxis(Fire1);
    4. //不建议直接使用字符串
    5. Input.GetAxis("Fire1");
    6. }
    • 初始化缓存组件引用

    某个组件需要被频繁的访问时,可以在程序初始化时获取到该组件的引用,而不是在需要时才去获取,也就是减少使用GetComponent< T>(),从而避免由于重复获取引起的性能开销

    1. private MeshRenderer mesh;
    2. private void Awake()
    3. {
    4. mesh = GetComponent();//初始化时提前缓存组件引用
    5. }
    6. void Update()
    7. {
    8. mesh.material.color = Color.red;
    9. }

    • 打开查找与替换模式

    按下Ctr+F组合键可快速打开查找模式:(可选择当前文档或整个项目等查找匹配字符串)

    • 定位到函数或者变量

    鼠标光标放置在变量或函数方法处,按下F12可快速定位到其定义的代码行

    • Visual Studio语句自动补全

    使用VS写脚本时,输入 if、for、switch、foreach、try、while等语句后可双击Tab键完成语句补全

    • 风格化Debug.Log的输出信息

    使用debug.log输出字符串信息时,可以用富文本标记来强调内容

    Debug.Log("程序初始化加载资源"+"bundle is loading");
    
    • 查找函数或者变量的所有引用

    鼠标光标放置在变量或函数处,按下Shift+F12组合键可快速查看其所有引用,单击某一引用即可定位到其代码行

    • 脚本不挂载到游戏对象也能执行

    一般来说,脚本都是要挂载到游戏对象上才能执行,但Unity提供了一个方法可以不用挂载脚本到游戏对象上也可以在程序运行时执行某个方法的语句。只需要在脚本的方法声明[RuntimeInitializeOnLoad(RuntimeInitializeLoadType.BeforeSceneLoad)] 即可,常用于程序初始化前做一些额外的初始化工作,代码如下:
    (注意:必须是静态方法上声明才会生效)

    1. [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
    2. private static void AfterSceneInit()
    3. {
    4. Debug.Log("场景加载之后执行");
    5. }
    6. [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    7. private static void BeforeSceneInit()
    8. {
    9. Debug.Log("场景加载之前执行");
    10. }


     

    • Compare Tag方法比较游戏对象

    当使用到游戏对象的标签Tag进行比较时,从性能上考虑,建议使用CompareTag方法,而不用=去进行判断

    1. if(gameObject.CompareTag("Player")){}
    2. //等效于
    3. if(gameObject.tag=="Player"){}
    • 数据类型struct和class的序列化

    需要给数据类型struct和Class在面板上赋值,可以在struct和Class声明前添加[System.Serializable]

    1. [System.Serializable]
    2. public class UIData
    3. {
    4. public Text txt;
    5. public Image IMG;
    6. }
    7. [System.Serializable]
    8. public struct ObjData
    9. {
    10. public Transform pos;
    11. public string name;
    12. }
    13. public class NewBehaviourScript : MonoBehaviour
    14. {
    15. public UIData mgUIData;
    16. public ObjData myObjData;
    17. }
    • 高亮显示Debug.Log对应出游戏对象

    使用Debug.Log方法输出信息时,可将gameObject作为此方法的第二个参数,当程序运行时,单击Console面板中对应的输出信息,可在Hierarchy面板中高亮显示挂载了此脚本的游戏物体

    1. private void Awake()
    2. {
    3. Debug.Log("程序初始化", gameObject);
    4. }

    • 检查脚本中空的Start和Updata函数

    检查空的MonoBehavior Start和Update方法,无论你有无写逻辑,它Start函数都会执行一次,Update函数也是会每帧执行一次。如果没有逻辑实现就将其删掉,因为跑空函数多少会损耗效率

    • 养成写成#region和#endregion的好习惯

    写代码除了养成写注释的好习惯外,也要养成写#region和#endregion 的好习惯,当你的代码有成百上千,甚至更多行时,使用该语句可将两者之间包含的代码块折叠,方便阅读

    以上就是我总结的Unity开发必备脚本技巧,如果还想了解Unity的编译技巧的话可以看我之前的文章,要是还有其他问题的话欢迎大家私聊我

  • 相关阅读:
    JavaScript -- 多种类型转换方法总结
    Allure精通指南(01)介绍与基本使用
    初步了解华为的MTL(市场到线索)流程的基本概念和来龙去脉
    【数据结构】Set和Map
    .NET 反向代理 YARP 跨域请求 CORS
    1204、基础查询进阶、连接查询
    如何检测照片中共有多少张人脸,机器学习
    计算机网络 数据链路层课后题
    解析类型参数
    幂等性解决方案
  • 原文地址:https://blog.csdn.net/Ai1114/article/details/126267286