BITFALL/Assets/BITKit/Unity/Scripts/Scenes/Editor/MaterialPaletteWindow.cs

91 lines
2.1 KiB
C#
Raw Normal View History

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