-
Notifications
You must be signed in to change notification settings - Fork 0
/
UISelectablePort.cs
85 lines (81 loc) · 3 KB
/
UISelectablePort.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
[AddComponentMenu("UISelectablePort")]
[RequireComponent(typeof(Selectable))]
public class UISelectablePort : MonoBehaviour {
[SerializeField] EventSystem eventSystem = null;
[SerializeField] Way[] ways = new Way[0];
private Selectable selfSelectable = null;
private GameObject prebSelectable = null;
public bool IsEnable {
get {
foreach (var w in this.ways) {
if (w.IsEnable) return true;
}
return false;
}
}
[SerializeField] Selectable error;
// Start is called before the first frame update
void Start() {
if (this.eventSystem == null) this.eventSystem = EventSystem.current;
this.selfSelectable = this.GetComponent<Selectable>();
}
// Update is called once per frame
void Update() {
UpdateCurrentSelectable();
UpdatePrebSelectable();
}
private void UpdatePrebSelectable() {
if (this.eventSystem.currentSelectedGameObject != this.gameObject) {
this.prebSelectable = this.eventSystem.currentSelectedGameObject;
}
}
private void UpdateCurrentSelectable() {
this.gameObject.SetActive(this.IsEnable);
this.selfSelectable.interactable = this.IsEnable;
if (!this.IsEnable) return;
if (this.eventSystem.currentSelectedGameObject == this.gameObject) {
foreach (var w in this.ways) {
GameObject move = w.MovePort(this.prebSelectable);
if (move != null) {
this.eventSystem.SetSelectedGameObject(move);
break;
} else this.eventSystem.SetSelectedGameObject(error.gameObject);
}
}
}
[System.Serializable]
class Way {
private static bool SelectableIsEnable(Selectable s) => s.gameObject.activeInHierarchy && s.interactable;
[SerializeField] Selectable[] s0;
[SerializeField] Selectable[] s1;
private static bool SelectablesIsEnable(Selectable[] ss) {
foreach (var s in ss) {
if (SelectableIsEnable(s)) return true;
}
return false;
}
private static bool Contents(Selectable[] selectables, GameObject search) {
foreach (var s in selectables) {
if (s.gameObject == search) return true;
}
return false;
}
private static GameObject GetSelectable(Selectable[] selectables) {
foreach (var s in selectables) {
if (SelectableIsEnable(s)) return s.gameObject;
}
return null;
}
public bool IsEnable => SelectablesIsEnable(s0) && SelectablesIsEnable(s1);
public GameObject MovePort(GameObject preb) {
if (Contents(s0, preb)) {
return GetSelectable(s1);
} else if (Contents(s1, preb)) {
return GetSelectable(s0);
} else return null;
}
}
}