68 lines
2.5 KiB
C#
68 lines
2.5 KiB
C#
|
|
using System.Collections;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using UnityEditor;
|
|||
|
|
namespace Invector.IK
|
|||
|
|
{
|
|||
|
|
[CustomPropertyDrawer(typeof(IKOffsetSpine), true)]
|
|||
|
|
public class IKOffsetSpineDrawer : PropertyDrawer
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
public static IKOffsetSpineCopy ikOffsetCopy;
|
|||
|
|
|
|||
|
|
public class IKOffsetSpineCopy
|
|||
|
|
{
|
|||
|
|
public string name;
|
|||
|
|
public IKOffsetSpine offsetSpine;
|
|||
|
|
|
|||
|
|
public IKOffsetSpineCopy(string name, IKOffsetSpine offsetSpine)
|
|||
|
|
{
|
|||
|
|
this.name = name;
|
|||
|
|
this.offsetSpine = offsetSpine;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
|
|||
|
|
{
|
|||
|
|
return property.isExpanded ? EditorGUI.GetPropertyHeight(property, label, true) : EditorGUIUtility.singleLineHeight;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
|
|||
|
|
{
|
|||
|
|
Event e = Event.current;
|
|||
|
|
EditorGUI.PropertyField(position, property, true);
|
|||
|
|
if (e.type == EventType.MouseDown && e.button == 1)
|
|||
|
|
{
|
|||
|
|
if (position.Contains(e.mousePosition))
|
|||
|
|
{
|
|||
|
|
GenericMenu menu = new GenericMenu();
|
|||
|
|
menu.AddItem(new GUIContent("Copy " + property.name), false, () => { Copy(property); });
|
|||
|
|
if (ikOffsetCopy != null && property.name == ikOffsetCopy.name)
|
|||
|
|
{
|
|||
|
|
menu.AddItem(new GUIContent("Past " + property.name), false, () => { Past(property); });
|
|||
|
|
}
|
|||
|
|
else menu.AddDisabledItem(new GUIContent("Past " + property.name));
|
|||
|
|
menu.ShowAsContext();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Copy(SerializedProperty property)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
IKOffsetSpine ikOffset = new IKOffsetSpine();
|
|||
|
|
ikOffset.spine = property.FindPropertyRelative("spine").vector2Value;
|
|||
|
|
ikOffset.head = property.FindPropertyRelative("head").vector2Value;
|
|||
|
|
ikOffsetCopy = new IKOffsetSpineCopy(property.name, ikOffset);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Past(SerializedProperty property)
|
|||
|
|
{
|
|||
|
|
property.FindPropertyRelative("spine").vector2Value = ikOffsetCopy.offsetSpine.spine;
|
|||
|
|
property.FindPropertyRelative("head").vector2Value = ikOffsetCopy.offsetSpine.head;
|
|||
|
|
property.serializedObject.ApplyModifiedProperties();
|
|||
|
|
property.serializedObject.Update();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|