diff --git a/Assets/TEngine/Runtime/Unitity/Utils.cs b/Assets/TEngine/Runtime/Unitity/Utils.cs index 049087cc..5787ba5b 100644 --- a/Assets/TEngine/Runtime/Unitity/Utils.cs +++ b/Assets/TEngine/Runtime/Unitity/Utils.cs @@ -290,5 +290,109 @@ namespace TEngine return startIndex; } #endregion + + #region Canvas + /// + /// 增加Canvas并设置绘制顺序 + /// + /// + /// + /// + /// + /// + /// + public static Canvas AddCanvasSortOrder(GameObject go, int sortingOrder, string sortingLayerName, bool addCanvasGroup, bool addGraphicRaycaster = true) + { + if (go == null) + { + return null; + } + Canvas canvas = go.GetComponent(); + if (canvas == null) + { + canvas = go.AddComponent(); + if (addGraphicRaycaster) + { + go.AddComponent(); + } + } + else if (addGraphicRaycaster && go.GetComponent() == null) + { + go.AddComponent(); + } + + if (addCanvasGroup && go.GetComponent() == null) + { + go.AddComponent(); + } + +#if UNITY_EDITOR + if (!go.activeSelf) + { + TLogger.LogWarning(string.Format("Modify sortingOrder and sortingLayerName, gameObject(%s) must be active to take effect", go.name)); + } +#endif + canvas.overrideSorting = true; + canvas.sortingOrder = sortingOrder; + if (!string.IsNullOrEmpty(sortingLayerName)) + { + canvas.sortingLayerName = sortingLayerName; + } + + canvas.additionalShaderChannels = AdditionalCanvasShaderChannels.TexCoord1; + return canvas; + } + + /// + /// 设置粒子特效的SortingOrder + /// + /// + /// + /// + public static void SetParticleSortOrder(GameObject go, int sortOrder, bool isSortParticle) + { + if (go == null) return; + + ParticleSystemRenderer[] psRender = go.GetComponentsInChildren(); + + if (isSortParticle) + { + int lastSortingOrder = 0; + int curSortingOrder = sortOrder; + List psRenderList = new List(psRender); + psRenderList.Sort((a, b) => a.sortingOrder.CompareTo(b.sortingOrder)); + + for (int i = 0, len = psRenderList.Count; i < len; i++) + { + if (lastSortingOrder == 0) + { + lastSortingOrder = psRenderList[i].sortingOrder; + psRenderList[i].sortingOrder = curSortingOrder; + continue; + } + + if (psRenderList[i].sortingOrder == lastSortingOrder) + { + psRenderList[i].sortingOrder = curSortingOrder; + continue; + } + + lastSortingOrder = psRenderList[i].sortingOrder; + + ++curSortingOrder; + psRenderList[i].sortingOrder = curSortingOrder; + } + } + else + { + for (int i = 0, len = psRender.Length; i < len; i++) + { + psRender[i].sortingOrder = sortOrder; + } + } + } + + + #endregion } }