Advertisement
zORg_alex
Nov 12th, 2024 (edited)
5
0
Never
This is comment for paste SceneView PropertyDrawer Editor
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using RectEx;
  2. using System;
  3. using System.Collections.Generic;
  4. using Unity.Mathematics;
  5.  
  6. #if UNITY_EDITOR
  7. using UnityEditor;
  8. using UnityEditorInternal;
  9.  
  10. #endif
  11. using UnityEngine;
  12.  
  13. namespace Pickuppable
  14. {
  15.     /// <summary>
  16.     /// Example of using SceneViewDrawerExtensions
  17.     /// Packages/manifest.json:
  18.     /// {
  19.     ///   "dependencies": {
  20.     ///    "st.rect-ex": "https://github.com/slavniyteo/rect-ex.git#master"
  21.     /// }
  22.     /// Installed Git
  23.     /// </summary>
  24.     public class PickuppableAnimationInterface : MonoBehaviour
  25.     {
  26.         [SerializeField]
  27.         List<AnchorPoint> _anchorPoints;
  28.  
  29.         [Serializable]
  30.         public class AnchorPoint
  31.         {
  32.             public Vector3 localPosition;
  33.             public Quaternion localRotation = quaternion.identity;
  34.  
  35.             public Quaternion GetWorldRotation(Transform transform) => transform.rotation * localRotation;
  36.             public void SetWorldRotation(Quaternion rotation, Transform parent)
  37.             {
  38.                 localRotation = rotation * Quaternion.Inverse(parent.rotation);
  39.             }
  40.  
  41. #if UNITY_EDITOR
  42.             [CustomPropertyDrawer(typeof(AnchorPoint))]
  43.             public class AnchorPointInspector : PropertyDrawer
  44.             {
  45.                 private static float[] _weightsWithLabel = new float[] { 0, .15f, 1, .15f, 1, 0 };
  46.                 private static float[] _widthesWithLabel = new float[] { EditorGUIUtility.labelWidth, 0, 0, 0, 0, 80 };
  47.                 private static float[] _weightsWithNoLabel = new float[] { .15f, 1, .15f, 1, 0 };
  48.                 private static float[] _widthesWithNoLabel = new float[] { 0, 0, 0, 0, 80 };
  49.  
  50.                 public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
  51.                 {
  52.  
  53.                     bool hideLabel = label.text.Length == 0;
  54.                     var rects = position.Row(weights: hideLabel ? _weightsWithNoLabel : _weightsWithLabel, widthes: hideLabel ? _widthesWithNoLabel : _widthesWithLabel);
  55.                     int i = 0;
  56.  
  57.                     if(!hideLabel)
  58.                         EditorGUI.LabelField(rects[i++], label);
  59.                     EditorGUI.BeginChangeCheck();
  60.  
  61.                     EditorGUI.LabelField(rects[i++], new GUIContent("pos"));
  62.                     EditorGUI.PropertyField(rects[i++], property.FindPropertyRelative(nameof(localPosition)), GUIContent.none);
  63.                     EditorGUI.LabelField(rects[i++], new GUIContent("rot"));
  64.                     EditorGUI.PropertyField(rects[i++], property.FindPropertyRelative(nameof(localRotation)), GUIContent.none);
  65.  
  66.                     if (EditorGUI.EndChangeCheck())
  67.                         property.serializedObject.ApplyModifiedProperties();
  68.  
  69.                     AnchorPointContext.TrySubscribing(property, out var ctx);
  70.                     ctx.GUIDrawEditButton(rects[i++]);
  71.                 }
  72.  
  73.                 private class AnchorPointContext : SceneViewDrawerExtensions.Context<AnchorPoint, AnchorPointContext>
  74.                 {
  75.                     private AnchorPoint _point => _field;
  76.                     private Transform _transform;
  77.                     protected override void OnSceneGUI(SceneView view)
  78.                     {
  79.                         if (!InternalEditorUtility.GetIsInspectorExpanded(_object))
  80.                             return;
  81.                         if (!_transform) _transform = ((MonoBehaviour)_object).transform;
  82.  
  83.                         Vector3 pos = _transform.TransformPoint(_point.localPosition);
  84.                         Quaternion rot = _point.GetWorldRotation(_transform);
  85.                         DrawEmpty(pos, rot);
  86.                         if (IsEditing && Tools.current == Tool.Move)
  87.                         {
  88.                             var newPos = Handles.PositionHandle(pos, rot);
  89.                             Vector3 newLocalPos = _transform.InverseTransformPoint(newPos);
  90.                             if (_point.localPosition == newLocalPos) return;
  91.                             Undo.RecordObject(_object, "HandPose MoveTool");
  92.                             _point.localPosition = newLocalPos;
  93.                         }
  94.                         else if (IsEditing && Tools.current == Tool.Rotate)
  95.                         {
  96.                             var newRot = Handles.RotationHandle(rot, pos);
  97.                             var newLocalRot = newRot * Quaternion.Inverse(_transform.rotation);
  98.                             if (_point.localRotation == newLocalRot) return;
  99.                             Undo.RecordObject(_object, "HandPose MoveTool");
  100.                             _point.localRotation = newLocalRot;
  101.                         }
  102.                     }
  103.  
  104.                     private void DrawEmpty(Vector3 pos, Quaternion rot)
  105.                     {
  106.                         Handles.color = Color.red;
  107.                         Handles.DrawAAPolyLine(pos, pos + rot * Vector3.right);
  108.                         Handles.color = Color.green;
  109.                         Handles.DrawAAPolyLine(pos, pos + rot * Vector3.up);
  110.                         Handles.color = Color.blue;
  111.                         Handles.DrawAAPolyLine(pos, pos + rot * Vector3.forward);
  112.                     }
  113.                 }
  114.             }
  115. #endif
  116.         }
  117.     }
  118. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement