Unity中通过Editor编程扩展Transform的功能

在这次的项目中需要配置一些参数,在配置部分内容的时候需要复制和黏贴部分物体的世界坐标,但是有些物体是其他物体的子物体,无法直接的看到他们的世界坐标,所以我自己写了一个小工具用来实现这个功能,类似的扩展原理是一样的,抛砖引玉。

效果


直接上代码

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Reflection;
using System.Text;

/// <summary>
/// 扩展Transform,添加复制坐标和旋转的按钮
/// </summary>
[CustomEditor(typeof(Transform))]
public class MyTools : Editor {

    private Editor editor;
    private Transform transform;

    void OnEnable()
    {
        editor = CreateEditor(target, Assembly.GetAssembly(typeof(Editor)).GetType("UnityEditor.TransformInspector", true));
    }

    public override void OnInspectorGUI()
    {
        transform = target as Transform;
        editor.OnInspectorGUI();
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("复制坐标(world)")) {
            TextEditor textEd = new TextEditor();
            StringBuilder str = new StringBuilder();
            str.Append(transform.position.x + ",");
            str.Append(transform.position.y + ",");
            str.Append(transform.position.z);
            textEd.text = str.ToString();
            textEd.OnFocus();
            textEd.Copy();
        }
        if (GUILayout.Button("复制旋转(world)"))
        {
            TextEditor textEd = new TextEditor();
            StringBuilder str = new StringBuilder();
            str.Append(transform.rotation.eulerAngles.x + ",");
            str.Append(transform.rotation.eulerAngles.y + ",");
            str.Append(transform.rotation.eulerAngles.z);
            textEd.text = str.ToString();
            textEd.OnFocus();
            textEd.Copy();
        }
        if (GUILayout.Button("复制两者(world)"))
        {
            TextEditor textEd = new TextEditor();
            StringBuilder str = new StringBuilder();
            str.Append(transform.position.x + ",");
            str.Append(transform.position.y + ",");
            str.Append(transform.position.z + "|");
            str.Append(transform.rotation.eulerAngles.x + ",");
            str.Append(transform.rotation.eulerAngles.y + ",");
            str.Append(transform.rotation.eulerAngles.z);
            textEd.text = str.ToString();
            textEd.OnFocus();
            textEd.Copy();
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("黏贴坐标(world)"))
        {
            Vector3 vec = changeVec3Str(GUIUtility.systemCopyBuffer);
            if (vec.Equals(Vector3.zero))
                return;
            transform.position = vec;
        }
        if (GUILayout.Button("黏贴旋转(world)"))
        {
            Vector3 qua = changeVec3Str(GUIUtility.systemCopyBuffer);
            if (qua.Equals(Vector3.zero))
                return;
            transform.rotation = Quaternion.Euler(qua);
        }
        if (GUILayout.Button("黏贴两者(world)"))
        {
            string[] bothStr = GUIUtility.systemCopyBuffer.Split('|');
            if (bothStr.Length == 2) {
                string posStr = bothStr[0];
                Vector3 pos = changeVec3Str(posStr);
                if (!pos.Equals(Vector3.zero))
                {
                    transform.position = pos;
                }
                string quaStr = bothStr[1];
                Vector3 qua = changeVec3Str(quaStr);
                if (!qua.Equals(Vector3.zero))
                {
                    transform.rotation = Quaternion.Euler(qua);
                }
            }
        }
        EditorGUILayout.EndHorizontal();
    }

    //1,1,1
    Vector3 changeVec3Str(string str) {
        str = str.Replace("(", "");
        str = str.Replace(")", "");
        str = str.Replace(" ", "");
        string[] strs = str.Split(',');
        if (strs.Length != 3)
        {
            return Vector3.zero;
        }
        else {
            float x = float.Parse(strs[0].ToString());
            float y = float.Parse(strs[1].ToString());
            float z = float.Parse(strs[2].ToString());

            return new Vector3(x, y, z);
        }
    }

    1,1,1,1
    //Quaternion changeQuaStr(string str) {
    //    str = str.Replace("(", "");
    //    str = str.Replace(")", "");
    //    str = str.Replace(" ", "");
    //    string[] strs = str.Split(',');
    //    if (strs.Length < 4)
    //    {
    //        return Quaternion.identity;
    //    }
    //    else
    //    {
    //        float x = float.Parse(strs[0].ToString());
    //        float y = float.Parse(strs[1].ToString());
    //        float z = float.Parse(strs[2].ToString());
    //        float w = float.Parse(strs[3].ToString());

    //        return new Quaternion(x, y, z, w);
    //    }
    //}

}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Unity Editor扩展是指通过编写代码来扩展Unity编辑器的功能。通过创建自定义的编辑器窗口、工具栏按钮、菜单项和面板等,开发者可以为自己的项目添加一些定制化功能,以提高开发效率和用户体验。 Unity提供了一套API来实现编辑器扩展,开发者可以利用这些API去创建自定义的编辑器界面。首先,我们需要创建一个继承自EditorWindow或Editor类的脚本,然后在这个脚本实现我们想要的功能。比如,我们可以在自定义的编辑器窗口创建一些GUI元素,如按钮、文本框、下拉菜单等,用于控制场景的对象、调整参数或执行特定的操作。 另外,Unity还提供了一些常用的工具类,如SerializedObject、SerializedProperty等,以便开发者可以访问和修改Unity对象的属性。使用这些工具类,我们可以在编辑器扩展实现对象的序列化、反序列化和检查等功能。 在开发过程Unity的编辑器扩展还可以与自定义的脚本进行交互。通过注册自定义的菜单项、工具栏按钮或快捷键,我们可以在编辑器快速调用脚本的功能,并在自定义界面显示脚本的运行结果。 总结来说,Unity Editor扩展是一种强大的工具,它可以帮助开发者提高开发效率和用户体验。通过编写代码,我们可以创建出各种各样的自定义编辑器界面,以满足不同项目的需求。无论是增加交互性、优化工作流程还是增加特定的功能Unity的编辑器扩展都能提供灵活和强大的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值