Unity Editor 编辑器扩展 十五 提取NGUI 的Transform ResetPosition 功能

NGUI虽然不怎么在项目中应用了,但是里面这个ResetPosition功能还是非常好用的,可以拿出来在新项目中,实测可用

这里写图片描述

代码放进Editor文件夹里面就可以用了


using UnityEngine;
using UnityEditor;

[CustomEditor(typeof(Transform))]
public class TransformInspector : Editor
{
    /// <summary>
    /// Draw the inspector widget.
    /// </summary>

    public override void OnInspectorGUI ()
    {
        Transform trans = target as Transform;
        EditorGUIUtility.LookLikeControls(15f);

        Vector3 pos;
        Vector3 rot;
        Vector3 scale;

        // Position
        EditorGUILayout.BeginHorizontal();
        {
            if (DrawButton("P", "Reset Position", IsResetPositionValid(trans), 20f))
            {
                //NGUIEditorTools.RegisterUndo("Reset Position", trans);
                trans.localPosition = Vector3.zero;
            }
            pos = DrawVector3(trans.localPosition);
        }
        EditorGUILayout.EndHorizontal();

        // Rotation
        EditorGUILayout.BeginHorizontal();
        {
            if (DrawButton("R", "Reset Rotation", IsResetRotationValid(trans), 20f))
            {
                //NGUIEditorTools.RegisterUndo("Reset Rotation", trans);
                trans.localEulerAngles = Vector3.zero;
            }
            rot = DrawVector3(trans.localEulerAngles);
        }
        EditorGUILayout.EndHorizontal();

        // Scale
        EditorGUILayout.BeginHorizontal();
        {
            if (DrawButton("S", "Reset Scale", IsResetScaleValid(trans), 20f))
            {
                //NGUIEditorTools.RegisterUndo("Reset Scale", trans);
                trans.localScale = Vector3.one;
            }
            scale = DrawVector3(trans.localScale);
        }
        EditorGUILayout.EndHorizontal();

        // If something changes, set the transform values
        if (GUI.changed)
        {
            //NGUIEditorTools.RegisterUndo("Transform Change", trans);
            trans.localPosition     = Validate(pos);
            trans.localEulerAngles  = Validate(rot);
            trans.localScale        = Validate(scale);
        }
    }

    /// <summary>
    /// Helper function that draws a button in an enabled or disabled state.
    /// </summary>

    static bool DrawButton (string title, string tooltip, bool enabled, float width)
    {
        if (enabled)
        {
            // Draw a regular button
            return GUILayout.Button(new GUIContent(title, tooltip), GUILayout.Width(width));
        }
        else
        {
            // Button should be disabled -- draw it darkened and ignore its return value
            Color color = GUI.color;
            GUI.color = new Color(1f, 1f, 1f, 0.25f);
            GUILayout.Button(new GUIContent(title, tooltip), GUILayout.Width(width));
            GUI.color = color;
            return false;
        }
    }

    /// <summary>
    /// Helper function that draws a field of 3 floats.
    /// </summary>

    static Vector3 DrawVector3 (Vector3 value)
    {
        GUILayoutOption opt = GUILayout.MinWidth(30f);
        value.x = EditorGUILayout.FloatField("X", value.x, opt);
        value.y = EditorGUILayout.FloatField("Y", value.y, opt);
        value.z = EditorGUILayout.FloatField("Z", value.z, opt);
        return value;
    }

    /// <summary>
    /// Helper function that determines whether its worth it to show the reset position button.
    /// </summary>

    static bool IsResetPositionValid (Transform targetTransform)
    {
        Vector3 v = targetTransform.localPosition;
        return (v.x != 0f || v.y != 0f || v.z != 0f);
    }

    /// <summary>
    /// Helper function that determines whether its worth it to show the reset rotation button.
    /// </summary>

    static bool IsResetRotationValid (Transform targetTransform)
    {
        Vector3 v = targetTransform.localEulerAngles;
        return (v.x != 0f || v.y != 0f || v.z != 0f);
    }

    /// <summary>
    /// Helper function that determines whether its worth it to show the reset scale button.
    /// </summary>

    static bool IsResetScaleValid (Transform targetTransform)
    {
        Vector3 v = targetTransform.localScale;
        return (v.x != 1f || v.y != 1f || v.z != 1f);
    }

    /// <summary>
    /// Helper function that removes not-a-number values from the vector.
    /// </summary>

    static Vector3 Validate (Vector3 vector)
    {
        vector.x = float.IsNaN(vector.x) ? 0f : vector.x;
        vector.y = float.IsNaN(vector.y) ? 0f : vector.y;
        vector.z = float.IsNaN(vector.z) ? 0f : vector.z;
        return vector;
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值