推薦閱讀
- CSDN主頁(yè)
- GitHub開源地址
- Unity3D插件分享
- 簡(jiǎn)書地址
- 我的個(gè)人博客
大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時(shí)更新Unity開發(fā)技巧,覺(jué)得有用記得一鍵三連哦。
一、前言
在開發(fā)中,常常會(huì)遇到頻繁復(fù)制粘貼物體的坐標(biāo)、旋轉(zhuǎn)、縮放的操作。
使用Unity自帶的組件復(fù)制粘貼比較麻煩:
復(fù)制:
粘貼:
還有一些需要復(fù)制位置、旋轉(zhuǎn)、縮放的值到到代碼中,如果一個(gè)一個(gè)復(fù)制粘貼非常麻煩,還要一些需要復(fù)制添加自定義文本,也很不方便。
所以,就開發(fā)了一個(gè)小工具,來(lái)提升開發(fā)效率。
二、正文
2-1、實(shí)現(xiàn)快速?gòu)?fù)制/粘貼,位置/旋轉(zhuǎn)/縮放功能
效果圖:
在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é)果:
這樣就實(shí)現(xiàn)了基本的快速?gòu)?fù)制/粘貼,位置/旋轉(zhuǎn)/縮放功能。
接下來(lái),就實(shí)現(xiàn)單獨(dú)的位置、旋轉(zhuǎn)、縮放的復(fù)制和粘貼吧。
2-2、單獨(dú)的位置、旋轉(zhuǎn)、縮放的賦值粘貼功能
效果圖:
示例代碼:
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]));
}
}
演示:
這樣就實(shí)現(xiàn)了單獨(dú)的位置/旋轉(zhuǎn)/縮放復(fù)制/粘貼功能。
接下來(lái),就實(shí)現(xiàn)單獨(dú)的位置/旋轉(zhuǎn)/縮放復(fù)制/粘貼功能以及位置/旋轉(zhuǎn)/縮放一起復(fù)制和粘貼功能。
以及,自定義文本拼接的功能。
2-3、自定義文本拼接的功能
效果圖:
參考代碼:
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)系方式。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-723593.html
博主還有跟多寶藏文章等待你的發(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)!