using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using asap.core; using GameCore; using cfg; using UniRx; namespace game { public class WashingGameRemove : WashingGameBase { [Tooltip("弹跳距离。如:清理藤壶游戏中,清理藤壶后,藤壶向上方弹跳的距离,然后消失。安装座椅游戏中,新座椅从上方弹跳距离移动到椅子的位置。")] public float m_BouncingDistance = 0.2f; [Tooltip("弹跳时间。")] public float m_BouncingTime = 0.1f; [Tooltip("被操作的物品。如:清理藤壶游戏中的藤壶等。")] public List m_OperatedItems = new List(); [Tooltip("操作区。如:清理藤壶游戏,铲子铲藤壶时,需要移动到的位置。")] public List m_OperationAreas = new List(); #region 页面功能 private EventWashingPanel panel; private void InitPanel() { panel.SetDataManager(m_DataManager); if (m_DataManager.WashingData.IsAllGameOver == true) { panel.ShowForAllGameOver(); // 设置关闭按钮 panel.SetBtnCloseClickListener(OnBtnCloseClickListener); return; } panel.ShowForRemove(); // 设置预览按钮 panel.SetBtnPreviewClickListener(null); // 设置关闭按钮 panel.SetBtnCloseClickListener(OnBtnCloseClickListener); // 关闭笔刷填充进度 panel.ResetBrushChannelCounterFillAndInverse(false, false); m_IsGuiding = panel.InitGuidance(); } private void HideElectricityConsumption() { if (panel == null) return; panel.SetElectricityConsumptionVisible(false); } private void ShowElectricityConsumption() { if (panel == null) return; panel.SetElectricityConsumptionVisible(true); } private void OnBtnCloseClickListener() { // 关闭当前Act GContext.Publish(new UnloadActToNextAct()); } private void UpdatePanelProgress() { if (panel != null) { float progress = OperatedItemProgress; if (progress == 0f) { panel.UpdateSingleProgress(progress); return; } if (m_DataManager != null) { m_DataManager.WashingData.Percent = progress; } panel.UpdateSingleProgress(progress); } } private void SetGestureFollowPosition(Vector2 position) { if (panel == null) return; ShowElectricityConsumption(); //Vector3 worldPosition = Vector3.zero; RectTransformUtility.ScreenPointToWorldPointInRectangle( panel.gestureFollow.transform.GetComponent(), position, UIManager.Instance.UICanvas.worldCamera, out Vector3 worldPosition); panel.SetGestureFollowPosition(worldPosition); } #endregion #region 数据处理 public List OperatedItems { get { return m_OperatedItems; } } public List OperationAreas { get { return m_OperationAreas; } } protected virtual void SyncGameData() { if (m_DataManager == null) return; EventWashingData washingData = m_DataManager.WashingData; bool syncData = false; int count = m_OperatedItems.Count; if (washingData.StepItems.Count == 0 && washingData.Percent == 0f && washingData.IsOver == false) { for (int i = 0; i < count; i++) { washingData.StepItems.Add(0f); } syncData = true; } else { for (int i = 0;i < count; i++) { if (washingData.StepItems.Count == i) { washingData.StepItems.Add(0f); m_OperatedItems[i].SetHaveExecutedTime(0f); m_OperatedItems[i].gameObject.SetActive(true); syncData = true; } else if (washingData.StepItems[i] >= 1f) { m_OperatedItems[i].SetHaveExecutedTime(m_OperatedItems[i].ConsumeTime); //if (!washingData.IsOver) //{ // m_OperatedItems[i].gameObject.SetActive(false); //} m_OperatedItems[i].gameObject.SetActive(false); } else { m_OperatedItems[i].SetHaveExecutedTime(washingData.StepItems[i] * m_OperatedItems[i].ConsumeTime); m_OperatedItems[i].gameObject.SetActive(true); } } } if (syncData) m_DataManager.SyncData(); } protected override void SetEnergyEnough() { base.SetEnergyEnough(); if (panel != null) panel.SetEnergyEnough(); } protected override void SetEnergyShortage() { base.SetEnergyShortage(); if (panel != null) panel.SetEnergyShortage(); } protected void CheckIsOver() { if (OperatedItemProgress >= 0.999f) { if (m_DataManager != null) { m_DataManager.WashingData.Percent = 1f; m_DataManager.WashingData.IsOver = true; m_DataManager.SyncData(); } FishingYachtAct.Publish(new EventWashingConclusionData()); } } #endregion #region 状态相关 /// /// 工具准备工作结束回调 /// /// protected void OperatingToolsReadyAction(OperatingToolsBase operatingToolsBase) { if (m_Tool == null || m_CurOperatedItem == null) return; if (operatingToolsBase.Status == EventWashingActionStatus.Preparing) { if (!IsGameOver() && (HaveEnergy() || ConsumeTokens(1))) { m_Tool.StartExecuting(); m_CurOperatedItem.StartAction(OperatedItemExecuteOverAction); m_Status = EventWashingActionStatus.Executing; } } } /// /// 杂物操作完成回调 /// /// protected virtual void OperatedItemExecuteOverAction(LongPressStuffBase stuffBase) { // 道具飞回展示区 m_Tool.MoveToExhibition(); m_CurOperatedItem.StopAction(); int count = m_OperatedItems.Count; for (int i = 0; i < count; i++) { if (stuffBase == m_OperatedItems[i]) { m_DataManager.WashingData.StepItems[i] = 1f; break; } } m_DataManager.SyncData(); var tmp = m_CurOperatedItem; m_CurOperatedItem.transform.DOMoveY(m_CurOperatedItem.transform.position.y + m_BouncingDistance, m_BouncingTime).SetEase(Ease.OutQuad).OnComplete(() => { tmp.gameObject.SetActive(false); tmp = null; m_Status = EventWashingActionStatus.Ending; if (OperatedItemProgress >= 0.999f) { if (m_DataManager != null) { m_DataManager.WashingData.Percent = 1f; m_DataManager.WashingData.IsOver = true; m_DataManager.SyncData(); } FishingYachtAct.Publish(new EventWashingConclusionData()); } }); } protected void ChangeState2InvalidFromExecuting() { // 停止消耗电量 // 工具停止播放操作动画 // 道具飞回展示区 m_Tool.StopExecuting(); m_Tool.MoveToExhibition(); if (m_CurOperatedItem != null) m_CurOperatedItem.StopAction(); m_Status = EventWashingActionStatus.Invalid; } protected void ChangeState2InvalidFromPreparing() { // 工具停止播放准备动画 // 道具飞回展示区 m_Tool.StopExecuting(); m_Tool.MoveToExhibition(); if (m_CurOperatedItem != null) m_CurOperatedItem.StopAction(); m_Status = EventWashingActionStatus.Invalid; } protected void ChangeState2Invalid() { if (m_Tool != null && m_Tool.Status != EventWashingActionStatus.Invalid) { m_Tool.StopExecuting(); m_Tool.MoveToExhibition(); } if (m_CurOperatedItem != null) m_CurOperatedItem.StopAction(); m_Status = EventWashingActionStatus.Invalid; } #endregion #region 长按操作杂物相关 protected LongPressStuffBase m_CurOperatedItem = null; /// /// 设置被操作物品已消耗时间 /// /// public void SetOperatedItemHaveExecutedTime(int index, float time) { int count = m_OperatedItems.Count; if (index < 0 || index >= count) return; for (int i = 0; i < index; i++) { m_OperatedItems[i].SetOver(); } m_OperatedItems[index].SetHaveExecutedTime(time); for (int i = 0; i < count; i++) { m_OperatedItems[i].SetHaveExecutedTime(0f); } } /// /// 当前被操作物品进度 /// public float OperatedItemProgress { get { float total = 0f; float cumulativeTime = 0f; int count = m_OperatedItems.Count; EventWashingData washingData = null; if (m_DataManager != null) washingData = m_DataManager.WashingData; for (int i = 0; i < count; ++i) { var item = m_OperatedItems[i]; total += item.ConsumeTime; cumulativeTime += item.CumulativeConsumeTime; if (washingData != null) washingData.StepItems[i] = item.CumulativeConsumeTime / item.ConsumeTime; } return cumulativeTime / total; } } protected void StopAllItemAction() { int count = m_OperatedItems.Count; for (int i = 0; i < count; i++) { m_OperatedItems[i].StopAction(); } } #endregion #region 事件 private void InitEvent() { this.Subscribe(StartConclusion); this.Subscribe(StepOver); this.Subscribe(AllGameOver); this.Subscribe(UpdateBatteryInfo); this.Subscribe(ToolEnter1stStage); this.Subscribe(ToolExit1stStage); this.Subscribe(ToolEnter2ndStage); this.Subscribe(ToolExit2ndStage); GContext.OnEvent().Subscribe(GuideListener).AddTo(this.disposables); } private void GuideListener(AddIndexEvent addIndexEvent) { if (addIndexEvent.CompleteGuide == true && panel != null) { panel.CompleteGuidance(); m_IsGuiding = false; } } private void ToolEnter1stStage(EventWashingToolEnter1stStageData data) { if (m_Tool == null) return; m_Tool.Enter1stStage(); } private void ToolExit1stStage(EventWashingToolExit1stStageData data) { if (m_Tool == null) return; m_Tool.Exit1stStage(); } private void ToolEnter2ndStage(EventWashingToolEnter2ndStageData data) { if (m_Tool == null) return; m_Tool.Enter2ndStage(); } private void ToolExit2ndStage(EventWashingToolExit2ndStageData data) { if (m_Tool == null) return; m_Tool.Exit2ndStage(); } private bool m_IsUpdateBatteryInfo = true; private void UpdateBatteryInfo(EventWashingTokenUpdateData data) { if (panel != null && m_IsUpdateBatteryInfo == true) { panel.SetBatteryInfo(); } } protected virtual void StartConclusion(EventWashingConclusionData data) { panel.StartConclusion(); } private void StepOver(EventWashingStepOverData data) { m_IsUpdateBatteryInfo = false; GameOver(); FishingYachtAct.Publish(new EventWashingGameOverData()); } private void AllGameOver(EventWashingAllGameOverData data) { if (panel != null) { panel.ShowForAllGameOver(); } } #endregion #region 生命周期 public override void InitGame(string name) { base.InitGame(name); int count = m_OperatedItems.Count; for (int i = 0; i < count; i++) { m_OperatedItems[i].InitStuff(); } m_IsGuiding = true; } public async override void EnterGame() { base.EnterGame(); m_IsUpdateBatteryInfo = true; // 打开页面(UI) GameObject pannelObj = await UIManager.Instance.ShowUI(UITypes.EventWashingPanel); panel = pannelObj.transform.GetComponent(); InitPanel(); InitEvent(); AfterEnterGame(); CheckIsOver(); } protected override void Update() { base.Update(); UpdatePanelProgress(); if (m_IsGuiding == true) return; //bool showPowerConsumption = false; Vector2 screenPosition = Vector2.zero; if (m_OperatedItems != null && m_Tool != null) { if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0)) { screenPosition = new Vector2(Input.mousePosition.x, Input.mousePosition.y); Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit)) { bool needChange = false; if (m_CurOperatedItem != null) { if (hit.transform != m_CurOperatedItem.transform) needChange = true; } else { needChange = true; } if (needChange) { if (m_Status == EventWashingActionStatus.Executing) { ChangeState2InvalidFromExecuting(); } else if (m_Status == EventWashingActionStatus.Preparing) { ChangeState2InvalidFromPreparing(); } m_CurOperatedItem = null; int count = m_OperatedItems.Count; for (int i = 0; i < count; i++) { if (hit.transform == m_OperatedItems[i].transform) { m_CurOperatedItem = m_OperatedItems[i]; if (!m_CurOperatedItem.IsOver()) { m_Tool.PrepareAction(m_OperationAreas[i].transform, OperatingToolsReadyAction); m_Status = EventWashingActionStatus.Preparing; } } } } //if (m_CurOperatedItem != null) //{ // if (hit.transform == m_CurOperatedItem.transform) // showPowerConsumption = true; //} } } else { if (m_Status == EventWashingActionStatus.Executing) { ChangeState2InvalidFromExecuting(); } else if (m_Status == EventWashingActionStatus.Preparing) { ChangeState2InvalidFromPreparing(); } else { ChangeState2Invalid(); } m_CurOperatedItem = null; } } //if (showPowerConsumption) //{ // SetGestureFollowPosition(screenPosition); //} //else //{ // // 隐藏电量消耗 // HideElectricityConsumption(); //} } protected override void PauseGame() { base.PauseGame(); StopAllItemAction(); } public override void SyncData() { SyncGameData(); base.SyncData(); } #endregion } }