summaryrefslogtreecommitdiff
path: root/Assets/ActionTool
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2021-07-08 22:52:08 +0800
committerchai <chaifix@163.com>2021-07-08 22:52:08 +0800
commita0577c8f3415b3173f8d57af631785b43c18d086 (patch)
tree8f21c6ff4712bc8d4f6e3aaeb7cbbc5ac83a2bc7 /Assets/ActionTool
parent69f50d88127cdb0a1c52549f24dff70a4a9adb76 (diff)
*Action Editor
Diffstat (limited to 'Assets/ActionTool')
-rw-r--r--Assets/ActionTool/ActionToolGizmos.cs21
-rw-r--r--Assets/ActionTool/ActionToolGizmos.cs.meta11
-rw-r--r--Assets/ActionTool/Editor/ActionData.cs52
-rw-r--r--Assets/ActionTool/Editor/ActionEditor.cs23
-rw-r--r--Assets/ActionTool/Editor/ActionEditorStyles.cs18
-rw-r--r--Assets/ActionTool/Editor/ActionEditorUI.cs23
-rw-r--r--Assets/ActionTool/Editor/ActionManager.cs69
-rw-r--r--Assets/ActionTool/Editor/ActionPreviewEditor.cs138
-rw-r--r--Assets/ActionTool/Resources/select_dark.pngbin0 -> 239 bytes
-rw-r--r--Assets/ActionTool/Resources/select_dark.png.meta88
-rw-r--r--Assets/ActionTool/Resources/select_white.pngbin0 -> 246 bytes
-rw-r--r--Assets/ActionTool/Resources/select_white.png.meta88
12 files changed, 484 insertions, 47 deletions
diff --git a/Assets/ActionTool/ActionToolGizmos.cs b/Assets/ActionTool/ActionToolGizmos.cs
new file mode 100644
index 00000000..dfbbae0a
--- /dev/null
+++ b/Assets/ActionTool/ActionToolGizmos.cs
@@ -0,0 +1,21 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ActionToolGizmos : MonoBehaviour
+{
+
+ private void OnDrawGizmos()
+ {
+ Gizmos.color = Color.yellow;
+ Gizmos.DrawCube(transform.position, new Vector3(0.1f, 0.1f, 0.1f));
+
+ Gizmos.color = Color.red;
+ Gizmos.DrawLine(Vector3.zero, Vector3.right * 1000);
+ Gizmos.color = Color.green;
+ Gizmos.DrawLine(Vector3.zero, Vector3.up * 1000);
+ Gizmos.color = Color.blue;
+ Gizmos.DrawLine(-Vector3.forward * 1000, Vector3.forward * 1000);
+ }
+
+}
diff --git a/Assets/ActionTool/ActionToolGizmos.cs.meta b/Assets/ActionTool/ActionToolGizmos.cs.meta
new file mode 100644
index 00000000..1339ea05
--- /dev/null
+++ b/Assets/ActionTool/ActionToolGizmos.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f2a6b1bbe8a21fe44b9a3626c5c94ec2
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ActionTool/Editor/ActionData.cs b/Assets/ActionTool/Editor/ActionData.cs
index 4465d314..958e2c53 100644
--- a/Assets/ActionTool/Editor/ActionData.cs
+++ b/Assets/ActionTool/Editor/ActionData.cs
@@ -20,11 +20,29 @@ namespace ActionTool
private AnimationEventBase m_CurEventInfo; // 当前正在编辑的event
- private float m_TotalFrame;
- private int m_PrevFrame;
+ #region metadata
+ private float m_TotalFrame; //timeline采样的总帧数
+ public float totalFrame { get { return m_TotalFrame; } }
+ private float m_SampleRate; // 每次采样的时间间隔
+ public float sampleRate { get { return m_SampleRate; } }
+ #endregion
+
+ public float curAnimFrame { get { return m_CurAnimFrame; } }
- private float m_AnimRate; // 每帧时间
+ public float curAnimTimeNormal
+ {
+ get
+ {
+ return m_CurAnimFrame / m_TotalFrame;
+ }
+ set
+ {
+ float v = value % m_TotalFrame;
+ m_CurAnimFrame = v * m_TotalFrame;
+ }
+ }
+ private int m_PrevFrame;
private float m_CurAnimFrame;
private double m_PrevLocalTime;
@@ -39,7 +57,7 @@ namespace ActionTool
if(m_Clip != null)
{
m_TotalFrame = m_Clip.length * ActionManager.FPS;
- m_AnimRate = m_Clip.length / m_TotalFrame;
+ m_SampleRate = m_Clip.length / m_TotalFrame;
}
m_PrevFrame = -1;
m_CurAnimFrame = 0;
@@ -114,19 +132,19 @@ namespace ActionTool
public void UpdateFrame()
{
- if (!ActionManager.IsPlay)
- return;
-
- m_CurAnimFrame += (float)(EditorApplication.timeSinceStartup - m_PrevLocalTime) * (ActionManager.FPS * ActionManager.Speed);
+ if (ActionManager.IsPlay)
+ {
+ m_CurAnimFrame += (float)(EditorApplication.timeSinceStartup - m_PrevLocalTime) * (ActionManager.FPS * ActionManager.Speed);
- if (m_CurAnimFrame > m_TotalFrame)
- {
- m_Animator.transform.position = ActionManager.s_InitPosition;
- m_Animator.transform.rotation = ActionManager.s_InitRotation;
+ if (m_CurAnimFrame > m_TotalFrame)
+ {
+ m_Animator.transform.position = ActionManager.s_InitPosition;
+ m_Animator.transform.rotation = ActionManager.s_InitRotation;
+ }
+ m_CurAnimFrame %= m_TotalFrame;
}
- m_CurAnimFrame %= m_TotalFrame;
- SampleFrame(EditorApplication.timeSinceStartup - m_PrevLocalTime);
+ SampleFrame();
RunEvent();
@@ -134,7 +152,7 @@ namespace ActionTool
}
// 播放当前帧
- public void SampleFrame(double dt)
+ public void SampleFrame()
{
if (m_Animator == null)
return;
@@ -154,7 +172,7 @@ namespace ActionTool
public int GetCurrentFrame()
{
- float animTime = m_AnimRate * m_CurAnimFrame;
+ float animTime = sampleRate * m_CurAnimFrame;
int curFrame = Mathf.RoundToInt(animTime * ActionManager.FPS);
return curFrame;
}
@@ -220,7 +238,7 @@ namespace ActionTool
m_CurAnimFrame = 0;
m_PrevFrame = 0;
m_PrevLocalTime = 0;
- m_AnimRate = 0;
+ m_SampleRate = 0;
}
}
diff --git a/Assets/ActionTool/Editor/ActionEditor.cs b/Assets/ActionTool/Editor/ActionEditor.cs
index 71942d34..2835714a 100644
--- a/Assets/ActionTool/Editor/ActionEditor.cs
+++ b/Assets/ActionTool/Editor/ActionEditor.cs
@@ -15,11 +15,13 @@ namespace ActionTool
ActionManager.AnimationWindow = GetWindow<ActionEditor>();
}
- private string m_SearchText = "";
+ string m_SearchText = "";
+ ActionEditorStyles styles;
+ ActionEditorUI ui;
public void OnEnable()
{
-
+ titleContent = new GUIContent("Action Editor");
}
public void OnDisable()
@@ -28,6 +30,11 @@ namespace ActionTool
public void OnGUI()
{
+ if (styles == null) styles = ActionEditorStyles.Get();
+ if (ui == null) ui = ActionEditorUI.Get();
+ if (ActionManager.CurrentUnit == null)
+ ActionManager.Release();
+
GUILayout.Space(5);
GUI_SelectUnit();
GUILayout.Space(5);
@@ -68,7 +75,7 @@ namespace ActionTool
private void GUI_AnimationList()
{
if (!ActionManager.HasSelectObj())
- return;
+ return;
string unitName = ActionManager.GetUnitName();
@@ -102,11 +109,17 @@ namespace ActionTool
if (!show)
continue;
bool bChecked = ActionManager.CurrentAnimationName == animName;
- bool check = GUILayout.Toggle(bChecked, animName, style, GUILayout.Height(15));
+ EditorGUILayout.BeginHorizontal();
+ bool check = GUILayout.Toggle(bChecked, animName, style, GUILayout.Width(position.width - 42), GUILayout.Height(15));
if (check && ActionManager.CurrentAnimationName != animName)
ActionManager.OnSelectAnimation(animName);
+ if(GUILayout.Button("", styles.selectObj, GUILayout.Width(15), GUILayout.Height(15)))
+ {
+ ui.SelectObject(file);
+ }
+ EditorGUILayout.EndHorizontal();
}
-
+
EditorGUILayout.EndScrollView();
style.alignment = prevAnchor;
diff --git a/Assets/ActionTool/Editor/ActionEditorStyles.cs b/Assets/ActionTool/Editor/ActionEditorStyles.cs
index c7c15aaf..664753ef 100644
--- a/Assets/ActionTool/Editor/ActionEditorStyles.cs
+++ b/Assets/ActionTool/Editor/ActionEditorStyles.cs
@@ -8,9 +8,12 @@ namespace ActionTool
internal class ActionEditorStyles
{
public GUIStyle textBold;
+ public GUIStyle selectObj;
+ public GUIStyle textSmall;
- private static ActionEditorStyles s_instance;
+ Texture2D m_SelectIcon;
+ private static ActionEditorStyles s_instance;
public static ActionEditorStyles Get()
{
bool flag = s_instance == null;
@@ -23,9 +26,22 @@ namespace ActionTool
private ActionEditorStyles()
{
+ m_SelectIcon = (Texture2D)Resources.Load<Texture2D>("select_white");
+ m_SelectIcon.filterMode = FilterMode.Point;
+
InitStyle(out textBold, GUI.skin.label, s => {
s.fontStyle = FontStyle.Bold;
});
+ InitStyle(out selectObj, GUI.skin.button, s => {
+ s.normal.background = m_SelectIcon;
+ s.active.background = m_SelectIcon;
+ s.focused.background = m_SelectIcon;
+ s.hover.background = m_SelectIcon;
+ s.normal.background = m_SelectIcon;
+ });
+ InitStyle(out textSmall, GUI.skin.label, s => {
+ s.fontSize = 8;
+ });
}
private delegate void Initter(GUIStyle style);
diff --git a/Assets/ActionTool/Editor/ActionEditorUI.cs b/Assets/ActionTool/Editor/ActionEditorUI.cs
index effa6be7..f04c10ea 100644
--- a/Assets/ActionTool/Editor/ActionEditorUI.cs
+++ b/Assets/ActionTool/Editor/ActionEditorUI.cs
@@ -7,7 +7,11 @@ namespace ActionTool
{
internal class ActionEditorUI
{
- private static ActionEditorUI s_instance;
+ static ActionEditorUI s_instance;
+
+ static Material m_material;
+
+ public Material defaultUIMaterail { get { return m_material; } }
public static ActionEditorUI Get()
{
@@ -21,6 +25,8 @@ namespace ActionTool
private ActionEditorUI()
{
+ m_material = new Material(Shader.Find("Hidden/Internal-Colored"));
+ m_material.hideFlags = HideFlags.HideAndDontSave;
}
public void DrawVerticalLineFast(float x, float minY, float maxY, Color color)
@@ -61,5 +67,20 @@ namespace ActionTool
}
}
+ public void SelectObject(Object obj)
+ {
+ Selection.activeObject = obj;
+ EditorGUIUtility.PingObject(obj);
+ }
+
+ public void SelectObject(string path)
+ {
+ Object obj = AssetDatabase.LoadAssetAtPath(path, typeof(Object)) as Object;
+ if(obj)
+ {
+ SelectObject(obj);
+ }
+ }
+
}
} \ No newline at end of file
diff --git a/Assets/ActionTool/Editor/ActionManager.cs b/Assets/ActionTool/Editor/ActionManager.cs
index 32c71434..08d48781 100644
--- a/Assets/ActionTool/Editor/ActionManager.cs
+++ b/Assets/ActionTool/Editor/ActionManager.cs
@@ -17,6 +17,7 @@ namespace ActionTool
public static ActionEventEditor EventEditWindow;
public static ActionColliderEditor ColliderWindow;
+ //规定timeline上事件的采样频率是30帧
public const int FPS = 30;
public static float Speed = 1;
@@ -44,6 +45,7 @@ namespace ActionTool
private static AnimatorOverrideController s_OverrideContorller;
private static ActionData s_CurActionData;
+ public static ActionData actionData { get { return s_CurActionData; } }
public static Vector3 s_InitPosition = Vector3.zero;
@@ -51,9 +53,18 @@ namespace ActionTool
private static RootMotionData s_RootMotion;
+ private static ActionToolGizmos s_Gizmos;
+ public static ActionToolGizmos gizmos { get { return s_Gizmos; } }
+
+ // 是否在自动播放
private static bool s_IsPlay;
public static bool IsPlay { get { return s_IsPlay; } }
+ private static GameObject s_RootActionTool;
+ private const string kRootActionTool = "RootActionTool";
+
+ public const int kMaxEventsPerFrame = 10;
+
public static void OnSelectObj(GameObject obj)
{
Release();
@@ -79,7 +90,7 @@ namespace ActionTool
s_OverrideContorller["EmptyAction"] = clip;
}
- string rootmotionData = s_RootMotionDataFolder + s_CurrentUnit.name + "/" + animation.Replace(' ', '_') + ".asset";
+ string rootmotionData = s_RootMotionDataFolder + s_CurrentUnit.name + "/" + animation + ".asset";
s_RootMotion = AssetDatabase.LoadAssetAtPath<RootMotionData>(rootmotionData);
if (s_RootMotion == null)
{
@@ -89,7 +100,6 @@ namespace ActionTool
if (s_CurActionData == null)
s_CurActionData = new ActionData();
s_CurActionData.Initialize(s_Animator, clip, s_RootMotion);
-
}
public static bool HasSelectObj()
@@ -112,6 +122,10 @@ namespace ActionTool
s_CurrentUnit = null;
s_CurrentAnimationName = null;
s_Animator = null;
+ s_RootActionTool = GameObject.Find(kRootActionTool);
+ if (s_RootActionTool)
+ GameObject.DestroyImmediate(s_RootActionTool);
+ s_CurActionData = null;
}
private static void InitializeUnitInstance(GameObject unit)
@@ -122,6 +136,12 @@ namespace ActionTool
unit.transform.position = s_InitPosition;
unit.transform.rotation = s_InitRotation;
+ s_RootActionTool = GameObject.Find(kRootActionTool);
+ if(s_RootActionTool == null)
+ s_RootActionTool = new GameObject(kRootActionTool);
+
+ unit.transform.SetParent(s_RootActionTool.transform);
+
s_Animator = unit.GetComponentInChildren<Animator>();
if(s_Animator == null)
{
@@ -141,6 +161,8 @@ namespace ActionTool
s_Animator.runtimeAnimatorController = s_OverrideContorller;
s_Animator.applyRootMotion = false;
+
+ s_Gizmos = unit.AddComponent<ActionToolGizmos>();
}
public static void UpdateFrame()
@@ -154,10 +176,51 @@ namespace ActionTool
s_IsPlay = !s_IsPlay;
if(s_IsPlay && s_CurActionData != null)
{
- s_CurActionData.SetCurrentAnimTime(0);
s_CurActionData.StartFrame();
}
}
+ public static void Start()
+ {
+ if (s_CurActionData != null)
+ s_CurActionData.curAnimTimeNormal = 0;
+ }
+
+ public static void Stop()
+ {
+ if (s_CurActionData != null)
+ {
+ if (s_IsPlay)
+ Pause();
+ s_CurActionData.curAnimTimeNormal = 0;
+ }
+ }
+
+ public static void Previous()
+ {
+ if (s_IsPlay)
+ Pause();
+ float cur = s_CurActionData.curAnimFrame;
+ float pre = Mathf.Ceil(cur - 1);
+ pre = (int)Mathf.Clamp(pre, 0, s_CurActionData.totalFrame);
+ s_CurActionData.SetCurrentAnimTime(pre);
+ }
+
+ public static void Next()
+ {
+ if (s_IsPlay)
+ Pause();
+ float cur = s_CurActionData.curAnimFrame;
+ float next = Mathf.Floor(cur + 1);
+ next = (int)Mathf.Clamp(next, 0, s_CurActionData.totalFrame);
+ s_CurActionData.SetCurrentAnimTime(next);
+ }
+
+ public static void End()
+ {
+ if (s_CurActionData != null)
+ s_CurActionData.curAnimTimeNormal = 1;
+ }
+
}
} \ No newline at end of file
diff --git a/Assets/ActionTool/Editor/ActionPreviewEditor.cs b/Assets/ActionTool/Editor/ActionPreviewEditor.cs
index 9b557128..d0934cf9 100644
--- a/Assets/ActionTool/Editor/ActionPreviewEditor.cs
+++ b/Assets/ActionTool/Editor/ActionPreviewEditor.cs
@@ -8,22 +8,25 @@ namespace ActionTool
public class ActionPreviewEditor : EditorWindow
{
- private Texture m_UITextureStop;
- private Texture m_UITexturePause;
- private Texture m_UITexturePlay;
- private Texture m_UITextureNext;
- private Texture m_UITextureEnd;
- private Texture m_UITexturePrevious;
- private Texture m_UITextureStart;
+ Texture m_UITextureStop;
+ Texture m_UITexturePause;
+ Texture m_UITexturePlay;
+ Texture m_UITextureNext;
+ Texture m_UITextureEnd;
+ Texture m_UITexturePrevious;
+ Texture m_UITextureStart;
- private GUIStyle m_StyleBold;
+ GUIStyle m_StyleBold;
- private const float kToolbarControlMargin = 5;
- private const float kToolbarHeight = 50;
- private const float kToolbarControlSize = kToolbarHeight - kToolbarControlMargin * 2;
+ const float kToolbarControlMargin = 5;
+ const float kToolbarHeight = 50;
+ const float kToolbarControlSize = kToolbarHeight - kToolbarControlMargin * 2;
+ const float kTimeLineViewXOffset = 20;
+ const float kFrameWidth = 10;
+ const float kFrameHeight = 20;
- private ActionEditorStyles styles;
- private ActionEditorUI ui;
+ ActionEditorStyles styles;
+ ActionEditorUI ui;
private void OnEnable()
{
@@ -40,6 +43,11 @@ namespace ActionTool
styles = ActionEditorStyles.Get();
}
+ void Update()
+ {
+ ActionManager.UpdateFrame();
+ }
+
private void OnDisable()
{
ActionManager.PreviewWindow = null;
@@ -58,6 +66,7 @@ namespace ActionTool
GUI_Toolbar();
GUI_Detail();
+ GUI_TimeLineView();
}
void GUI_Toolbar()
@@ -83,7 +92,7 @@ namespace ActionTool
Rect rect = new Rect(x, y, kToolbarControlSize, kToolbarControlSize);
if(GUI.Button(rect, m_UITextureStart))
{
-
+ ActionManager.Start();
}
x += kToolbarControlSize;
}
@@ -94,7 +103,7 @@ namespace ActionTool
Rect rect = new Rect(x, y, kToolbarControlSize, kToolbarControlSize);
if (GUI.Button(rect, m_UITexturePrevious))
{
-
+ ActionManager.Previous();
}
x += kToolbarControlSize;
}
@@ -105,7 +114,7 @@ namespace ActionTool
Rect rect = new Rect(x, y, kToolbarControlSize, kToolbarControlSize);
if (GUI.Button(rect, m_UITextureStop))
{
-
+ ActionManager.Stop();
}
x += kToolbarControlSize;
}
@@ -128,7 +137,7 @@ namespace ActionTool
Rect rect = new Rect(x, y, kToolbarControlSize, kToolbarControlSize);
if (GUI.Button(rect, m_UITextureNext))
{
-
+ ActionManager.Next();
}
x += kToolbarControlSize;
}
@@ -139,7 +148,7 @@ namespace ActionTool
Rect rect = new Rect(x, y, kToolbarControlSize, kToolbarControlSize);
if (GUI.Button(rect, m_UITextureEnd))
{
-
+ ActionManager.End();
}
x += kToolbarControlSize;
}
@@ -153,12 +162,101 @@ namespace ActionTool
x += 105;
GUI.Label(new Rect(x, y, 210, 20), ActionManager.CurrentAnimationName, styles.textBold);
x += 200;
+ }
+ void GUI_TimeLineView()
+ {
+ if (ActionManager.actionData == null)
+ return;
+
+ float y = 80;
+
+ GUI_FrameText(ref y);
+ GUI_Slider(ref y);
+ GUI_Grid(ref y);
+ GUI_Events(ref y);
}
- void Update()
+ void GUI_FrameText(ref float y)
{
- ActionManager.UpdateFrame();
+ ActionData action = ActionManager.actionData;
+ int sampleCount = (int)action.totalFrame + 1;
+ Rect rect = new Rect(0, y, 20, 15);
+ for(int i = 0; i < sampleCount; i++)
+ {
+ rect.x = kTimeLineViewXOffset + i * kFrameWidth - 7;
+ if(i % 5 == 0)
+ {
+ Color c = GUI.color;
+ GUI.color = i % 10 == 0 ? Color.yellow : GUI.color;
+ GUI.Label(rect, i.ToString(), styles.textSmall);
+ GUI.color = c;
+ }
+ }
+ y += 15;
+ }
+
+ void GUI_Slider( ref float y)
+ {
+ ActionData action = ActionManager.actionData;
+ Rect rect = new Rect(kTimeLineViewXOffset - 4, y, action.totalFrame * kFrameWidth + 8, 15);
+ float t = GUI.HorizontalSlider(rect,action.curAnimTimeNormal, 0, 1);
+ if(t != action.curAnimTimeNormal)
+ {
+ if(ActionManager.IsPlay)
+ ActionManager.Pause();
+ action.curAnimTimeNormal = t;
+ }
+
+ if(ActionManager.IsPlay)
+ {
+ this.Repaint();
+ }
+
+ y += 20;
+ }
+
+ void GUI_Grid(ref float y)
+ {
+ ActionData action = ActionManager.actionData;
+ int sampleCount = (int)action.totalFrame + 1;
+
+ Rect bgRect = new Rect(kTimeLineViewXOffset, y, action.totalFrame * kFrameWidth, ActionManager.kMaxEventsPerFrame * kFrameHeight);
+ GUI.Box(bgRect, "");
+
+ ui.defaultUIMaterail.SetPass(0);
+ GL.PushMatrix();
+ GL.LoadPixelMatrix();
+ bool bWin = Application.platform == RuntimePlatform.WindowsEditor;
+ if (bWin)
+ GL.Begin(GL.QUADS);
+ else
+ GL.Begin(GL.LINES);
+ Color lineColor = new Color(0.3f, 0.3f, 0.3f);
+ Color lineColor2 = new Color(0.5f, 0.5f, 0.5f);
+ for (int i = 0; i < ActionManager.kMaxEventsPerFrame + 1; i++)
+ {
+ ui.DrawHorizontalLineFast(y + i * kFrameHeight, kTimeLineViewXOffset, kTimeLineViewXOffset + action.totalFrame * kFrameWidth, lineColor);
+ }
+ for(int i = 0; i <= sampleCount; ++i)
+ {
+ Color c = i % 5 == 0 ? lineColor2 : lineColor;
+ float x = kTimeLineViewXOffset + i * kFrameWidth;
+ x = Mathf.Clamp(x, kTimeLineViewXOffset, kTimeLineViewXOffset + action.totalFrame * kFrameWidth);
+ ui.DrawVerticalLineFast(x, y, y + ActionManager.kMaxEventsPerFrame * kFrameHeight, c);
+ }
+
+ ui.DrawVerticalLineFast(kTimeLineViewXOffset + bgRect.width * action.curAnimTimeNormal, y, y + ActionManager.kMaxEventsPerFrame * kFrameHeight, Color.red);
+
+ GL.PopMatrix();
+ GL.End();
+
+ y += ActionManager.kMaxEventsPerFrame * kFrameHeight;
+ }
+
+ void GUI_Events(ref float y)
+ {
+
}
}
diff --git a/Assets/ActionTool/Resources/select_dark.png b/Assets/ActionTool/Resources/select_dark.png
new file mode 100644
index 00000000..0e2e5d1c
--- /dev/null
+++ b/Assets/ActionTool/Resources/select_dark.png
Binary files differ
diff --git a/Assets/ActionTool/Resources/select_dark.png.meta b/Assets/ActionTool/Resources/select_dark.png.meta
new file mode 100644
index 00000000..fe488367
--- /dev/null
+++ b/Assets/ActionTool/Resources/select_dark.png.meta
@@ -0,0 +1,88 @@
+fileFormatVersion: 2
+guid: 02237789ccf5fb14991c17d178ecc63e
+TextureImporter:
+ fileIDToRecycleName: {}
+ externalObjects: {}
+ serializedVersion: 9
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 2
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/ActionTool/Resources/select_white.png b/Assets/ActionTool/Resources/select_white.png
new file mode 100644
index 00000000..7f252f9b
--- /dev/null
+++ b/Assets/ActionTool/Resources/select_white.png
Binary files differ
diff --git a/Assets/ActionTool/Resources/select_white.png.meta b/Assets/ActionTool/Resources/select_white.png.meta
new file mode 100644
index 00000000..b5fcd79c
--- /dev/null
+++ b/Assets/ActionTool/Resources/select_white.png.meta
@@ -0,0 +1,88 @@
+fileFormatVersion: 2
+guid: 075f22766660e094cae3e5f2c82e5522
+TextureImporter:
+ fileIDToRecycleName: {}
+ externalObjects: {}
+ serializedVersion: 9
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 2
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant: