Unity Editor - 使用 switch case 显示两点之间的 GUI 行
Unity Editor - Displaying GUI lines between two points using switch case
我正在尝试实现一个编辑器脚本,该脚本将显示编辑器中任意两点之间的 GUI 行。我有三个空游戏对象作为 Vector3 点(A、B 和 C),例如,如果按下按钮 #1,整数 "switchCase" 的值将设置为 1,并且根据 switch case 语句,它会显示A点和B点之间的一条线。如果按下按钮#2,"switchCase"设置为2,它会显示A点和B点之间,B点和C点之间的线,等等上。
我遇到的问题是,当我按下按钮时 - 编辑器中没有任何反应。我可以看到 "switchCase" 的值在检查器中正确更改,但线条没有显示。
如果我直接在检查器中输入值,它会正常工作,但我的目标是在按下按钮时更改值,而不是手动更改检查器中的值。
希望我的问题是有道理的。任何帮助将不胜感激!
编辑器脚本如下:
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
using UnityEditor.AnimatedValues;
using System.Linq;
[CustomEditor(typeof(LineTest))]
public class LineTestInspector : Editor
{
public LineTest myScript;
public void OnSceneGUI()
{
Handles.color = Color.red;
switch (myScript.switchCase)
{
case 1:
GameObject posAobj = GameObject.Find("PointA");
GameObject posBobj = GameObject.Find("PointB");
myScript.posA = posAobj.transform.position;
myScript.posB = posBobj.transform.position;
Handles.DrawLine(myScript.posA, myScript.posB);
break;
case 2:
GameObject posCobj = GameObject.Find("PointC");
myScript.posC = posCobj.transform.position;
Handles.DrawLine(myScript.posA, myScript.posB);
Handles.DrawLine(myScript.posB, myScript.posC);
break;
}
public override void OnInspectorGUI()
{
DrawDefaultInspector();
if (GUILayout.Button("Draw First Line"))
{
myScript.switchCase= 1;
Debug.Log("Switch - 1");
}
if (GUILayout.Button("Draw Second Line"))
{
myScript.switchCase = 2;
Debug.Log("Switch - 2");
}
if (GUILayout.Button("Reset switchCase"))
{
myScript.switchCase = 0;
Debug.Log("Switch - 0");
}
}
}
以及 Mono 脚本:
using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;
public class LineTest : MonoBehaviour {
public Vector3 posA;
public Vector3 posB;
public Vector3 posC;
public int switchCase;
}
您必须调用 EditorUtility.SetDirty(myScript);
以便编辑器在更改值后进行更新。
您的代码应如下所示:
public override void OnInspectorGUI()
{
DrawDefaultInspector();
if (GUILayout.Button("Draw First Line"))
{
myScript.switchCase = 1;
Debug.Log("Switch - 1");
EditorUtility.SetDirty(myScript);
}
if (GUILayout.Button("Draw Second Line"))
{
myScript.switchCase = 2;
Debug.Log("Switch - 2");
EditorUtility.SetDirty(myScript);
}
if (GUILayout.Button("Reset switchCase"))
{
myScript.switchCase = 0;
Debug.Log("Switch - 0");
EditorUtility.SetDirty(myScript);
}
}
我正在尝试实现一个编辑器脚本,该脚本将显示编辑器中任意两点之间的 GUI 行。我有三个空游戏对象作为 Vector3 点(A、B 和 C),例如,如果按下按钮 #1,整数 "switchCase" 的值将设置为 1,并且根据 switch case 语句,它会显示A点和B点之间的一条线。如果按下按钮#2,"switchCase"设置为2,它会显示A点和B点之间,B点和C点之间的线,等等上。
我遇到的问题是,当我按下按钮时 - 编辑器中没有任何反应。我可以看到 "switchCase" 的值在检查器中正确更改,但线条没有显示。
如果我直接在检查器中输入值,它会正常工作,但我的目标是在按下按钮时更改值,而不是手动更改检查器中的值。
希望我的问题是有道理的。任何帮助将不胜感激!
编辑器脚本如下:
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.Collections.Generic;
using UnityEditor.AnimatedValues;
using System.Linq;
[CustomEditor(typeof(LineTest))]
public class LineTestInspector : Editor
{
public LineTest myScript;
public void OnSceneGUI()
{
Handles.color = Color.red;
switch (myScript.switchCase)
{
case 1:
GameObject posAobj = GameObject.Find("PointA");
GameObject posBobj = GameObject.Find("PointB");
myScript.posA = posAobj.transform.position;
myScript.posB = posBobj.transform.position;
Handles.DrawLine(myScript.posA, myScript.posB);
break;
case 2:
GameObject posCobj = GameObject.Find("PointC");
myScript.posC = posCobj.transform.position;
Handles.DrawLine(myScript.posA, myScript.posB);
Handles.DrawLine(myScript.posB, myScript.posC);
break;
}
public override void OnInspectorGUI()
{
DrawDefaultInspector();
if (GUILayout.Button("Draw First Line"))
{
myScript.switchCase= 1;
Debug.Log("Switch - 1");
}
if (GUILayout.Button("Draw Second Line"))
{
myScript.switchCase = 2;
Debug.Log("Switch - 2");
}
if (GUILayout.Button("Reset switchCase"))
{
myScript.switchCase = 0;
Debug.Log("Switch - 0");
}
}
}
以及 Mono 脚本:
using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;
public class LineTest : MonoBehaviour {
public Vector3 posA;
public Vector3 posB;
public Vector3 posC;
public int switchCase;
}
您必须调用 EditorUtility.SetDirty(myScript);
以便编辑器在更改值后进行更新。
您的代码应如下所示:
public override void OnInspectorGUI()
{
DrawDefaultInspector();
if (GUILayout.Button("Draw First Line"))
{
myScript.switchCase = 1;
Debug.Log("Switch - 1");
EditorUtility.SetDirty(myScript);
}
if (GUILayout.Button("Draw Second Line"))
{
myScript.switchCase = 2;
Debug.Log("Switch - 2");
EditorUtility.SetDirty(myScript);
}
if (GUILayout.Button("Reset switchCase"))
{
myScript.switchCase = 0;
Debug.Log("Switch - 0");
EditorUtility.SetDirty(myScript);
}
}