using System.Collections; using System.Collections.Generic; using SRF; using UnityEditor; using UnityEngine; public static class TreeUtil { private const string TREE_OPAQUE_SHADER = "Assets/Code/Shaders/Scene/NLD_Scene_Opaque.shader"; [MenuItem("Assets/*Custom/资源处理/处理树资源")] private static void PostProcessTree() { var selectedObj = Selection.activeGameObject; if (selectedObj != null && EditorUtility.IsPersistent(selectedObj)) { PostProcessTree(selectedObj); } } //树是从Tree Creator生成的,目前Unity已经不支持了,需要将其中无用的资源删除并且新建材质 public static void PostProcessTree(GameObject tree) { if (tree.GetComponent() == null) { Debug.LogError($"当前对象上没有Tree组件,请确认{tree.name}是树!"); EditorGUIUtility.PingObject(tree); return; } CreateOpaqueMaterial(tree); RemoveUnUseComponent(tree); RemoveTreeUselessSubAsset(tree); EditorUtility.SetDirty(tree); AssetDatabase.Refresh(); Debug.Log("处理成功!"); } //为树创建不透明材质 private static void CreateOpaqueMaterial(GameObject tree) { var opaqueShader = AssetDatabase.LoadAssetAtPath(TREE_OPAQUE_SHADER); if (opaqueShader == null) { Debug.LogError($"找不到shader:{TREE_OPAQUE_SHADER}"); return; } var mats = MaterialUtil.ReplaceMaterialOnGameObject(tree, opaqueShader); mats[0].name = "tree_branch"; mats[1].name = "tree_leaves"; mats[0].enableInstancing = true; mats[1].enableInstancing = true; AssetDatabase.AddObjectToAsset(mats[0],tree); AssetDatabase.AddObjectToAsset(mats[1],tree); } //移除tree组件 private static void RemoveUnUseComponent(GameObject tree) { var treeComponent = tree.GetComponent(); Object.DestroyImmediate(treeComponent, true); } //删除无用资源 private static void RemoveTreeUselessSubAsset(GameObject tree) { var assetPath = AssetDatabase.GetAssetPath(tree); if (string.IsNullOrEmpty(assetPath)) return; var allAssets = AssetDatabase.LoadAllAssetsAtPath(assetPath); for (int i = allAssets.Length - 1; i >= 0; i--) { var asset = allAssets[i]; var assetName = asset.name.ToLower(); if (AssetDatabase.IsSubAsset(asset) && (assetName.Contains("optimized") || assetName.Contains("tree data"))) { AssetDatabase.RemoveObjectFromAsset(asset); } } } }