2024-03-12 21:54:29 +08:00
|
|
|
using System;
|
|
|
|
using System.Collections;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using UnityEditor;
|
|
|
|
using UnityEditor.UIElements;
|
|
|
|
using UnityEngine;
|
|
|
|
using UnityEngine.UIElements;
|
2024-03-22 20:16:32 +08:00
|
|
|
using Object = UnityEngine.Object;
|
2024-03-12 21:54:29 +08:00
|
|
|
|
|
|
|
namespace BITKit
|
|
|
|
{
|
|
|
|
public class MaterialPaletteWindow : EditorWindow
|
|
|
|
{
|
|
|
|
[MenuItem("Tools/Scenes/Material Palette")]
|
|
|
|
public static void Open()
|
|
|
|
{
|
|
|
|
GetWindow<MaterialPaletteWindow>().Show();
|
|
|
|
}
|
|
|
|
|
|
|
|
private Button buildButton;
|
|
|
|
private Label _titleLabel;
|
|
|
|
private VisualElement _container;
|
2024-03-22 20:16:32 +08:00
|
|
|
|
|
|
|
private Renderer[] _renderers=Array.Empty<Renderer>();
|
2024-03-12 21:54:29 +08:00
|
|
|
|
|
|
|
private void OnEnable()
|
|
|
|
{
|
|
|
|
UnityEditor.Selection.selectionChanged += OnSelectionChanged;
|
|
|
|
|
|
|
|
rootVisualElement.Clear();
|
|
|
|
_titleLabel = rootVisualElement.Create<Label>();
|
|
|
|
_container = rootVisualElement.Create<VisualElement>();
|
|
|
|
|
|
|
|
_titleLabel.text = "选择一个物体";
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnDisable()
|
|
|
|
{
|
|
|
|
UnityEditor.Selection.selectionChanged -= OnSelectionChanged;
|
|
|
|
}
|
|
|
|
|
|
|
|
private void OnSelectionChanged()
|
|
|
|
{
|
|
|
|
var active = UnityEditor.Selection.activeGameObject;
|
|
|
|
|
|
|
|
_container.Clear();
|
|
|
|
|
|
|
|
_titleLabel.text = active ? active.name : "未选择物体";
|
|
|
|
if (!active) return;
|
2024-03-22 20:16:32 +08:00
|
|
|
foreach (var x in _renderers = active.GetComponentsInChildren<MeshRenderer>())
|
2024-03-12 21:54:29 +08:00
|
|
|
{
|
|
|
|
foreach (var material in x.sharedMaterials)
|
|
|
|
{
|
2024-03-22 20:16:32 +08:00
|
|
|
var filed = _container.Create<ObjectField>();
|
2024-03-12 21:54:29 +08:00
|
|
|
filed.label = material.name;
|
|
|
|
filed.objectType = typeof(Material);
|
|
|
|
filed.value = material;
|
2024-03-22 20:16:32 +08:00
|
|
|
filed.RegisterValueChangedCallback(OnChanged);
|
2024-03-12 21:54:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
2024-03-22 20:16:32 +08:00
|
|
|
|
|
|
|
private void OnChanged(ChangeEvent<Object> evt)
|
|
|
|
{
|
|
|
|
if(evt.newValue is not Material value) return;
|
|
|
|
var list = new List<Object>();
|
|
|
|
foreach (var renderer in _renderers)
|
|
|
|
{
|
|
|
|
for (int i = 0; i < renderer.materials.Length; i++)
|
|
|
|
{
|
|
|
|
var current = renderer.materials[i];
|
|
|
|
if (current != evt.previousValue) return;
|
|
|
|
|
|
|
|
renderer.materials[i] = value;
|
|
|
|
|
|
|
|
list.Add(current);
|
|
|
|
|
|
|
|
EditorUtility.SetDirty(renderer);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void ReplaceMaterial(Material oldMaterial,Material newMaterial)
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
2024-03-12 21:54:29 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|