主要技术:泛型单例模式,观察者模式,接口,游戏管理器
Singleton 泛型单例模式
单例模式:Manager变量需要实例化才能使用,使用单例模式所有 Manager 变量都可以做 T ,不需要在每个Manager脚本里面实例化
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
| # Singleton
public class Singleton<T> : MonoBehaviour where T:Singleton<T> { private static T instance;
public static T Instance { get { return instance; } }
protected virtual void Awake() { if (instance != null) Destroy(gameObject); else instance = (T)this; }
public static bool IsInitialized { get { return instance != null; } }
protected virtual void OnDestory() { if (instance == this) { instance = null; } } }
|
1 2 3 4 5 6 7 8 9 10 11
| # MouseManager public class MouseManager : Singleton<MouseManager> {
protected override void Awake() { base.Awake(); } }
|
1 2 3 4 5 6 7 8 9 10
| # GameManager public class GameManager : Singleton<GameManager> { public CharacterStates playStats;
public void RigisterPlay(CharacterStates player) { playStats = player; } }
|
- 在 PlayerController 注册 GameManager
1 2 3 4 5 6 7
| # PlayerController void Start() { GameManager.Instance.RigisterPlay(characterStates); }
|
Observer Pattern 接口实现观察者模式订阅广播
1 2 3 4 5 6
| # IEndGameObserver public interface IEndGameObserver { void EndNotify(); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| # EnemyController public class EnemyController : MonoBehaviour, IEndGameObserver { public void EndNotify() { anim.SetBool("Win", true); playDead = true; isChase = false; isWalk = false; attackTarget = null; } }
|
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
| # GameManager public class GameManager : Singleton<GameManager> { public CharacterStates playStats;
List<IEndGameObserver> endGameObservers = new List<IEndGameObserver>(); public void RigisterPlay(CharacterStates player) { playStats = player; }
public void AddObserver(IEndGameObserver observer) { endGameObservers.Add(observer); }
public void RemoveObserver(IEndGameObserver observer) { endGameObservers.Remove(observer); }
public void NotifyObserver() { foreach(var observer in endGameObservers) { observer.EndNotify(); } } }
|
1 2 3 4 5 6 7 8 9 10 11 12
| # EnemyController void OnEnable() { GameManager.Instance.AddObserver(this); } void OnDisable() { if (!GameManager.IsInitialized) return; GameManager.Instance.RemoveObserver(this); }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # PlayerController public class PlayerController : MonoBehaviour { void Update() { isDead = characterStates.CurrentHealth == 0;
if (isDead) { GameManager.Instance.NotifyObserver(); } } }
|