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);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|