NLDClient-yudde/ProjectNLD/Assets/Editor/Scene/TreeUtil.cs

82 lines
2.7 KiB
C#
Raw Normal View History

2023-12-07 16:41:41 +08:00
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";
2025-02-28 13:26:03 +08:00
[MenuItem("Assets/*Custom/资源处理/处理树资源")]
2023-12-07 16:41:41 +08:00
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<Tree>() == 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<Shader>(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";
2023-12-09 22:06:08 +08:00
mats[0].enableInstancing = true;
mats[1].enableInstancing = true;
2023-12-07 16:41:41 +08:00
AssetDatabase.AddObjectToAsset(mats[0],tree);
AssetDatabase.AddObjectToAsset(mats[1],tree);
}
//移除tree组件
private static void RemoveUnUseComponent(GameObject tree)
{
var treeComponent = tree.GetComponent<Tree>();
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);
}
}
}
}