| 
									
										
										
										
											2021-02-23 09:52:00 +00:00
										 |  |  | using System; | 
					
						
							|  |  |  | using System.Collections; | 
					
						
							|  |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | using UnityEngine; | 
					
						
							|  |  |  | #if UNITY_EDITOR | 
					
						
							|  |  |  | using UnityEditor; | 
					
						
							|  |  |  | #endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Ktyl.Util | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     [CreateAssetMenu(menuName = "ktyl/Events/Game Event")] | 
					
						
							| 
									
										
										
										
											2021-05-10 21:27:55 +01:00
										 |  |  |     public partial class GameEvent : ScriptableObject | 
					
						
							| 
									
										
										
										
											2021-02-23 09:52:00 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         [SerializeField] private bool _logRaised; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         protected readonly List<GameEventListener> _listeners = new List<GameEventListener>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public virtual void Raise() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_logRaised) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 Debug.Log($"raised {this}", this); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             for (int i = 0; i < _listeners.Count; i++) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _listeners[i].OnEventRaised(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void Register(GameEventListener listener) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (_listeners.Contains(listener)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 Debug.LogError($"{listener} already registered", this); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             _listeners.Add(listener); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public void Unregister(GameEventListener listener) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             if (!_listeners.Contains(listener)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 Debug.LogError($"{listener} not already registered"); | 
					
						
							|  |  |  |                 return; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             _listeners.Remove(listener); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     #region Editor | 
					
						
							|  |  |  |     #if UNITY_EDITOR | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-10 21:27:55 +01:00
										 |  |  |     public partial class GameEvent | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         private int _EDITOR_pingIdx; | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         public void EDITOR_PingNextListener() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             Debug.Log($"ping listener {_EDITOR_pingIdx+1}/{_listeners.Count}", this); | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             EditorGUIUtility.PingObject(_listeners[_EDITOR_pingIdx++]); | 
					
						
							|  |  |  |             _EDITOR_pingIdx %= _listeners.Count; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							| 
									
										
										
										
											2021-02-23 09:52:00 +00:00
										 |  |  |     [CustomEditor(typeof(GameEvent), true)] | 
					
						
							|  |  |  |     public class GameEventEditor : Editor | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         private GameEvent _event; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         private void OnEnable() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             _event = target as GameEvent; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         public override void OnInspectorGUI() | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             base.OnInspectorGUI(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (GUILayout.Button("Raise")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _event.Raise(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-05-10 21:27:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if (Application.isPlaying && GUILayout.Button("Ping Listeners")) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 _event.EDITOR_PingNextListener(); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-02-23 09:52:00 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     #endif   | 
					
						
							|  |  |  |     #endregion | 
					
						
							|  |  |  | } |