国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】

這篇具有很好參考價(jià)值的文章主要介紹了【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

推薦閱讀

  • CSDN主頁(yè)
  • GitHub開源地址
  • Unity3D插件分享
  • 簡(jiǎn)書地址
  • 我的個(gè)人博客

大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。

一、前言

在開發(fā)中,常常會(huì)遇到頻繁復(fù)制粘貼物體的坐標(biāo)、旋轉(zhuǎn)、縮放的操作。

使用Unity自帶的組件復(fù)制粘貼比較麻煩:
復(fù)制:
【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】,# Unity3D之編輯器擴(kuò)展,編輯器,c#,開發(fā)語(yǔ)言,游戲引擎,unity
粘貼:
【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】,# Unity3D之編輯器擴(kuò)展,編輯器,c#,開發(fā)語(yǔ)言,游戲引擎,unity
還有一些需要復(fù)制位置、旋轉(zhuǎn)、縮放的值到到代碼中,如果一個(gè)一個(gè)復(fù)制粘貼非常麻煩,還要一些需要復(fù)制添加自定義文本,也很不方便。

所以,就開發(fā)了一個(gè)小工具,來(lái)提升開發(fā)效率。

二、正文

2-1、實(shí)現(xiàn)快速?gòu)?fù)制/粘貼,位置/旋轉(zhuǎn)/縮放功能

效果圖:
【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】,# Unity3D之編輯器擴(kuò)展,編輯器,c#,開發(fā)語(yǔ)言,游戲引擎,unity
在Editor文件夾中新建腳本,隨便命名,然后編輯代碼:

using UnityEngine;
using UnityEditor;
using System.Text;
using static UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle;
using static UnityEngine.UI.Image;

[CanEditMultipleObjects]
[CustomEditor(typeof(Transform), true)]
public class TransformEditor : Editor
{
    static public TransformEditor instance;

    //當(dāng)前的本地坐標(biāo)
    SerializedProperty mPos;
    //當(dāng)前的本地旋轉(zhuǎn)
    SerializedProperty mRot;
    //當(dāng)前的本地縮放
    SerializedProperty mScale;

    void OnEnable()
    {
        instance = this;

        if (this)
        {
            try
            {
                var so = serializedObject;
                mPos = so.FindProperty("m_LocalPosition");
                mRot = so.FindProperty("m_LocalRotation");
                mScale = so.FindProperty("m_LocalScale");
            }
            catch { }
        }
    }

    void OnDestroy() { instance = null; }

    /// <summary>
    /// Draw the inspector widget.繪制inspector小部件。
    /// </summary>
    public override void OnInspectorGUI()
    {
        //設(shè)置label的寬度
        EditorGUIUtility.labelWidth = 15f;

        serializedObject.Update();

        DrawPosition();
        DrawRotation();
        DrawScale();
        DrawCopyAndPaste();

        serializedObject.ApplyModifiedProperties();
    }


