using UnityEngine; using UnityEngine.UI; using System; using System.Collections; using System.Collections.Generic; using UltraCombos; namespace uc { public class ActivityManager : MonoBehaviour { [Header("General")] public Activity initialActivity; Stack activity_history = new Stack(); public virtual Activity current_activity { get { return (activity_history.Count > 0) ? activity_history.Peek() : null; } } public bool isIdleMode = false; protected const string module = "Activity Manager"; void Start() { PushActivity(initialActivity); Misc.Verbose(module, string.Format("init with activity: {0}", current_activity.name)); } void Update() { CheckIdle(); } protected void CheckIdle() { if (current_activity != null && isIdleMode) { if (current_activity.isIdle) PopToInitial(); } } #region PUSH public virtual void PushActivity(Activity newActivity) { if (newActivity == null) return; if (current_activity != null) { current_activity.Leave(); } activity_history.Push(Clone(newActivity)); current_activity.Enter(); } #endregion #region POP public virtual void PopToActivity(Activity targetActivity) { if (targetActivity != null) { while (current_activity.source != targetActivity && activity_history.Count > 1) { current_activity.Killed(); activity_history.Pop(); } } else { if (activity_history.Count > 1) { current_activity.Killed(); activity_history.Pop(); } } current_activity.Enter(); } public virtual void PopActivity() { PopToActivity(null); } public virtual void PopToInitial() { PopToActivity(initialActivity); } #endregion Activity Clone(Activity newActivity) { var obj = Instantiate(newActivity.gameObject); obj.transform.SetParent(transform, false); Activity act = obj.GetComponent(); act.source = newActivity; return act; } } }