301 lines
10 KiB
C#
301 lines
10 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.IO;
|
|
|
|
namespace PuppetFace
|
|
{
|
|
[CustomEditor(typeof(EyeMotion))]
|
|
public class EyeMotionEditor : Editor
|
|
{
|
|
// Start is called before the first frame update
|
|
public EyeMotion em;
|
|
public bool LookAround = false;
|
|
public bool UpDown = false;
|
|
public bool Blink = false;
|
|
private static string _puppetFacePath;
|
|
|
|
void OnEnable()
|
|
{
|
|
em = (EyeMotion)target;
|
|
_puppetFacePath = "Assets" + RecursivelyFindFolderPath().Substring(Application.dataPath.Length);
|
|
|
|
}
|
|
public string[] GetArrayBlendShapes(SkinnedMeshRenderer skin)
|
|
{
|
|
Mesh m = skin.sharedMesh;
|
|
|
|
string[] arr;
|
|
arr = new string[m.blendShapeCount + 1];
|
|
|
|
for (int i = 0; i < m.blendShapeCount; i++)
|
|
{
|
|
arr[i] = m.GetBlendShapeName(i);
|
|
}
|
|
arr[m.blendShapeCount] = "Not Set";
|
|
return arr;
|
|
}
|
|
// Update is called once per frame
|
|
public override void OnInspectorGUI()
|
|
{
|
|
|
|
if (em.LookAtTarget == null)
|
|
{
|
|
GUILayout.Space(10);
|
|
string LogoPath = _puppetFacePath +"/Textures/GUI/PuppetFaceLogo.png";
|
|
Texture LogoAsset = AssetDatabase.LoadAssetAtPath(LogoPath, typeof(Texture)) as Texture;
|
|
GUILayout.BeginHorizontal();
|
|
|
|
GUILayout.BeginVertical();
|
|
|
|
em.Head = (Transform)EditorGUILayout.ObjectField("Head", em.Head, typeof(Transform), true);
|
|
em.LookAtTarget = (Transform)EditorGUILayout.ObjectField("LookAt Target", em.LookAtTarget, typeof(Transform), true);
|
|
|
|
GUILayout.EndVertical();
|
|
|
|
GUILayout.Label(LogoAsset, GUILayout.Width(40), GUILayout.Height(40));
|
|
GUILayout.EndHorizontal();
|
|
|
|
|
|
|
|
|
|
|
|
if (GUILayout.Button("CREATE LOOKAT TARGET", GUILayout.Width(100), GUILayout.Height(25), GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(true)))
|
|
{
|
|
GameObject lookatTarget =new GameObject();
|
|
lookatTarget.AddComponent<LookAtControl>();
|
|
lookatTarget.name = "Look At Target";
|
|
em.LookAtTarget = lookatTarget.transform;
|
|
if(em.Head!=null)
|
|
lookatTarget.transform.position = em.Head.position + Vector3.forward * em.Head.position.y*10f;
|
|
Selection.activeGameObject = lookatTarget;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//DrawDefaultInspector();
|
|
|
|
GUILayout.Space(10);
|
|
string LogoPath = _puppetFacePath +"/Textures/GUI/PuppetFaceLogo.png";
|
|
Texture LogoAsset = AssetDatabase.LoadAssetAtPath(LogoPath, typeof(Texture)) as Texture;
|
|
GUILayout.BeginHorizontal();
|
|
|
|
GUILayout.BeginVertical();
|
|
|
|
em.FaceSkin = (SkinnedMeshRenderer)EditorGUILayout.ObjectField("FaceSkin", em.FaceSkin, typeof(SkinnedMeshRenderer), true);
|
|
em.LookAround = EditorGUILayout.Toggle("Look Around", em.LookAround);
|
|
|
|
GUILayout.EndVertical();
|
|
|
|
GUILayout.Label(LogoAsset, GUILayout.Width(40), GUILayout.Height(40));
|
|
GUILayout.EndHorizontal();
|
|
|
|
|
|
|
|
if (em.LookAround)
|
|
{
|
|
GUILayout.BeginVertical(EditorStyles.helpBox);
|
|
LookAround = EditorGUILayout.Foldout(LookAround, "Look Around");
|
|
if (LookAround)
|
|
{
|
|
EditorGUI.BeginChangeCheck();
|
|
em.EyeL = (Transform)EditorGUILayout.ObjectField("EyeL", em.EyeL, typeof(Transform), true);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
if (em.EyeL != null)
|
|
{
|
|
Quaternion r1 = em.EyeL.rotation;
|
|
em.EyeL.LookAt(em.LookAtTarget);
|
|
Quaternion r2 = em.EyeL.rotation;
|
|
em.EyeLDefault = r1 * Quaternion.Inverse(r2);
|
|
em.EyeL.rotation = r1;
|
|
|
|
}
|
|
}
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
em.EyeR = (Transform)EditorGUILayout.ObjectField("EyeR", em.EyeR, typeof(Transform), true);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
if (em.EyeR != null)
|
|
{
|
|
Quaternion r1 = em.EyeR.rotation;
|
|
em.EyeR.LookAt(em.LookAtTarget);
|
|
Quaternion r2 = em.EyeR.rotation;
|
|
em.EyeRDefault = r1 * Quaternion.Inverse(r2);
|
|
em.EyeR.rotation = r1;
|
|
|
|
}
|
|
}
|
|
|
|
em.Head = (Transform)EditorGUILayout.ObjectField("Head", em.Head, typeof(Transform), true);
|
|
em.LookAtTarget = (Transform)EditorGUILayout.ObjectField("LookAt Target", em.LookAtTarget, typeof(Transform), true);
|
|
|
|
em.LookAroundScale = EditorGUILayout.Vector2Field("LookAroundScale", em.LookAroundScale);
|
|
em.LookRandomAmount = EditorGUILayout.FloatField("LookRandomAmount", em.LookRandomAmount);
|
|
em.LookAroundSpeed = EditorGUILayout.FloatField("LookAroundSpeed", em.LookAroundSpeed);
|
|
}
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
|
|
em.Blink = EditorGUILayout.Toggle("Blink", em.Blink);
|
|
|
|
if (em.Blink && em.FaceSkin != null)
|
|
{
|
|
GUILayout.BeginVertical(EditorStyles.helpBox);
|
|
|
|
Blink = EditorGUILayout.Foldout(Blink, "Blink");
|
|
if (Blink)
|
|
{
|
|
em.BlinkRandomAmount = EditorGUILayout.FloatField("BlinkRandomAmount", em.BlinkRandomAmount);
|
|
em.BlinkSpeed = EditorGUILayout.FloatField("BlinkSpeed", em.BlinkSpeed);
|
|
em.BlinkIndex = EditorGUILayout.Popup("Eyes Blink Blend Shape", em.BlinkIndex, GetArrayBlendShapes(em.FaceSkin));
|
|
|
|
em.EyeLidBones = EditorGUILayout.Foldout(em.EyeLidBones, "Eye Lid Bones");
|
|
|
|
if (em.EyeLidBones)
|
|
{
|
|
if (GUILayout.Button("Set Closed Pose", GUILayout.Width(100), GUILayout.Height(15), GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(true)))
|
|
{
|
|
em.EyeLidTopLClosed = em.EyeLidTopL.localRotation;
|
|
em.EyeLidTopRClosed = em.EyeLidTopR.localRotation;
|
|
em.EyeLidBottomLClosed = em.EyeLidBottomL.localRotation;
|
|
em.EyeLidBottomRClosed = em.EyeLidBottomR.localRotation;
|
|
em.EyeLidTopL.localRotation = em.EyeLidTopLDefault;
|
|
em.EyeLidTopR.localRotation = em.EyeLidTopRDefault;
|
|
em.EyeLidBottomL.localRotation = em.EyeLidBottomLDefault;
|
|
em.EyeLidBottomR.localRotation = em.EyeLidBottomRDefault;
|
|
|
|
}
|
|
EditorGUI.BeginChangeCheck();
|
|
em.EyeLidTopL = (Transform)EditorGUILayout.ObjectField("Eye Lid Top L", em.EyeLidTopL, typeof(Transform), true);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
if (em.EyeLidTopL != null)
|
|
{
|
|
em.EyeLidTopLDefault = em.EyeLidTopL.localRotation;
|
|
em.EyeLidTopLClosed = em.EyeLidTopL.localRotation;
|
|
em.EyeLidTopLUp = em.EyeLidTopL.localRotation;
|
|
em.EyeLidTopLDown = em.EyeLidTopL.localRotation;
|
|
}
|
|
}
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
em.EyeLidTopR = (Transform)EditorGUILayout.ObjectField("Eye Lid Top R", em.EyeLidTopR, typeof(Transform), true);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
if (em.EyeLidTopR != null)
|
|
{
|
|
em.EyeLidTopRDefault = em.EyeLidTopR.localRotation;
|
|
em.EyeLidTopRClosed = em.EyeLidTopR.localRotation;
|
|
em.EyeLidTopRUp = em.EyeLidTopR.localRotation;
|
|
em.EyeLidTopRDown = em.EyeLidTopR.localRotation;
|
|
}
|
|
}
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
em.EyeLidBottomL = (Transform)EditorGUILayout.ObjectField("Eye Lid Bottom L", em.EyeLidBottomL, typeof(Transform), true);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
if (em.EyeLidBottomL != null)
|
|
{
|
|
em.EyeLidBottomLDefault = em.EyeLidBottomL.localRotation;
|
|
em.EyeLidBottomLClosed = em.EyeLidBottomL.localRotation;
|
|
em.EyeLidBottomLUp = em.EyeLidBottomL.localRotation;
|
|
em.EyeLidBottomLDown = em.EyeLidBottomL.localRotation;
|
|
}
|
|
}
|
|
|
|
EditorGUI.BeginChangeCheck();
|
|
em.EyeLidBottomR = (Transform)EditorGUILayout.ObjectField("Eye Lid Bottom R", em.EyeLidBottomR, typeof(Transform), true);
|
|
if (EditorGUI.EndChangeCheck())
|
|
{
|
|
if (em.EyeLidBottomR != null)
|
|
{
|
|
em.EyeLidBottomRDefault = em.EyeLidBottomR.localRotation;
|
|
em.EyeLidBottomRClosed = em.EyeLidBottomR.localRotation;
|
|
em.EyeLidBottomRUp = em.EyeLidBottomR.localRotation;
|
|
em.EyeLidBottomRDown = em.EyeLidBottomR.localRotation;
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
|
|
|
|
em.UpDown = EditorGUILayout.Toggle("Up Down", em.UpDown);
|
|
|
|
if (em.UpDown && em.FaceSkin != null)
|
|
{
|
|
GUILayout.BeginVertical(EditorStyles.helpBox);
|
|
|
|
UpDown = EditorGUILayout.Foldout(UpDown, "Up Down");
|
|
if (UpDown)
|
|
{
|
|
em.EyesUpIndex = EditorGUILayout.Popup("Eyes Up Blend Shape", em.EyesUpIndex, GetArrayBlendShapes(em.FaceSkin));
|
|
em.EyesDownIndex = EditorGUILayout.Popup("Eyes Down Blend Shape", em.EyesDownIndex, GetArrayBlendShapes(em.FaceSkin));
|
|
em.EyeLidBonesUpDown = EditorGUILayout.Foldout(em.EyeLidBonesUpDown, "Eye Lid Bones");
|
|
|
|
if (em.EyeLidBonesUpDown)
|
|
{
|
|
if (GUILayout.Button("Set Up Pose", GUILayout.Width(100), GUILayout.Height(15), GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(true)))
|
|
{
|
|
em.EyeLidTopLUp = em.EyeLidTopL.localRotation;
|
|
em.EyeLidTopRUp = em.EyeLidTopR.localRotation;
|
|
em.EyeLidBottomLUp = em.EyeLidBottomL.localRotation;
|
|
em.EyeLidBottomRUp = em.EyeLidBottomR.localRotation;
|
|
em.EyeLidTopL.localRotation = em.EyeLidTopLDefault;
|
|
em.EyeLidTopR.localRotation = em.EyeLidTopRDefault;
|
|
em.EyeLidBottomL.localRotation = em.EyeLidBottomLDefault;
|
|
em.EyeLidBottomR.localRotation = em.EyeLidBottomRDefault;
|
|
|
|
}
|
|
if (GUILayout.Button("Set Down Pose", GUILayout.Width(100), GUILayout.Height(15), GUILayout.ExpandHeight(false), GUILayout.ExpandWidth(true)))
|
|
{
|
|
em.EyeLidTopLDown = em.EyeLidTopL.localRotation;
|
|
em.EyeLidTopRDown = em.EyeLidTopR.localRotation;
|
|
em.EyeLidBottomLDown = em.EyeLidBottomL.localRotation;
|
|
em.EyeLidBottomRDown = em.EyeLidBottomR.localRotation;
|
|
em.EyeLidTopL.localRotation = em.EyeLidTopLDefault;
|
|
em.EyeLidTopR.localRotation = em.EyeLidTopRDefault;
|
|
em.EyeLidBottomL.localRotation = em.EyeLidBottomLDefault;
|
|
em.EyeLidBottomR.localRotation = em.EyeLidBottomRDefault;
|
|
|
|
}
|
|
|
|
}
|
|
em.LookDirection = EditorGUILayout.Vector3Field("Look Up Vector", em.LookDirection);
|
|
em.LookUpDownAmount = EditorGUILayout.FloatField("Look Up Down Amount", em.LookUpDownAmount);
|
|
em.LookUpDownOffset = EditorGUILayout.FloatField("Look Up Down Offset", em.LookUpDownOffset);
|
|
|
|
}
|
|
|
|
|
|
GUILayout.EndVertical();
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|
|
private static string RecursivelyFindFolderPath()
|
|
{
|
|
DirectoryInfo directoryInfo = new DirectoryInfo(Application.dataPath);
|
|
DirectoryInfo[] dirInfos = directoryInfo.GetDirectories("*", SearchOption.AllDirectories);
|
|
foreach (DirectoryInfo d in dirInfos)
|
|
{
|
|
if (d.Name == "PuppetFace" && d.Parent.Name != "Gizmos")
|
|
return d.FullName;
|
|
}
|
|
return "";
|
|
}
|
|
}
|
|
}
|