Попробовал сделать с помощью SetNextControlName и FocusTextInControl. Если есть варианты получше, дайте знать пжл.
А вот что у меня вышло. Это рабочий скрипт, можно повесить на ГО чтобы потестить. Эффект получился странный. Перемещение на др. строку работает, но при этом выделяет содержимое через раз. Почему?
Синтаксис:
Используется csharp
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
public class TestFocusNavigationEditor : EditorWindow
{
enum Arrow { None, Up, Down }
Arrow arrow;
TestFocusNavigation main;
void OnGUI()
{
if(!main)
main = FindObjectOfType<TestFocusNavigation>();
Event e = Event.current;
for (int i = 0; i < main.testString.Length; i++)
{
GUILayout.BeginHorizontal();
GUI.SetNextControlName(i + "_str");
main.testString[i] = EditorGUILayout.TextField(main.testString[i], GUILayout.Width(100));
GUI.SetNextControlName(i + "_int");
main.testInt[i] = EditorGUILayout.IntField(main.testInt[i], GUILayout.Width(40));
GUILayout.EndHorizontal();
if(e.type == EventType.KeyUp && arrow == Arrow.None)
{
if (e.keyCode == KeyCode.DownArrow)
arrow = Arrow.Down;
else if (e.keyCode == KeyCode.UpArrow)
arrow = Arrow.Up;
}
}
if (arrow != Arrow.None)
{
string n = GUI.GetNameOfFocusedControl();
int dividerId = n.IndexOf("_");
int curLine = System.Convert.ToInt32(n.Substring(0, dividerId));
if (arrow == Arrow.Down)
curLine = (curLine + 1) % main.testString.Length;
else if (arrow == Arrow.Up)
curLine = (curLine - 1 + main.testString.Length) % main.testString.Length;
EditorGUI.FocusTextInControl(curLine + n.Substring(dividerId));
arrow = Arrow.None;
Repaint();
}
}
}
[CustomEditor(typeof(TestFocusNavigation))]
public class TestFocusNavigationButton : Editor
{
public override void OnInspectorGUI()
{
if (GUILayout.Button("Open editor"))
{
EditorWindow.GetWindow(typeof(TestFocusNavigationEditor), false, "Test Editor");
}
}
}
public class TestFocusNavigation : MonoBehaviour
{
public string[] testString = new string[20];
public int[] testInt = new int[20];
}
#endif
using UnityEngine;
using UnityEditor;
public class TestFocusNavigationEditor : EditorWindow
{
enum Arrow { None, Up, Down }
Arrow arrow;
TestFocusNavigation main;
void OnGUI()
{
if(!main)
main = FindObjectOfType<TestFocusNavigation>();
Event e = Event.current;
for (int i = 0; i < main.testString.Length; i++)
{
GUILayout.BeginHorizontal();
GUI.SetNextControlName(i + "_str");
main.testString[i] = EditorGUILayout.TextField(main.testString[i], GUILayout.Width(100));
GUI.SetNextControlName(i + "_int");
main.testInt[i] = EditorGUILayout.IntField(main.testInt[i], GUILayout.Width(40));
GUILayout.EndHorizontal();
if(e.type == EventType.KeyUp && arrow == Arrow.None)
{
if (e.keyCode == KeyCode.DownArrow)
arrow = Arrow.Down;
else if (e.keyCode == KeyCode.UpArrow)
arrow = Arrow.Up;
}
}
if (arrow != Arrow.None)
{
string n = GUI.GetNameOfFocusedControl();
int dividerId = n.IndexOf("_");
int curLine = System.Convert.ToInt32(n.Substring(0, dividerId));
if (arrow == Arrow.Down)
curLine = (curLine + 1) % main.testString.Length;
else if (arrow == Arrow.Up)
curLine = (curLine - 1 + main.testString.Length) % main.testString.Length;
EditorGUI.FocusTextInControl(curLine + n.Substring(dividerId));
arrow = Arrow.None;
Repaint();
}
}
}
[CustomEditor(typeof(TestFocusNavigation))]
public class TestFocusNavigationButton : Editor
{
public override void OnInspectorGUI()
{
if (GUILayout.Button("Open editor"))
{
EditorWindow.GetWindow(typeof(TestFocusNavigationEditor), false, "Test Editor");
}
}
}
public class TestFocusNavigation : MonoBehaviour
{
public string[] testString = new string[20];
public int[] testInt = new int[20];
}
#endif