cat
Shioho

# UGUI

# RectTransform

# 立刻刷新 RectTransform 宽高

立刻刷新宽高,不必等到下一帧 ( 不准确,因为如果子节点也自动适配的话要等到子节点刷新完,还是老老实实等下一个物理帧刷新吧 )

LayoutRebuilder.ForceRebuildLayoutImmediate(rect);
private void FnmResizeContent(Transform trans)
        {
            Transform content = trans;
            while (content != null)
            {
                ContentSizeFitter fitter = content.GetComponent<ContentSizeFitter>();
                if (fitter != null)
                {
                    RectTransform rectTrans = content.GetComponent<RectTransform>();
                    LayoutRebuilder.ForceRebuildLayoutImmediate(rectTrans);
                }
                content = content.parent;
            }
        }

# Content Size Fitter

# 立刻刷新 Content Size Fitter 宽高

GetComponent<ContentSizeFitter>().SetLayoutVertical();

# Camera

# Physics Raycaster 组件

在摄像机上添加 Physics Raycaster 组件后,当鼠标点击时,摄像机会发射一条射线与 3d 物体交互,这时,3d 物体上实现了 IPointerXXXHandler 接口的函数就会调用。与在 Update 中自己写发送射线检测功能类似,更加方便。

# 特性

# RequireComponent (需要某个组件)

只有在某个 go 包含 xxx 组件时,当前组件才可添加

[[RequireComponent(typeof(RectTransform))]]

# DisallowMultipleComponent (不允许组件重复)

一个 go 无法赋予多个该组件

[DisallowMultipleComponent]

# ExecuteInEditMode (在 editor 下也可运行)

该组件在 Editor 模式下也可运行

[ExecuteInEditMode]

# ParticleSystem

# 设置渲染的层级

可通过以下代码来设置渲染层级

particle.GetComponent<Renderer>().sortingOrder = order;

# 获取最大播放时间

public float GetParticleLength(Transform transform)
        {
            var pts = transform.GetComponentsInChildren<ParticleSystem>();
            float maxDuration = 0f;
            foreach (var p in pts)
            {
                if (p.emission.enabled)
                {
                    if (p.main.loop)
                    {
                        return -1f;
                    }
                    float dunration = 0f;
                    if (p.emission.rateOverTimeMultiplier <= 0)
                    {
                        dunration = p.main.startDelayMultiplier + p.main.startLifetimeMultiplier;
                    }
                    else
                    {
                        dunration = p.main.startDelayMultiplier + Mathf.Max(p.main.duration, p.main.startLifetimeMultiplier);
                    }
                    if (dunration > maxDuration)
                    {
                        maxDuration = dunration;
                    }
                }
            }
            return maxDuration;
        }

# 优化相关

# 网格合并

MeshFilter[] filters = "需要去合并的网格数组";
CombineInstance[] combiners = new CombineInstance[filters.Length];
for(int i=0;i<filters.Length;i++){
    combiners[i].mesh = filters[i].sharedMesh;
    combiners[i].transform =  filters[i].transform.localToWorldMatrix;
}
// 合并完成的 Mesh
Mesh finalMesh = new Mesh();
finalMesh.CombineMeshes(combiners);

# 编辑器扩展

# FindAssets (查找某些文件夹下特定的资源)

// 查找某些文件夹下的所有的预制体 guid
string[] allStr = AssetDatabase.FindAssets("t:Prefab",文件夹数组);
// 再通过 guid 获取路径资源
string path = AssetDatabase.GUIDToAssetPath(allStr[idx]);

# DisplayProgressBar (生成一个进度条显示)

// 生成一个进度条
EditorUtility.DisplayProgressBar("标题名","路径名",float 进度);
// 清除这个进度条
EditorUtility.ClearProgressBar();

# GetDependencies (获取一个游戏物体的所有依赖资源)

string[] allDepend = AssetDatabase.GetDependencies("游戏物体的资源路径");

# 代码设置 AB 包名

AssetImporter ai = AssetImporter.GetAtPath("资源路径");
if(ai == null) retrun;
ai.assetBundleName = name;

# 清除所有 AB 包名

string[] abNames = AssetDatabase.GetAllAssetBundleNames();
for(int i=0;i<abNames.Length;i++){
  AssetDatabase.RemoveAssetBundleName(abNames[i],true);
}

# GetAssetPathsFromAssetBundle (根据 AB 包名获取 AB 包下所有资源路径)

string[] allResPath = AssetDatabase.GetAssetPathsFromAssetBundle("AB包名");

# 获取当前配置的平台字符串

string platForm= UnityEditor.EditorUserBuildSettings.activeBuildTarget.ToString();

# 获取玩家设置内的版本号

string version = PlayerSettings.bundleVersion;

# 右键获取文件路径

[MenuItem("Assets/获取选中文件路径", false, 0)]
    public static void GetFileRelativePath()
    {
        var guid = Selection.assetGUIDs[0];
        var path = AssetDatabase.GUIDToAssetPath(guid);
        Debug.Log(path);
        GUIUtility.systemCopyBuffer = path;
    }

# 编辑器使用相关

# 关闭自动编译脚本

Edit -> Preferences -> General -> Auto Refresh 取消勾选
使用 Ctrl+R 可手动编译脚本

# Unity 中解决序列化私有变量导致的警告

由于脚本中存在序列化私有变量的情况,就像下面这种情况,这种情况会被 unity 识别为变量未初始化

[SerializeField] private bool isOK;

本着开发者的原则,尽量不要让程序中出现警告,我决定解决这个问题。只需要屏蔽这条警告即可。解决方法如下:在 Asset 目录中新建文件命名为 csc.rsp,在里面添加如下内容:

-nowarn:0649
保存,然后重新打开 unity 编辑器,警告就不会再显示了!

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

汘帆 微信

微信

汘帆 支付宝

支付宝