# UGUI
立刻刷新宽高,不必等到下一帧 ( 不准确,因为如果子节点也自动适配的话要等到子节点刷新完,还是老老实实等下一个物理帧刷新吧
)
| 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 模式下也可运行
# 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 finalMesh = new Mesh(); |
| finalMesh.CombineMeshes(combiners); |
# 编辑器扩展
# FindAssets (查找某些文件夹下特定的资源)
| |
| string[] allStr = AssetDatabase.FindAssets("t:Prefab",文件夹数组); |
| |
| 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 编辑器,警告就不会再显示了!