using System.Collections.Generic; using System.Linq; using AibisDream.Framework; using UnityEngine; using Yarn.Unity; namespace AibisDream.FixSystem { [RequireComponent(typeof(BodyModuleSystem))] public class WhackMoleSystem : MonoBehaviour { private BodyModuleSystem _bodyModuleSystem; private WhackMoleHandler _handler; private WhackMoleLog _log; private Dictionary _moleModules; private void Awake() { _bodyModuleSystem = GetComponent(); FixSystemCenter.SystemDic.Register(this); _log = GetComponentInChildren(); } #region 打地鼠游戏流程控制 public void StartWhack(WhackMoleData levelData) { _handler = WhackMoleHandler.Create(levelData, this); _handler.OnGameEnd += OnWhackEnd; // 获取当前所有模块 _moleModules = _bodyModuleSystem.BodyModules.ToDictionary(item => item.data.moduleName, item => item as MoleModule); _moleModules.Values.ToList().ForEach(item => item.isInMoleGame = true); _log.Init(); _handler.StartGame(); } private void OnWhackEnd(bool isSuccess) { _moleModules.Values.ToList().ForEach(item => item.isInMoleGame = false); // TODO 触发游戏结束 _log.OnGameEnd(isSuccess); DialogController.Instance.StartDialogNode(isSuccess ? "打地鼠游戏通过" : "打地鼠游戏失败"); } public void OnPlugIn(string moduleName) { _handler?.OnPlugIn(moduleName); } public void OnPlugOut(string moduleName) { _handler?.OnPlugOut(moduleName); } #endregion #region 效果相关, 控制BodyModuleSystem实现 public void StartAllFlicker() { foreach (var module in _moleModules.Values) { module.StartFlicker(); } } public void StopAllFlicker() { foreach (var module in _moleModules.Values) { module.StopFlicker(); } } public void LightOnModule(string moduleName) { if (_moleModules.TryGetValue(moduleName, out var moleModule)) { moleModule.LightOn(Color.red); } else { Debug.LogError($"没有找到模块:{moduleName}"); } } public void LightOffModule(string moduleName) { if (_moleModules.TryGetValue(moduleName, out var moleModule)) { moleModule.LightOff(); } else { Debug.LogError($"没有找到模块:{moduleName}"); } } #endregion } public static class WholeMoleCommand { private static WhackMoleSystem WhackMoleSystem => FixSystemCenter.SystemDic.Get(); [YarnCommand("start_whack_game")] public static void StartWhack(string levelName) { var levelData = ResourceKit.LoadAssetSync($"WhackMoleData/{levelName}.asset"); WhackMoleSystem.StartWhack(levelData); } } }