    void DrawCopyAndPaste()
    {
        GUILayout.BeginHorizontal();
        bool reset = GUILayout.Button("Copy");
        bool reset2 = GUILayout.Button("Paste");
        GUILayout.EndHorizontal();

        if (reset)
        {
            //把數(shù)值打印出來(lái)
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            //Debug.Log(select.name+"("+ mPos.vector3Value.x.ToString()+ ","+ mPos.vector3Value.y.ToString() + ","+ mPos.vector3Value.z.ToString() + ")");
            //Debug.Log(select.name + mRot.quaternionValue);
            //Debug.Log(select.name + "(" + mScale.vector3Value.x.ToString() + "," + mScale.vector3Value.y.ToString() + "," + mScale.vector3Value.z.ToString() + ")");

            StringBuilder s = new StringBuilder();
            s.Append("TransformInspector_" + "(" + mPos.vector3Value.x.ToString() + "," + mPos.vector3Value.y.ToString() + "," + mPos.vector3Value.z.ToString() + ")" + "_");
            s.Append(mRot.quaternionValue + "_");
            s.Append("(" + mScale.vector3Value.x.ToString() + "," + mScale.vector3Value.y.ToString() + "," + mScale.vector3Value.z.ToString() + ")");
            //添加到剪貼板
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
        }
        if (reset2)
        {
            //把數(shù)值打印出來(lái)
            //Debug.Log(UnityEngine.GUIUtility.systemCopyBuffer);
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            string[] sArr = s.Split('_');
            if (sArr[0] != "TransformInspector")
            {
                Debug.LogError("未復(fù)制Transform組件內(nèi)容!Transform component content not copied!");
                return;
            }
            //Debug.Log("Pos:" + sArr[1]);
            //Debug.Log("Rot:" + sArr[2]);
            //Debug.Log("Scale:" + sArr[3]);
            try
            {
                mPos.vector3Value = ParseV3(sArr[1]);
                mRot.quaternionValue = new Quaternion() { x = ParseV4(sArr[2]).x, y = ParseV4(sArr[2]).y, z = ParseV4(sArr[2]).z, w = ParseV4(sArr[2]).w };
                mScale.vector3Value = ParseV3(sArr[3]);
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }

        }
    }
    /// <summary>
    /// String To Vector3
    /// </summary>
    /// <param name="strVector3"></param>
    /// <returns></returns>
    Vector3 ParseV3(string strVector3)
    {
        strVector3 = strVector3.Replace("(", "").Replace(")", "");
        string[] s = strVector3.Split(',');
        return new Vector3(float.Parse(s[0]), float.Parse(s[1]), float.Parse(s[2]));
    }
    /// <summary>
    /// String To Vector4
    /// </summary>
    /// <param name="strVector4"></param>
    /// <returns></returns>
    Vector4 ParseV4(string strVector4)
    {
        strVector4 = strVector4.Replace("(", "").Replace(")", "");
        string[] s = strVector4.Split(',');
        return new Vector4(float.Parse(s[0]), float.Parse(s[1]), float.Parse(s[2]), float.Parse(s[3]));
    }
    #region Position 位置
    void DrawPosition()
    {
        GUILayout.BeginHorizontal();
        EditorGUILayout.PropertyField(mPos.FindPropertyRelative("x"));
        EditorGUILayout.PropertyField(mPos.FindPropertyRelative("y"));
        EditorGUILayout.PropertyField(mPos.FindPropertyRelative("z"));
        bool reset = GUILayout.Button("P", GUILayout.Width(20f));

        GUILayout.EndHorizontal();

        if (reset) mPos.vector3Value = Vector3.zero;
    }
    #endregion
    #region Scale 縮放
    void DrawScale()
    {
        GUILayout.BeginHorizontal();
        {
            EditorGUILayout.PropertyField(mScale.FindPropertyRelative("x"));
            EditorGUILayout.PropertyField(mScale.FindPropertyRelative("y"));
            EditorGUILayout.PropertyField(mScale.FindPropertyRelative("z"));
            bool reset = GUILayout.Button("S", GUILayout.Width(20f));
            if (reset) mScale.vector3Value = Vector3.one;
        }
        GUILayout.EndHorizontal();
    }
    #endregion
    #region Rotation is ugly as hell... since there is no native support for quaternion property drawing 旋轉(zhuǎn)是丑陋的地獄。。。因?yàn)樗脑獢?shù)屬性繪圖沒(méi)有本地支持
    enum Axes : int
    {
        None = 0,
        X = 1,
        Y = 2,
        Z = 4,
        All = 7,
    }

    Axes CheckDifference(Transform t, Vector3 original)
    {
        Vector3 next = t.localEulerAngles;

        Axes axes = Axes.None;

        if (Differs(next.x, original.x)) axes |= Axes.X;
        if (Differs(next.y, original.y)) axes |= Axes.Y;
        if (Differs(next.z, original.z)) axes |= Axes.Z;
        return axes;
    }

    Axes CheckDifference(SerializedProperty property)
    {
        Axes axes = Axes.None;

        if (property.hasMultipleDifferentValues)
        {
            Vector3 original = property.quaternionValue.eulerAngles;

            foreach (Object obj in serializedObject.targetObjects)
            {
                axes |= CheckDifference(obj as Transform, original);
                if (axes == Axes.All) break;
            }
        }
        return axes;
    }

    /// <summary>
    /// Draw an editable float field. 繪制可編輯的浮動(dòng)字段。
    /// </summary>
    /// <param name="hidden">Whether to replace the value with a dash 是否將值替換為破折號(hào)</param>
    /// <param name="greyedOut">Whether the value should be greyed out or not 值是否應(yīng)灰顯</param>
    static bool FloatField(string name, ref float value, bool hidden, GUILayoutOption opt)
    {
        float newValue = value;
        GUI.changed = false;

        if (!hidden)
        {
            newValue = EditorGUILayout.FloatField(name, newValue, opt);
        }
        else
        {
            float.TryParse(EditorGUILayout.TextField(name, "--", opt), out newValue);
        }

        if (GUI.changed && Differs(newValue, value))
        {
            value = newValue;
            return true;
        }
        return false;
    }

    /// <summary>
    /// Because Mathf.Approximately is too sensitive.因?yàn)閿?shù)學(xué)近似值太敏感了。
    /// </summary>
    static bool Differs(float a, float b) { return Mathf.Abs(a - b) > 0.0001f; }

