Gameplay Ingredients是一组用于 Unity 游戏的运行时和编辑器工具:一组脚本的集合,可在制作游戏和原型时简化简单的任务。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

248 行
8.4 KiB

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.Playables;
#if UNITY_2019_3_OR_NEWER
using UnityEngine.VFX;
#else
using UnityEngine.Experimental.VFX;
#endif
using UnityEngine.Timeline;
namespace GameplayIngredients.Editor
{
[CustomEditor(typeof(Discover))]
public class DiscoverEditor : UnityEditor.Editor
{
const string kEditPreferenceName = "GameplayIngredients.DiscoverEditor.Editing";
static bool editing
{
get { return EditorPrefs.GetBool(kEditPreferenceName, false); }
set { if (value != editing) EditorPrefs.SetBool(kEditPreferenceName, value); }
}
Discover m_Discover;
private void OnEnable()
{
m_Discover = serializedObject.targetObject as Discover;
if (m_Discover.transform.hideFlags != HideFlags.HideInInspector)
m_Discover.transform.hideFlags = HideFlags.HideInInspector;
}
public override void OnInspectorGUI()
{
using (new GUILayout.HorizontalScope())
{
if (GUILayout.Button("Align Discover to View"))
{
var transform = (serializedObject.targetObject as Discover).gameObject.transform;
var svTransform = SceneView.lastActiveSceneView.camera.transform;
transform.position = svTransform.position;
transform.rotation = svTransform.rotation;
transform.localScale = Vector3.one;
}
GUILayout.FlexibleSpace();
editing = GUILayout.Toggle(editing, "Edit", EditorStyles.miniButton, GUILayout.Width(48));
}
if (editing)
DrawDefaultInspector();
else
DrawDiscoverContentGUI(m_Discover);
}
public static void DrawDiscoverContentGUI(Discover discover)
{
if(!string.IsNullOrEmpty(discover.Category))
GUILayout.Label(discover.Category, DiscoverWindow.Styles.subHeader);
GUILayout.Label(discover.Name, DiscoverWindow.Styles.header);
using (new GUILayout.VerticalScope(DiscoverWindow.Styles.indent))
{
if (discover.Description != null && discover.Description != string.Empty)
{
GUILayout.Label(discover.Description, DiscoverWindow.Styles.body);
}
GUILayout.Space(8);
if (discover.image != null)
{
DrawImage(discover.image);
}
foreach (var section in discover.Sections)
{
SectionGUI(section);
GUILayout.Space(16);
}
}
}
public static void DrawImage(Texture texture)
{
float aspect = (float)texture.width / texture.height;
var rect = GUILayoutUtility.GetAspectRect(aspect);
GUI.DrawTexture(rect, texture, ScaleMode.ScaleToFit, false);
}
public static void SectionGUI(DiscoverSection section)
{
using (new DiscoverWindow.GroupLabelScope(section.SectionName))
{
using (new GUILayout.VerticalScope(DiscoverWindow.Styles.slightIndent))
{
GUILayout.Label(section.SectionContent, DiscoverWindow.Styles.body);
if(section.image != null)
{
DrawImage(section.image);
}
if (section.Actions != null && section.Actions.Length > 0)
{
GUILayout.Space(8);
using (new GUILayout.VerticalScope(GUI.skin.box))
{
foreach (var action in section.Actions)
{
using (new GUILayout.HorizontalScope())
{
GUILayout.Label(action.Description);
GUILayout.FlexibleSpace();
using (new GUILayout.HorizontalScope(GUILayout.MinWidth(160), GUILayout.Height(22)))
{
ActionButtonGUI(action.Target);
}
}
}
}
}
}
}
}
static void ActionButtonGUI(UnityEngine.Object target)
{
if (target == null)
{
EditorGUI.BeginDisabledGroup(true);
GUILayout.Button("(No Object)");
EditorGUI.EndDisabledGroup();
return;
}
Type t = target.GetType();
if (t == typeof(GameObject))
{
GameObject go = target as GameObject;
if (GUILayout.Button(" Select ", DiscoverWindow.Styles.buttonLeft))
{
Selection.activeObject = go;
}
if(PrefabUtility.GetPrefabAssetType(go) == PrefabAssetType.NotAPrefab)
{
if (GUILayout.Button(" Go to ", DiscoverWindow.Styles.buttonRight))
{
Selection.activeObject = go;
SceneView.lastActiveSceneView.FrameSelected();
}
}
else
{
if (GUILayout.Button(" Open ", DiscoverWindow.Styles.buttonRight))
{
AssetDatabase.OpenAsset(go);
}
}
}
else if (t == typeof(Discover))
{
if (GUILayout.Button("Discover"))
{
var discover = target as Discover;
Selection.activeGameObject = discover.gameObject;
DiscoverWindow.SelectDiscover(discover);
}
}
else if (t == typeof(VisualEffectAsset))
{
if (GUILayout.Button("Open VFX Graph"))
{
VisualEffectAsset graph = target as VisualEffectAsset;
AssetDatabase.OpenAsset(graph);
}
}
else if (t == typeof(Animation))
{
if (GUILayout.Button("Open Animation"))
{
Animation animation = target as Animation;
AssetDatabase.OpenAsset(animation);
}
}
else if (t == typeof(TimelineAsset))
{
if (GUILayout.Button("Open Timeline"))
{
TimelineAsset timeline = target as TimelineAsset;
AssetDatabase.OpenAsset(timeline);
}
}
else if (t == typeof(PlayableDirector))
{
if (GUILayout.Button("Open Director"))
{
PlayableDirector director = target as PlayableDirector;
AssetDatabase.OpenAsset(director.playableAsset);
Selection.activeObject = director.gameObject;
}
}
else if (t == typeof(Shader))
{
if (GUILayout.Button("Open Shader"))
{
Shader shader = target as Shader;
AssetDatabase.OpenAsset(shader);
}
}
else if (t == typeof(SceneAsset))
{
if (GUILayout.Button("Open Scene"))
{
SceneAsset scene = target as SceneAsset;
AssetDatabase.OpenAsset(scene);
}
}
else if (t == typeof(EditorSceneSetup))
{
if (GUILayout.Button("Open Scenes"))
{
EditorSceneSetup scene = target as EditorSceneSetup;
AssetDatabase.OpenAsset(scene);
}
}
else
{
if (GUILayout.Button("Select"))
{
Selection.activeObject = target;
}
}
}
}
}