该项目的目的是同时测试和演示来自 Unity DOTS 技术堆栈的多个新包。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

124 行
4.1 KiB

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
[CustomEditor(typeof(PartRegistryAssetEntry))]
public class PartRegistryAssetEntryEditor : Editor
{
private WeakAssetReference m_lastReference;
private Object lastObject;
public override void OnInspectorGUI()
{
var entry = target as PartRegistryAssetEntry;
var registry = entry.GetComponentInParent<PartRegistryAuthoring>();
EditorGUI.BeginChangeCheck();
// TODO (mogensh) make general method to make WeakAssetReference field
var guidStr = "";
if (entry.Asset.IsSet() && m_lastReference != entry.Asset)
{
guidStr = entry.Asset.ToGuidStr();
var path = AssetDatabase.GUIDToAssetPath(guidStr);
var obj = AssetDatabase.LoadAssetAtPath(path,typeof(GameObject));
lastObject = obj;
m_lastReference = entry.Asset;
}
GUILayout.BeginHorizontal();
EditorGUILayout.PrefixLabel( new GUIContent("Asset" + "(" + guidStr + ")"));
var newObj = EditorGUILayout.ObjectField(lastObject, typeof(GameObject), false);
GUILayout.EndHorizontal();
if (newObj != lastObject)
{
if (newObj != null)
{
var path = AssetDatabase.GetAssetPath(newObj);
entry.Asset = new WeakAssetReference(AssetDatabase.AssetPathToGUID(path));
}
}
var catNames = new string[registry.Categories.Count];
for (var i = 0; i < registry.Categories.Count; i++)
catNames[i] = registry.Categories[i].Name;
entry.CategoryIndex = EditorGUILayout.Popup("Category", entry.CategoryIndex, catNames);
var parts = registry.Categories[entry.CategoryIndex].Parts;
var partNames = new string[parts.Count];
for (var i = 0; i < parts.Count; i++)
{
partNames[i] = parts[i].Name;
}
entry.PartIndex = EditorGUILayout.Popup("Part", entry.PartIndex, partNames);
// Build type
var buildTypeNames = Enum.GetNames(typeof(BuildType));
entry.BuildTypeFlags = EditorGUILayout.MaskField("BuildTypes",entry.BuildTypeFlags, buildTypeNames);
// Rig
if (registry.Rigs.Count > 1)
{
var rigNames = new string[registry.Rigs.Count];
for (var i = 0; i < registry.Rigs.Count; i++)
rigNames[i] = i + ":" + registry.Rigs[i];
entry.RigFlags = EditorGUILayout.MaskField("Rig",entry.RigFlags, rigNames);
}
// LOD
if (registry.LODlevels.Count > 1)
{
var LODNames = new string[registry.LODlevels.Count];
for (int i = 0; i < registry.LODlevels.Count;i++)
{
LODNames[i] = "LOD" + i;
}
entry.LODFlags = EditorGUILayout.MaskField("LOD",entry.LODFlags, LODNames);
}
var buildString = "Build:" + GetFlagString(entry.BuildTypeFlags, Enum.GetNames(typeof(BuildType)).Length);
var rigString = registry.Rigs.Count > 1 ? "Rig:" + GetFlagString(entry.RigFlags, registry.Rigs.Count) : "";
var lodString = registry.LODlevels.Count > 1 ? "LOD:" + GetFlagString(entry.LODFlags, registry.LODlevels.Count) : "";
var partStr = parts[entry.PartIndex].Name;
entry.name = registry.Categories[entry.CategoryIndex].Name + "." + partStr + "<" + buildString + " " + rigString + " " + lodString + ">";
var change = EditorGUI.EndChangeCheck();
if (change)
{
EditorUtility.SetDirty(entry);
EditorUtility.SetDirty(entry.gameObject);
EditorUtility.SetDirty(registry.gameObject);
}
}
string GetFlagString(int LOD, int lodCount)
{
var strBuilder = new StringBuilder();
for (int i = 0; i < lodCount; i++)
{
var flag = 1 << i;
if ((LOD & flag) != 0)
strBuilder.Append("1");
else
strBuilder.Append("x");
}
return strBuilder.ToString();
}
}