    /// <summary>
    /// 注冊(cè)Undo
    /// </summary>
    /// <param name="name"></param>
    /// <param name="objects"></param>
    static public void RegisterUndo(string name, params Object[] objects)
    {
        if (objects != null && objects.Length > 0)
        {
            UnityEditor.Undo.RecordObjects(objects, name);

            foreach (Object obj in objects)
            {
                if (obj == null) continue;
                EditorUtility.SetDirty(obj);
            }
        }
    }

    /// <summary>
    /// 角度處理
    /// </summary>
    /// <param name="angle"></param>
    /// <returns></returns>
    static public float WrapAngle(float angle)
    {
        while (angle > 180f) angle -= 360f;
        while (angle < -180f) angle += 360f;
        return angle;
    }

    void DrawRotation()
    {
        GUILayout.BeginHorizontal();
        {
            Vector3 visible = (serializedObject.targetObject as Transform).localEulerAngles;

            visible.x = WrapAngle(visible.x);
            visible.y = WrapAngle(visible.y);
            visible.z = WrapAngle(visible.z);

            Axes changed = CheckDifference(mRot);
            Axes altered = Axes.None;

            GUILayoutOption opt = GUILayout.MinWidth(30f);

            if (FloatField("X", ref visible.x, (changed & Axes.X) != 0, opt)) altered |= Axes.X;
            if (FloatField("Y", ref visible.y, (changed & Axes.Y) != 0, opt)) altered |= Axes.Y;
            if (FloatField("Z", ref visible.z, (changed & Axes.Z) != 0, opt)) altered |= Axes.Z;
            bool reset = GUILayout.Button("R", GUILayout.Width(20f));

            if (reset)
            {
                mRot.quaternionValue = Quaternion.identity;
            }
            else if (altered != Axes.None)
            {
                RegisterUndo("Change Rotation", serializedObject.targetObjects);

                foreach (Object obj in serializedObject.targetObjects)
                {
                    Transform t = obj as Transform;
                    Vector3 v = t.localEulerAngles;

                    if ((altered & Axes.X) != 0) v.x = visible.x;
                    if ((altered & Axes.Y) != 0) v.y = visible.y;
                    if ((altered & Axes.Z) != 0) v.z = visible.z;

                    t.localEulerAngles = v;
                }
            }
        }
        GUILayout.EndHorizontal();
    }
    #endregion
}

運(yùn)行結(jié)果:
【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】,# Unity3D之編輯器擴(kuò)展,編輯器,c#,開發(fā)語(yǔ)言,游戲引擎,unity
這樣就實(shí)現(xiàn)了基本的快速?gòu)?fù)制/粘貼,位置/旋轉(zhuǎn)/縮放功能。

接下來(lái),就實(shí)現(xiàn)單獨(dú)的位置、旋轉(zhuǎn)、縮放的復(fù)制和粘貼吧。

2-2、單獨(dú)的位置、旋轉(zhuǎn)、縮放的賦值粘貼功能

效果圖:
【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】,# Unity3D之編輯器擴(kuò)展,編輯器,c#,開發(fā)語(yǔ)言,游戲引擎,unity
示例代碼:

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

public class ButtonHandler
{
    public string showDescription;
    public Action onClickCallBack;
    public ButtonHandler(string showDescription, Action onClickCallBack)
    {
        this.showDescription = showDescription;
        this.onClickCallBack = onClickCallBack;
    }
}
[CanEditMultipleObjects]
[CustomEditor(typeof(Transform))]
public class TransformEditor2 : Editor
{
    static public Editor instance;

    private bool extensionBool;

    ButtonHandler[] buttonHandlerArray;

    //當(dāng)前的本地坐標(biāo)
    SerializedProperty mPos;
    //當(dāng)前的本地旋轉(zhuǎn)
    SerializedProperty mRot;
    //當(dāng)前的本地縮放
    SerializedProperty mScale;


