Unity开发过程中的一些小知识点

1、如何查询挂载了指定脚本的游戏物体
在这里插入图片描述
可以直接在Hierarchy面板上,搜索想要找的脚本名

2、如何将Unity生成的多个相同游戏物体获得序号

可以使用Unity的API Transform.GetSiblingIndex() 实现。

Transform.GetSiblingIndex()
==================================
gameobject.id=Transform.GetSiblingIndex()

含义:获得同级索引

将生成的游戏物体放在同一的父级对象下,通过该API即可获取这些游戏图在同级层视图上的位置(按Hierarchy窗口中顺序进行排序)。

3、在Unity中如何获得系统时间并输出

这里需要注意YYYYMMDD_HHMMSS的含义
它表示一种日期和时间的格式

YYYY:表示四位数的年份,比如2024年
MM:表示两位数的月份,比如12月
DD:表示两位数的日期,比如23日

HH:表示小时,比如6小时
MM:表示分钟,比如45分钟
SS:表示秒钟,比如12秒

 string date = $"{ System.DateTime.Now:yyyy/MM/dd_HH/mm/ss}" ;
 string date2 = System.DateTime.Now.ToString("yyyy/MM/dd_HH/mm/ss");

4、如何用C#做出年/月/日这样种有斜杆的日期显示

1、可以使用C#中Substring()方法

Substring(int i ,int j)
i表示从第i位的索引号开始截取 
j表示截取的数量
注意:字符串的索引值是从0开始的

作用:从字符串中截取指定开始位置和指定长度的字符串

 public void GetDateButton2()
    {
        string date = $"{ System.DateTime.Now:yyyyMMdd_HHmmss}";

        string datetext = date.Substring(0,8);//截取从索引值第0位开始的后八位字符

        string timetext = date.Substring(9,6);//截取从索引值第9位开始的后六位字符

        SetDate(ref datetext);

        SetTime(ref timetext);

        DateText.text = datetext + "_" + timetext;
    }
    public void SetDate(ref string date)
    {
        date = date.Insert(4, "/");
        date = date.Insert(7, "/");
    }
    public void SetTime(ref string time)
    {
        time = time.Insert(2,":") ;
        time = time.Insert(5,":");
    }

使用SubString()方法还可以用于截取字符串做判断,可以做一些像是敏感词这样的功能

2、直接通过YYYYMMDD_HHMMSS进行格式化

yyyy/MM/dd_HH/mm/ss

4、在Unity中的Inspector层实现按钮的颜色控制

 //颜色拾取器,第一个参数控制是否显示透明通道,第二参数控制是否使用HDR
    [Header("按钮")]
    public Button button;

    [ColorUsage(true)]
    public Color color1;

    [ColorUsage(true, true)]
    public Color color2;

    private void Update()
    {
        button.GetComponent<Image>().color = color1;
    }

5、如何在Unity当中实现两点连线
可以使用Unity当中LineRenderer组件完成画线的功能

1、LineRenderer是Unity提供的一个用于画线的组件,可以用于在场景中绘制线段

用处:
1、绘制攻击范围
2、武器红外线
3、距离计算

2、LineRenderer的使用
相关参数
1、Loop——是否终点起始自动相连
2、Positions——线段的点

6、关于一些MonoBehavior的知识点
1、继承类MonoBehavior类的脚本只能挂载,不能new
想要生成相关的类

2、继承类MonoBehavior的脚本可以在一个对象上挂多个

3、继承MonoBehavior类可以再次被继承,遵循面向对象继承多态的规则

基于上述规则,因此一个游戏物体会有两个相关的类,一个负责处理数据,一个负责挂载在物体上负责View显示

7、Unity中的localPosition和Position的区别
1、localPosition是相对于父对象的坐标。如果改变游戏对象的localPosition,它将移动到相对于父对象的新位置,如果该物体没有父对象,则它的localPosition与Position相同。
2、Position是世界空间中的绝对坐标。当改变一个游戏对象的Position,无论是否有父对象,都将在全局坐标系中的移动到新位置。

8、UI卡顿优化原理与实践
1、Unity为了性能优化会合并Canvas下所有元素
2、如果把所有面板放在一个Canvas中,会造成重绘
Canvas优化要点
1、一个Canvas下的所有UI元素都是合在一个Mesh中的,过大的Mesh在更新时开销很大
2、一般建议每个较复杂的UI界面,都自成一个Canvas(可以是子Canvas),在UI界面很复杂时,甚至要划分更多的子Canvas
3、动静分离
4、Canvas又不能细分的太多,因为会导致DrawCall的上升
5、把一个面板的UI资源放在一个图集里
6、背景大图不要和小图放在一个图集里

Overdraw(GPU)
造成GPU性能瓶颈的主要原因
1、复杂的vertext或pixel shader计算
overdraw:
光栅化阶段的填充像素过多
在UGUI中使用Alpha=0的不可见Image参与Raycast,譬如在屏幕空白处点击的响应,然而这些元素虽然在屏幕上不可见,但依然参与了绘制

UGUI其他优化要点
1、不处理点击的物体不要挂GraphicsRaycaster
2、少用LayoutGroup或者Content Size Fitter
用户操作——重绘——消耗大量计算时间
写算法自己算
3、Layout原理:
遍历SetDirty对象会消耗性能