MainWindow:
Синтаксис:
Используется csharp
public class MainWindow : EditorWindow {
public static MainWindow Instance;
public AuxPanel auxPanel;
[MenuItem("Examples/MainWindow")]
static void InitAndRun() {
if (Instance == null) {
Init();
} else {
GetWindow<MainWindow>();
Instance.Focus();
}
}
private void OnEnable() {
if (Instance == null) Instance = GetWindow<MainWindow>();
}
private static void Init(String initForm = null) {
MainWindow mainWindow = GetWindow<MainWindow>();
Instance = mainWindow;
mainWindow.InitializeInstance(initForm);
mainWindow.Show();
}
private void InitializeInstance(String initForm) {
auxPanel = CreateInstance<AuxPanel>().Initialize();
}
private void OnGUI() {
auxPanel.Draw();
}
}
AuxPanel:
Синтаксис:
Используется csharp
public class AuxPanel : ScriptableObject {
public Rect DrawRect = new Rect(50, 20, 140, 140);
[SerializeField]
public ElementWithSubscribing myElement { get; set; }
public UnityAction<Vector2> PositionChange = delegate { };
public AuxPanel Initialize() {
myElement = new ElementWithSubscribing(Vector2.zero, this);
return this;
}
public void Draw() {
GUI.Label(DrawRect, "", "GroupBox");
myElement.Draw();
// fire event
PositionChange(DrawRect.position);
}
}
public Rect DrawRect = new Rect(50, 20, 140, 140);
[SerializeField]
public ElementWithSubscribing myElement { get; set; }
public UnityAction<Vector2> PositionChange = delegate { };
public AuxPanel Initialize() {
myElement = new ElementWithSubscribing(Vector2.zero, this);
return this;
}
public void Draw() {
GUI.Label(DrawRect, "", "GroupBox");
myElement.Draw();
// fire event
PositionChange(DrawRect.position);
}
}
ElementSubscriber:
Синтаксис:
Используется csharp
[Serializable]
public class ElementWithSubscribing {
public Rect DrawRect = new Rect(0, 0, 100, 50);
public ElementWithSubscribing() { }
public ElementWithSubscribing(Vector2 position) { }
public ElementWithSubscribing(Vector2 position, AuxPanel auxPanel) {
auxPanel.PositionChange += UpdatePosition;
}
protected void UpdatePosition(Vector2 designerPosition) {
Debug.Log("event works!");
DrawRect.position = designerPosition;
}
public void Draw() {
GUI.Button(DrawRect, "MyElement");
}
}
public class ElementWithSubscribing {
public Rect DrawRect = new Rect(0, 0, 100, 50);
public ElementWithSubscribing() { }
public ElementWithSubscribing(Vector2 position) { }
public ElementWithSubscribing(Vector2 position, AuxPanel auxPanel) {
auxPanel.PositionChange += UpdatePosition;
}
protected void UpdatePosition(Vector2 designerPosition) {
Debug.Log("event works!");
DrawRect.position = designerPosition;
}
public void Draw() {
GUI.Button(DrawRect, "MyElement");
}
}
После сохранения кода - ElementWithSubscribing теряет подписку на событие auxPanel.PositionChange
Как сохранить событие? Или как его восстановить после компиляции? У меня много разных событий и много других классов, поэтому вариант переприкрепить временно события к какому-то объекту, который будет сохранять события - как-то не ахти
———————————————————————————————————————————
P.S. А еще данный код после компиляции иногда выдает мне два окна. То есть одно было → компиляция → еще одно окно появилось:
Как это тоже поправить?