    private void OnEnable()
    {
        instance = this;

        var editorType = Assembly.GetAssembly(typeof(Editor)).GetTypes().FirstOrDefault(m => m.Name == "TransformInspector");
        instance = CreateEditor(targets, editorType);

        if (this)
        {
            try
            {
                var so = serializedObject;
                mPos = so.FindProperty("m_LocalPosition");
                mRot = so.FindProperty("m_LocalRotation");
                mScale = so.FindProperty("m_LocalScale");
            }
            catch { }
        }

        extensionBool = EditorPrefs.GetBool("extensionBool");

        buttonHandlerArray = new ButtonHandler[9];
        buttonHandlerArray[0] = new ButtonHandler("Position Copy", () =>
        {
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            StringBuilder s = new StringBuilder();
            // x,y,z
            s.Append(mPos.vector3Value.x.ToString() + "," + mPos.vector3Value.y.ToString() + "," + mPos.vector3Value.z.ToString());
            //添加到剪貼板
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
        });
        buttonHandlerArray[1] = new ButtonHandler("Position Paste", () =>
        {
            //把數(shù)值打印出來(lái)
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            try
            {
                mPos.vector3Value = ParseV3(s);
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }
        });
        buttonHandlerArray[2] = new ButtonHandler("Position Reset", () =>
        {
            mPos.vector3Value = Vector3.zero;
        });
        buttonHandlerArray[3] = new ButtonHandler("Rotation Copy", () =>
        {
            //把數(shù)值打印出來(lái)
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            StringBuilder s = new StringBuilder();
            s.Append(mRot.quaternionValue.eulerAngles.x + "," + mRot.quaternionValue.eulerAngles.y + "," + mRot.quaternionValue.eulerAngles.z);
            //添加到剪貼板
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
        });
        buttonHandlerArray[4] = new ButtonHandler("Rotation Paste", () =>
        {
            //把數(shù)值打印出來(lái)
            Debug.Log(UnityEngine.GUIUtility.systemCopyBuffer);
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            try
            {
                mRot.quaternionValue = Quaternion.Euler(ParseV3(s));
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }
        });
        buttonHandlerArray[5] = new ButtonHandler("Rotation Reset", () =>
        {
            mRot.quaternionValue = Quaternion.identity;
        });
        buttonHandlerArray[6] = new ButtonHandler("Scale Copy", () =>
        {
            //把數(shù)值打印出來(lái)
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            StringBuilder s = new StringBuilder();
            s.Append(mScale.vector3Value.x.ToString() + "," + mScale.vector3Value.y.ToString() + "," + mScale.vector3Value.z.ToString());
            //添加到剪貼板
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
        });
        buttonHandlerArray[7] = new ButtonHandler("Scale Paste", () =>
        {
            //把數(shù)值打印出來(lái)
            Debug.Log(UnityEngine.GUIUtility.systemCopyBuffer);
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            try
            {
                mScale.vector3Value = ParseV3(s);
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }
        });
        buttonHandlerArray[8] = new ButtonHandler("Scale Reset", () =>
        {
            mScale.vector3Value = Vector3.one;
        });
    }

    private void OnDisable()
    {
        EditorPrefs.SetBool("extensionBool", extensionBool);
    }

    public override void OnInspectorGUI()
    {
        instance.OnInspectorGUI();

        GUI.color = Color.cyan;
        extensionBool = EditorGUILayout.Foldout(extensionBool, "拓展功能");
        if (extensionBool)
        {
            EditorGUILayout.BeginHorizontal();
            for (int i = 0; i < buttonHandlerArray.Length; i++)
            {
                ButtonHandler temporaryButtonHandler = buttonHandlerArray[i];
                if (GUILayout.Button(temporaryButtonHandler.showDescription, "toolbarbutton"))//, GUILayout.MaxWidth(150)
                {
                    temporaryButtonHandler.onClickCallBack();
                }
                GUILayout.Space(5);
                if ((i + 1) % 3 == 0 || i + 1 == buttonHandlerArray.Length)
                {
                    EditorGUILayout.EndHorizontal();
                    if (i + 1 < buttonHandlerArray.Length)
                    {
                        GUILayout.Space(5);
                        EditorGUILayout.BeginHorizontal();
                    }
                }
            }
        }
        GUI.color = Color.white;

        serializedObject.ApplyModifiedProperties();
    }

    Vector3 ParseV3(string strVector3)
    {
        string[] s = strVector3.Split(',');
        return new Vector3(float.Parse(s[0]), float.Parse(s[1]), float.Parse(s[2]));
    }
}

演示:
【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】,# Unity3D之編輯器擴(kuò)展,編輯器,c#,開發(fā)語(yǔ)言,游戲引擎,unity
這樣就實(shí)現(xiàn)了單獨(dú)的位置/旋轉(zhuǎn)/縮放復(fù)制/粘貼功能。

接下來(lái),就實(shí)現(xiàn)單獨(dú)的位置/旋轉(zhuǎn)/縮放復(fù)制/粘貼功能以及位置/旋轉(zhuǎn)/縮放一起復(fù)制和粘貼功能。

以及,自定義文本拼接的功能。

2-3、自定義文本拼接的功能

