Unity 编辑器开发实战【Editor Window】

阅读: 评论:0

Unity 编辑器开发实战【Editor Window】

Unity 编辑器开发实战【Editor Window】

1.Name Duplicator:名称复制机(根据层级结构复制名称)

 

2.Material Duplicator:材质复制机(根据层级结构复制材质)

代码如下:

namespace SK.Framework
{public interface IDuplicator{string InvalidatedInfo { get; }bool IsValidated();void Duplicate();}
}
namespace SK.Framework
{public abstract class AbstractDuplicator<T> : IDuplicator{public virtual string InvalidatedInfo{get{return "Is invalidated.";}}protected T from;protected T to;public abstract bool IsValidated();public abstract void Duplicate();}
}
using UnityEngine;
using System.Text;
using System.Collections.Generic;namespace SK.Framework
{public class NameDuplicator : AbstractDuplicator<Transform>{private readonly Dictionary<string, Transform> fromHierarchy;private readonly Dictionary<string, Transform> toHierarchy;public override string InvalidatedInfo{get{return "Is invalidated:请先验证层级结构是否一致";}}public NameDuplicator(Transform from, Transform to){this.from =  = to;fromHierarchy = new Dictionary<string, Transform>();toHierarchy = new Dictionary<string, Transform>();}//递归遍历From层级private void ForEachFromHierarchy(Transform t){foreach (Transform child in t){string fullName = GetFullName(child);fromHierarchy.Add(fullName, child);ForEachFromHierarchy(child);}}//递归遍历To层级private void ForEachToHierarchy(Transform t){foreach (Transform child in t){string fullName = GetFullName(child);toHierarchy.Add(fullName, child);ForEachToHierarchy(child);}}//获取层级结构private string GetFullName(Transform t){const string flag = "hierarchy";List<Transform> tfs = new List<Transform>();Transform tf = t.transform;tfs.Add(tf);while (tf.parent){tf = tf.parent;tfs.Add(tf);}StringBuilder sb = new StringBuilder();sb.Append($"{flag}{tfs[tfs.Count - 2].GetSiblingIndex()}");for (int i = tfs.Count - 3; i >= 0; i--){sb.Append($"/{flag}{tfs[i].GetSiblingIndex()}");}return sb.ToString();}public override bool IsValidated(){ForEachFromHierarchy(from);ForEachToHierarchy(to);bool retV = true;retV &= fromHierarchy.Count == toHierarchy.Count;foreach (var kv in toHierarchy){if (!fromHierarchy.ContainsKey(kv.Key)){retV = false;break;}}return retV;}public override void Duplicate(){foreach (var kv in toHierarchy){kv.Value.name = fromHierarchy[kv.Key].name;}}}
}
using UnityEngine;
using System.Text;
using System.Collections.Generic;namespace SK.Framework
{public class MaterialDuplicator : AbstractDuplicator<Transform>{private readonly Dictionary<string, Renderer> fromDic;private readonly Dictionary<string, Renderer> toDic;public MaterialDuplicator(Transform from, Transform to){this.from =  = to;fromDic = new Dictionary<string, Renderer>();toDic = new Dictionary<string, Renderer>();}private void GetFromMeshRenderer(){Renderer[] renderers = from.GetComponentsInChildren<Renderer>(true);for(int i = 0; i < renderers.Length; i++){Renderer renderer = renderers[i];fromDic.Add(ansform), renderer);}}private void GetToMeshRenderer(){Renderer[] renderers = to.GetComponentsInChildren<Renderer>(true);for (int i = 0; i < renderers.Length; i++){Renderer renderer = renderers[i];toDic.Add(ansform), renderer);}}private string GetFullName(Transform t){List<Transform> tfs = new List<Transform>();Transform tf = t.transform;tfs.Add(tf);while (tf.parent){tf = tf.parent;tfs.Add(tf);}StringBuilder sb = new StringBuilder();sb.Append(tfs[tfs.Count - 2].name);for (int i = tfs.Count - 3; i >= 0; i--){sb.Append("/" + tfs[i].name);}return sb.ToString();}public override bool IsValidated(){GetFromMeshRenderer();GetToMeshRenderer();bool retV = true;retV &= fromDic.Count == toDic.Count;foreach (var kv in toDic){if (!fromDic.ContainsKey(kv.Key)){retV = false;break;}}return retV;}public override void Duplicate(){foreach (var kv in toDic){kv.Value.sharedMaterials = fromDic[kv.Key].sharedMaterials;}}}
}
using UnityEngine;
using UnityEditor;namespace SK.Framework
{public class DuplicatorWindow : EditorWindow{[MenuItem("SKFramework/Duplicator")]private static void Open(){GetWindow<DuplicatorWindow>("Duplicator").Show();}private Transform from;private Transform to;private bool isValidated;private const float labelWidth = 80f;private enum Mode{Name,Material,}private Mode mode = Mode.Name;private IDuplicator duplicator;private void OnGUI(){OnModeGUI();OnFromToGUI();OnValidateGUI();OnDuplicateGUI();}private void OnModeGUI(){GUILayout.BeginHorizontal();GUILayout.Label("Mode", GUILayout.Width(labelWidth));mode = (Mode)EditorGUILayout.EnumPopup(mode);GUILayout.EndHorizontal();}private void OnFromToGUI(){//FromGUILayout.BeginHorizontal();GUILayout.Label("From", GUILayout.Width(labelWidth));Transform newFrom = EditorGUILayout.ObjectField(from, typeof(Transform), true) as Transform;if (newFrom != from){from = newFrom;isValidated = false;}GUILayout.EndHorizontal();//ToGUILayout.BeginHorizontal();GUILayout.Label("To", GUILayout.Width(labelWidth));Transform newTo = EditorGUILayout.ObjectField(to, typeof(Transform), true) as Transform;if (newTo != to){to = newTo;isValidated = false;}GUILayout.EndHorizontal();}private void OnValidateGUI(){abled = from != null && to != null;if (GUILayout.Button("Validate")){switch (mode){case Mode.Name: duplicator = new NameDuplicator(from, to); break;case Mode.Material: duplicator = new MaterialDuplicator(from, to); break;default: break;}isValidated = duplicator.IsValidated();}abled = true;if (duplicator != null && !isValidated){EditorGUILayout.HelpBox(duplicator.InvalidatedInfo, MessageType.Warning);}}private void OnDuplicateGUI(){abled = isValidated;if (GUILayout.Button("Duplicate")){duplicator.Duplicate();EditorUtility.SetDirty(to);}}}
}

本文发布于:2024-02-01 18:53:03,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170678478538733.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:编辑器   实战   Unity   Editor   Window
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23