@@ -16,14 +16,23 @@ public virtual SVector3 Position
1616 set
1717 {
1818 position = value ;
19- if ( Object is null ) return ;
19+ if ( ! Object ) return ;
2020 Object . transform . position = value ;
2121 }
2222 }
2323 public virtual bool ShouldSerializePosition ( ) => true ;
2424
25+ protected ZoneController controller ;
2526 [ XmlIgnore , JsonIgnore ]
26- public virtual ZoneController Controller { get ; protected set ; }
27+ public virtual ZoneController Controller
28+ {
29+ get
30+ {
31+ TryReinitialize ( ) ;
32+ return controller ;
33+ }
34+ protected set => controller = value ;
35+ }
2736
2837 protected GameObject Object ;
2938 private static GameObject _prefab ;
@@ -33,37 +42,76 @@ internal virtual void Initialize()
3342 {
3443 if ( Object ) return ;
3544 UnityObject . DontDestroyOnLoad ( Object = UnityObject . Instantiate ( Prefab ) ) ;
45+
3646 foreach ( var body in Object . GetComponents < Rigidbody > ( ) )
3747 UnityObject . Destroy ( body ) ;
48+
49+ InitializeController ( ) ;
50+
3851 Position = position ; // update position
3952 }
40- internal virtual void Dispose ( )
53+
54+ internal virtual void InitializeController ( ) { }
55+
56+ internal virtual void Finalize ( )
57+ {
58+ FinalizeController ( ) ;
59+ UnityObject . Destroy ( Object ) ;
60+ }
61+
62+ internal virtual void FinalizeController ( )
4163 {
42- if ( Controller ) UnityObject . Destroy ( Controller ) ;
43- if ( Object ) UnityObject . Destroy ( Object ) ;
64+ UnityObject . Destroy ( controller ) ;
4465 }
4566
67+ public virtual void Reinitialize ( )
68+ {
69+ Finalize ( ) ;
70+ Initialize ( ) ;
71+ }
72+
73+ public virtual void ReinitializeController ( )
74+ {
75+ FinalizeController ( ) ;
76+ InitializeController ( ) ;
77+ }
78+
79+ public void TryReinitialize ( )
80+ {
81+ if ( ! Object ) Reinitialize ( ) ;
82+ else if ( ! controller ) ReinitializeController ( ) ;
83+ }
84+
85+ public virtual bool IsValid ( ) => Object && controller ;
86+
4687 public override string ToString ( ) => ToJsonString ( this , true , new ValueTypeToStringJsonConverter ( ) ) ;
4788}
4889public abstract class Zone < TController > : Zone
4990 where TController : ZoneController
5091{
5192 [ XmlIgnore , JsonIgnore ]
52- public virtual new TController Controller { get => ( TController ) base . Controller ; private set => base . Controller = value ; }
93+ public virtual new TController Controller
94+ {
95+ get => ( TController ) base . Controller ;
96+ private set => base . Controller = value ;
97+ }
5398
54- internal override void Initialize ( )
99+ internal override void InitializeController ( )
55100 {
56- base . Initialize ( ) ;
57- ( Controller = Object . GetOrAddComponent < TController > ( ) ) . Initialize ( this ) ;
58- Controller . OnPlayerEnter += Debug_PlayerEnterHandler ;
59- Controller . OnPlayerExit += Debug_PlayerExitHandler ;
101+ base . InitializeController ( ) ;
102+ if ( controller ) return ;
103+ ( controller = Object . GetOrAddComponent < TController > ( ) ) . Initialize ( this ) ;
104+ controller . OnPlayerEnter += Debug_PlayerEnterHandler ;
105+ controller . OnPlayerExit += Debug_PlayerExitHandler ;
60106 }
61- internal override void Dispose ( )
107+
108+ internal override void FinalizeController ( )
62109 {
63- Controller . OnPlayerEnter -= Debug_PlayerEnterHandler ;
64- Controller . OnPlayerExit -= Debug_PlayerExitHandler ;
65- base . Dispose ( ) ;
110+ if ( ! controller ) return ;
111+ controller . OnPlayerEnter -= Debug_PlayerEnterHandler ;
112+ controller . OnPlayerExit -= Debug_PlayerExitHandler ;
66113 }
114+
67115 private void Debug_PlayerEnterHandler ( Player player )
68116 {
69117 if ( ! conf . DebugInformation ) return ;
0 commit comments