效果圖:
【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】,# Unity3D之編輯器擴(kuò)展,編輯器,c#,開發(fā)語(yǔ)言,游戲引擎,unity

參考代碼:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEditor;
using UnityEditor.AnimatedValues;
using UnityEngine;
using static UnityEditor.IMGUI.Controls.PrimitiveBoundsHandle;
using static UnityEngine.GraphicsBuffer;
using static UnityEngine.UI.Image;

[CanEditMultipleObjects]
[CustomEditor(typeof(Transform))]
public class TransformEditor : Editor
{
    static public Editor instance;
    Transform m_Transform;

    private bool extensionBool;

    string axisName = "Local";
    bool isAxis = false;
    bool isDefined = false;
    string row1;
    string row2;
    string row3;
    string row4;
    //當(dāng)前的本地坐標(biāo)
    SerializedProperty mPos;
    //當(dāng)前的本地旋轉(zhuǎn)
    SerializedProperty mRot;
    //當(dāng)前的本地縮放
    SerializedProperty mScale;

    private void OnEnable()
    {
        instance = this;

        var editorType = Assembly.GetAssembly(typeof(Editor)).GetTypes().FirstOrDefault(m => m.Name == "TransformInspector");
        instance = CreateEditor(targets, editorType);

        isAxis = EditorPrefs.GetBool("isAxis");
        isDefined = EditorPrefs.GetBool("isDefined");

        m_Transform = this.target as Transform;

        if (this)
        {
            try
            {
                var so = serializedObject;
                mPos = so.FindProperty("m_LocalPosition");
                mRot = so.FindProperty("m_LocalRotation");
                mScale = so.FindProperty("m_LocalScale");
            }
            catch { }
        }
    }

    private void OnDisable()
    {
        EditorPrefs.SetBool("extensionBool", extensionBool);
        EditorPrefs.SetBool("isDefined", isDefined);
    }

    public override void OnInspectorGUI()
    {
        instance.OnInspectorGUI();

        extensionBool = EditorPrefs.GetBool("extensionBool");
        extensionBool = EditorGUILayout.Foldout(extensionBool, "拓展功能");

        if (extensionBool)
        {
            OnTopGUI();

            OnTransformGUI();

            OnPositionGUI();

            OnRotationGUI();

            OnScaleGUI();

            OnDefindGUI();
        }
    }

    void OnTopGUI()
    {
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("Name");

        if (GUILayout.Button("Local/Global"))
        {
            isAxis = !isAxis;
            EditorPrefs.SetBool("isAxis", isAxis);
        }
        axisName = isAxis ? "Local" : "Global";
        GUILayout.Label("當(dāng)前坐標(biāo)軸:" + axisName);
        EditorGUILayout.EndHorizontal();
    }

    void OnTransformGUI()
    {
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("Transform");
        if (GUILayout.Button("Copy"))
        {
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            StringBuilder s = new StringBuilder();
            s.Append("Transform_");
            if (isAxis)
            {
                s.Append(FormatVe3(m_Transform.localPosition) + "_");
                s.Append(FormatVe3(m_Transform.localRotation.eulerAngles) + "_");
                s.Append(FormatVe3(m_Transform.localScale));
            }
            else
            {
                s.Append(FormatVe3(m_Transform.position) + "_");
                s.Append(FormatVe3(m_Transform.rotation.eulerAngles) + "_");
                s.Append(FormatVe3(m_Transform.localScale));
            }
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
        }
        if (GUILayout.Button("Paste"))
        {
            if (isDefined)
            {
                Debug.LogError("不支持自定義文本!");
                UnityEngine.GUIUtility.systemCopyBuffer = "";
                return;
            }
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            string[] sArr = s.Split('_');
            if (sArr[0] != "Transform" || s == "")
            {
                Debug.LogError("未復(fù)制Transform組件內(nèi)容!");
                return;
            }
            try
            {
                m_Transform.position = ParseV3(sArr[1]);
                m_Transform.rotation = Quaternion.Euler(ParseV3(sArr[2]));
                m_Transform.localScale = ParseV3(sArr[3]);
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }
        }
        if (GUILayout.Button("Reset"))
        {
            m_Transform.position = Vector3.zero;
            m_Transform.rotation = Quaternion.identity;
            m_Transform.localScale = Vector3.one;
        }
        EditorGUILayout.EndHorizontal();
    }

