您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

102 行
4.1 KiB

using UnityEngine;
using UnityEditor;
using UnityEngine.Profiling;
[InitializeOnLoad]
public class GroupEditor
{
static string[] s_PrefabModificationSkips;
static GroupEditor()
{
const string deathstarIconPath = "Assets/Scripts/EditorTools/Editor/DeathStarIcon.png";
const string prefabIconPath = "Assets/Scripts/EditorTools/Editor/PreFabIcon.png";
const string prefabIconDisconnectedPath = "Assets/Scripts/EditorTools/Editor/PreFabIcon_Broken.png";
const string prefabIconOverriddenPath = "Assets/Scripts/EditorTools/Editor/PreFabIcon_Bold.png";
const string prefabIconMissingPath = "Assets/Scripts/EditorTools/Editor/PreFabIcon.png";
s_PrefabModificationSkips = new string[]
{
"m_LocalPosition.x", "m_LocalPosition.y", "m_LocalPosition.z", "m_LocalRotation.x", "m_LocalRotation.y", "m_LocalRotation.z", "m_LocalRotation.w", "m_RootOrder",
"m_AnchoredPosition.x", "m_AnchoredPosition.y", "m_SizeDelta.x", "m_SizeDelta.y", "m_AnchorMin.x", "m_AnchorMin.y", "m_AnchorMax.x", "m_AnchorMax.y", "m_Pivot.x", "m_Pivot.y",
"m_Name"
};
s_IconDeathStar = LoadTexture2D(deathstarIconPath);
s_IconPrefab = LoadTexture2D(prefabIconPath);
s_IconPrefabDisconnected = LoadTexture2D(prefabIconDisconnectedPath);
s_IconPrefabOverridden = LoadTexture2D(prefabIconOverriddenPath);
s_IconPrefabMissing = LoadTexture2D(prefabIconMissingPath);
EditorApplication.hierarchyWindowItemOnGUI += HierarchyWinwodItemOnGui;
}
static void HierarchyWinwodItemOnGui(int instanceID, Rect selectionRect)
{
var target = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
if (target == null)
{
return;
}
int indent = 0;
if (HotKeys.objectsSelectedForCut != null && HotKeys.objectsSelectedForCut.Contains(target))
{
var rect = new Rect(selectionRect.xMax - selectionRect.height - 2 - indent, selectionRect.yMin, selectionRect.height, selectionRect.height);
GUI.DrawTexture(rect, s_IconDeathStar);
indent += 18;
}
var prefabInstanceStatus = PrefabUtility.GetPrefabInstanceStatus(target);
if(prefabInstanceStatus != PrefabInstanceStatus.NotAPrefab && PrefabUtility.GetOutermostPrefabInstanceRoot(target) == target)
{
var icon = s_IconPrefab;
if (prefabInstanceStatus == PrefabInstanceStatus.Disconnected)
icon = s_IconPrefabDisconnected;
else if (prefabInstanceStatus == PrefabInstanceStatus.MissingAsset)
{
icon = s_IconPrefabMissing;
}
else
{
// Check if prefab has modifications where it matters!
bool modified = false;
var mods = PrefabUtility.GetPropertyModifications(target);
foreach (var m in mods)
{
foreach (var s in s_PrefabModificationSkips)
{
if(m.propertyPath.PrefixMatch(s) == s.Length)
//if (m.propertyPath.StartsWith(s))
goto nextModification;
}
modified = true;
break;
nextModification:;
}
if (modified)
icon = s_IconPrefabOverridden;
}
var rect = new Rect(selectionRect.xMax - selectionRect.height - 2 - indent, selectionRect.yMin, selectionRect.height, selectionRect.height);
GUI.DrawTexture(rect, icon);
indent += 18;
}
}
static Texture2D LoadTexture2D(string path)
{
var tex = AssetDatabase.LoadAssetAtPath(path, typeof(Texture2D)) as Texture2D;
if (tex == null)
{
Debug.LogWarning("Unable to load texture at " + path);
}
return tex;
}
static Texture2D s_IconDeathStar;
static Texture2D s_IconPrefab;
static Texture2D s_IconPrefabDisconnected;
static Texture2D s_IconPrefabOverridden;
static Texture2D s_IconPrefabMissing;
}