    void OnPositionGUI()
    {
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("Position");
        if (GUILayout.Button("Copy"))
        {
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            StringBuilder s = new StringBuilder();
            if (isAxis)
            {
                s.Append(FormatVe3(m_Transform.localPosition));
            }
            else
            {
                s.Append(FormatVe3(m_Transform.position));
            }
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
            Debug.Log(s);
        }
        if (GUILayout.Button("Paste"))
        {
            if (isDefined)
            {
                Debug.LogError("不支持自定義文本!");
                UnityEngine.GUIUtility.systemCopyBuffer = "";
                return;
            }
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            if (s == "")
            {
                Debug.LogError("未復(fù)制Position內(nèi)容!");
                return;
            }
            try
            {
                m_Transform.position = ParseV3(s);
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }
        }
        if (GUILayout.Button("Reset"))
        {
            m_Transform.position = Vector3.zero;
        }
        EditorGUILayout.EndHorizontal();
    }

    void OnRotationGUI()
    {
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("Rotation");
        if (GUILayout.Button("Copy"))
        {
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            StringBuilder s = new StringBuilder();
            if (isAxis)
            {
                s.Append(FormatVe3(m_Transform.localRotation.eulerAngles));
            }
            else
            {
                s.Append(FormatVe3(m_Transform.rotation.eulerAngles));
            }
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
        }
        if (GUILayout.Button("Paste"))
        {
            if (isDefined)
            {
                Debug.LogError("不支持自定義文本!");
                UnityEngine.GUIUtility.systemCopyBuffer = "";
                return;
            }
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            if (s == "")
            {
                Debug.LogError("未復(fù)制Rotation內(nèi)容!");
                return;
            }
            try
            {
                m_Transform.rotation = Quaternion.Euler(ParseV3(s));
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }
        }
        if (GUILayout.Button("Reset"))
        {
            m_Transform.rotation = Quaternion.identity;
        }
        EditorGUILayout.EndHorizontal();
    }

    void OnScaleGUI()
    {
        EditorGUILayout.BeginHorizontal();
        GUILayout.Label("Scale");
        if (GUILayout.Button("Copy"))
        {
            var select = Selection.activeGameObject;
            if (select == null)
                return;
            StringBuilder s = new StringBuilder();
            s.Append(FormatVe3(m_Transform.localScale));
            UnityEngine.GUIUtility.systemCopyBuffer = s.ToString();
        }
        if (GUILayout.Button("Paste"))
        {
            if (isDefined)
            {
                Debug.LogError("不支持自定義文本!");
                UnityEngine.GUIUtility.systemCopyBuffer = "";
                return;
            }
            string s = UnityEngine.GUIUtility.systemCopyBuffer;
            if (s == "")
            {
                Debug.LogError("未復(fù)制Scale內(nèi)容!");
                return;
            }
            try
            {
                m_Transform.localScale = ParseV3(s);
            }
            catch (System.Exception ex)
            {
                Debug.LogError(ex);
                return;
            }
        }
        if (GUILayout.Button("Reset"))
        {
            m_Transform.localScale = Vector3.one;
        }
        EditorGUILayout.EndHorizontal();
    }

    void OnDefindGUI()
    {
        GUILayout.BeginVertical();
        isDefined = GUILayout.Toggle(isDefined, "啟用自定義文本拼接");
        if (isDefined)
        {
            GUILayout.BeginHorizontal();
            row1 = GUILayout.TextField(row1);
            GUILayout.Label("X");
            row2 = GUILayout.TextField(row2);
            GUILayout.Label("Y");
            row3 = GUILayout.TextField(row3);
            GUILayout.Label("Z");
            row4 = GUILayout.TextField(row4);
            GUILayout.EndHorizontal();
        }
        GUILayout.EndVertical();
    }

    // x,y,z
    Vector3 ParseV3(string strVector3)
    {
        string[] s = strVector3.Split(',');
        return new Vector3(float.Parse(s[0]), float.Parse(s[1]), float.Parse(s[2]));
    }

    // x,y,z
    string FormatVe3(Vector3 ve3)
    {
        string str;
        if (!isDefined)
        {
            str = ve3.x + "," + ve3.y + "," + ve3.z;
        }
        else
        {
            str = row1 + ve3.x + row2 + ve3.y + row3 + ve3.z + row4;
        }
        return str;
    }
}

三、后記

如果覺(jué)得本篇文章有用別忘了點(diǎn)個(gè)關(guān)注,關(guān)注不迷路,持續(xù)分享更多Unity干貨文章。


你的點(diǎn)贊就是對(duì)博主的支持,有問(wèn)題記得留言:

博主主頁(yè)有聯(lián)系方式。

博主還有跟多寶藏文章等待你的發(fā)掘哦:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-723593.html

專欄 方向 簡(jiǎn)介
Unity3D開發(fā)小游戲 小游戲開發(fā)教程 分享一些使用Unity3D引擎開發(fā)的小游戲,分享一些制作小游戲的教程。
Unity3D從入門到進(jìn)階 入門 從自學(xué)Unity中獲取靈感,總結(jié)從零開始學(xué)習(xí)Unity的路線,有C#和Unity的知識(shí)。
Unity3D之UGUI UGUI Unity的UI系統(tǒng)UGUI全解析,從UGUI的基礎(chǔ)控件開始講起,然后將UGUI的原理,UGUI的使用全面教學(xué)。
Unity3D之讀取數(shù)據(jù) 文件讀取 使用Unity3D讀取txt文檔、json文檔、xml文檔、csv文檔、Excel文檔。
Unity3D之?dāng)?shù)據(jù)集合 數(shù)據(jù)集合 數(shù)組集合:數(shù)組、List、字典、堆棧、鏈表等數(shù)據(jù)集合知識(shí)分享。
Unity3D之VR/AR(虛擬仿真)開發(fā) 虛擬仿真 總結(jié)博主工作常見的虛擬仿真需求進(jìn)行案例講解。
Unity3D之插件 插件 主要分享在Unity開發(fā)中用到的一些插件使用方法,插件介紹等
Unity3D之日常開發(fā) 日常記錄 主要是博主日常開發(fā)中用到的,用到的方法技巧,開發(fā)思路,代碼分享等
Unity3D之日常BUG 日常記錄 記錄在使用Unity3D編輯器開發(fā)項(xiàng)目過(guò)程中,遇到的BUG和坑,讓后來(lái)人可以有些參考。

到了這里,關(guān)于【Unity3D編輯器開發(fā)】Unity3D中實(shí)現(xiàn)Transform快速?gòu)?fù)制粘貼【非常實(shí)用】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Unity3D】Unity 腳本 ② ( Visual Studio 2019 中的 Unity 編譯環(huán)境配置 | Unity 編輯器關(guān)聯(lián)外部 C# 腳本編輯器 Visual Studio )

    【Unity3D】Unity 腳本 ② ( Visual Studio 2019 中的 Unity 編譯環(huán)境配置 | Unity 編輯器關(guān)聯(lián)外部 C# 腳本編輯器 Visual Studio )

    在上一篇博客 【Unity3D】Unity 腳本 ① ( 創(chuàng)建 C# 腳本 | Visual Studio 2019 中打開 C# 腳本 | 編譯 C# 腳本 | 掛載 C# 腳本到游戲物體 | 運(yùn)行腳本 ) 中 , 雙擊 Unity 編輯器中的 Project 窗口中的 C# 腳本 , 進(jìn)入到 Visual Studio 中出現(xiàn)下圖樣式 , 這是因?yàn)闆](méi)有配置 Unity 編譯環(huán)境 ; 參考如下兩個(gè)博

    2023年04月08日
    瀏覽(101)
  • Unity3d C#利用Editor編輯器拓展實(shí)現(xiàn)配置UI背景樣式一鍵設(shè)置UI背景樣式功能(含源碼)

    Unity3d C#利用Editor編輯器拓展實(shí)現(xiàn)配置UI背景樣式一鍵設(shè)置UI背景樣式功能(含源碼)

    在開發(fā)UI滾動(dòng)列表的時(shí)候,經(jīng)常會(huì)有每項(xiàng)的背景圖不統(tǒng)一的情況,會(huì)間隔重復(fù)的情況居多。這種情況下,手動(dòng)去設(shè)置間隔一行的背景圖或者顏色是比較麻煩的。在此背景下,筆者嘗試寫個(gè)小工具,在搭建UI時(shí)配置一下循環(huán)背景的樣式,可以通過(guò)一鍵點(diǎn)擊后設(shè)置UI背景的樣式,省

    2024年02月03日
    瀏覽(29)
  • 【Unity3D日常開發(fā)】Unity3D中實(shí)現(xiàn)單例模式詳解

    【Unity3D日常開發(fā)】Unity3D中實(shí)現(xiàn)單例模式詳解

    推薦閱讀 CSDN主頁(yè) GitHub開源地址 Unity3D插件分享 簡(jiǎn)書地址 我的個(gè)人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。 首先,說(shuō)一下,什么是 單例模式(Singleton) 。 單例模式是設(shè)計(jì)模式中常見的一種設(shè)計(jì)模式,目的是為了

    2024年02月02日
    瀏覽(29)
  • 【Unity3D日常開發(fā)】Unity3D中實(shí)現(xiàn)不同腳本之間的執(zhí)行順序控制

    【Unity3D日常開發(fā)】Unity3D中實(shí)現(xiàn)不同腳本之間的執(zhí)行順序控制

    推薦閱讀 CSDN主頁(yè) GitHub開源地址 Unity3D插件分享 簡(jiǎn)書地址 我的個(gè)人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。 首先,來(lái)了解一下事件函數(shù)的執(zhí)行順序,下圖是官方給的腳本中事件函數(shù)的執(zhí)行順序: 眾所周知,U

    2024年02月02日
    瀏覽(36)
  • 【Unity3D小功能】Unity3D中實(shí)現(xiàn)Text顯示版本功能

    【Unity3D小功能】Unity3D中實(shí)現(xiàn)Text顯示版本功能

    推薦閱讀 CSDN主頁(yè) GitHub開源地址 Unity3D插件分享 簡(jiǎn)書地址 我的個(gè)人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。 在項(xiàng)目開發(fā)中,會(huì)遇到要控制版本的情況,比如說(shuō)對(duì)比版本號(hào),版本不對(duì)再更新版本的功能,這些就是

    2024年02月05日
    瀏覽(99)
  • 【Unity3D小功能】Unity3D中實(shí)現(xiàn)點(diǎn)擊‘文字’出現(xiàn)‘UI面板’

    【Unity3D小功能】Unity3D中實(shí)現(xiàn)點(diǎn)擊‘文字’出現(xiàn)‘UI面板’

    推薦閱讀 CSDN主頁(yè) GitHub開源地址 Unity3D插件分享 簡(jiǎn)書地址 QQ群:398291828 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。 寵粉博主又來(lái)了,今天有粉絲問(wèn)我如何實(shí)現(xiàn)點(diǎn)擊一段文字然后出現(xiàn)的面板在那段文字附近顯示: 深入了

    2024年04月13日
    瀏覽(167)
  • 【Unity3D小功能】Unity3D中實(shí)現(xiàn)仿真時(shí)鐘、表盤、仿原神時(shí)鐘

    【Unity3D小功能】Unity3D中實(shí)現(xiàn)仿真時(shí)鐘、表盤、仿原神時(shí)鐘

    推薦閱讀 CSDN主頁(yè) GitHub開源地址 Unity3D插件分享 簡(jiǎn)書地址 我的個(gè)人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。 今天實(shí)現(xiàn)一個(gè)時(shí)鐘工具,其實(shí)在之前已經(jīng)完成了一個(gè)簡(jiǎn)單的時(shí)鐘工具:【Unity3D應(yīng)用案例系列】時(shí)鐘、

    2024年02月05日
    瀏覽(27)
  • 【Unity3D小功能】Unity3D中實(shí)現(xiàn)UI擦除效果、刮刮卡功能

    【Unity3D小功能】Unity3D中實(shí)現(xiàn)UI擦除效果、刮刮卡功能

    推薦閱讀 CSDN主頁(yè) GitHub開源地址 Unity3D插件分享 簡(jiǎn)書地址 我的個(gè)人博客 大家好,我是佛系工程師 ☆恬靜的小魔龍☆ ,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。 使用Unity3D實(shí)現(xiàn)UI的擦拭效果、刮刮卡功能的效果實(shí)現(xiàn)方式比較多,比如說(shuō)用Shader、Texture渲染都是可以

    2024年02月04日
    瀏覽(158)
  • Unity3D中實(shí)現(xiàn)動(dòng)畫的方式:

    Unity3D中實(shí)現(xiàn)動(dòng)畫的方式有很多種,以下是其中兩種常用的方式: 1. 使用Animation組件 使用Animation組件可以制作簡(jiǎn)單的關(guān)鍵幀動(dòng)畫。步驟如下: 將需要?jiǎng)赢嫷奈矬w選中,然后在Inspector面板中點(diǎn)擊Add Component按鈕,選擇Animation組件。 在Project面板中創(chuàng)建動(dòng)畫剪輯(Animation Clip)。

    2024年02月08日
    瀏覽(25)
  • Unity3D中實(shí)現(xiàn)Player的第一人稱視角

    Unity3D中實(shí)現(xiàn)Player的第一人稱視角

    效果,上面為Scene場(chǎng)景,下面為Game場(chǎng)景 0創(chuàng)建地形,當(dāng)然可以先簡(jiǎn)單的創(chuàng)建一個(gè)空白的Terrain。這里我已經(jīng)對(duì)地形進(jìn)行了初步的編輯和渲染。 1.在Hierarchy視圖中右鍵創(chuàng)建一個(gè)膠囊體(Capsule)作為Player,添加好后重置膠囊體的位置,并且調(diào)整膠囊體在一個(gè)合適的位置。 ?2.將Main

    2023年04月08日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包