/* * @Author: 白哉 * @Description: 地图交互逻辑 * @Date: 2025年04月01日 星期二 11:04:00 * @Modify: */ using Logic.Action; using Logic.Audio; using UnityEngine; using RuntimeData; using TH1_Core.Managers; using TH1_Logic.Core; using TH1Renderer; using UI; namespace Logic { public class MapInteraction { //private MapData _mapData; private Main _main; private MapData _mapData; //public MapRenderer mapRenderer; // 关联到 Tilemap //public UIManager uiManager; public MapInteraction(Main main,MapData mapData) { _main = main; _mapData = mapData; } public void CancelAllHighlight() //专门用来应对BottomInfoUI的CloseButton的函数,点击close的时候先调用这个函数通知interaction处理好信息,再关闭bottominfo { foreach (var gridData in Main.MapData.GridMap.GridList) { gridData.CityBorderRenderMark = false; var gridRenderer = MapRenderer.Instance.ROGridMap[gridData.Id]; if (gridRenderer._isPlayingDieHintVFX) gridRenderer.SetStopDieHintVFXAnim(); if (gridRenderer._isPlayingDieHintVFX) gridRenderer.SetStopDieHintVFXAnim(); gridRenderer.SetSelectHighlight(false); gridRenderer.SetMoveHighlight(false); } foreach (var unitData in Main.MapData.UnitMap.UnitList) { if (!MapRenderer.Instance.ROUnitMap.ContainsKey(unitData.Id)) continue; var unitRenderer = MapRenderer.Instance.ROUnitMap[unitData.Id]; unitRenderer.SetSelectHighlight(false); unitRenderer.SetAttackHighlight(false); unitRenderer.SetAllyHighlight(false); } } public void OnTileClicked(MapData mapData,GridData gridData) { AudioManager.Instance.PlayAudio("SFX/UNIT_click",0,0,false); //如果没有视野,播放一个动画后直接return if (!mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(gridData.Id)) { MapRenderer.Instance.ROGridMap[gridData.Id].SetBounceAnim(); MapRenderer.Instance.ROGridMap[gridData.Id].SetFogAnim(); CancelAllHighlight(); UIManager.Instance.BottomInfoUI.SetBottomInfoHide(); return; } bool hasUnit = Main.MapData.GetUnitDataByGid(gridData.Id,out var unitData); //Debug.Log(hasUnit); var roGrid = MapRenderer.Instance.ROGridMap[gridData.Id]; //如果这次点击有unit if (hasUnit) { _mapData.GetPlayerDataByUnitId(unitData.Id, out var player); var tt = _mapData.PlayerMap.SelfPlayerData; var roUnit = MapRenderer.Instance.ROUnitMap[unitData.Id]; //如果是由选择人切为选择地块 if (roUnit.IsSelectHighlight) { //切换相机镜头 MapRenderer.Instance.CameraController.CameraFocusOnGrid(gridData); CancelAllHighlight(); MapRenderer.Instance.ROGridMap[gridData.Id].SetSelectHighlight(true); UIManager.Instance.BottomInfoUI.SetBottomInfoShowGrid(gridData.Id); } //如果是攻击 else if (roUnit.IsAttackHighlight) { CancelAllHighlight(); // 攻击行为切换成 Action 驱动 var attackID = new CommonActionId { ActionType = CommonActionType.UnitAttack }; var attackAction = new UnitAttackAction(attackID); var param = new CommonActionParams(Main.MapData, unitData:MapRenderer.Instance.SelectUnitData, targetUnit:unitData); param.RefreshParams(); attackAction.CompleteExecute(param, false); // Main.UnitLogic.Attack(Main.MapData, MapRenderer.Instance.SelectUnitData, unitData, out _); UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = false; } //如果是Ally else if (roUnit.IsAllyHighlight) { CancelAllHighlight(); Main.UnitLogic.AttackAlly(Main.MapData,MapRenderer.Instance.SelectUnitData, unitData); //Main.UnitLogic.Attack(Main.MapData, MapRenderer.Instance.SelectUnitData, unitData, out _); UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = false; } //如果是选择角色 else if (!roGrid.IsSelectHighlight) { //切换相机镜头 MapRenderer.Instance.CameraController.CameraFocusOnGrid(gridData); CancelAllHighlight(); MapRenderer.Instance.ROUnitMap[unitData.Id].SetSelectHighlight(true); MapRenderer.Instance.ROUnitMap[unitData.Id].SetBounceAnim(); MapRenderer.Instance.SelectUnitData = unitData; UIManager.Instance.BottomInfoUI.SetBottomInfoShowUnit(unitData.Id); UIManager.Instance.BottomInfoUI.UIBottomInfoHideFirst = UIManager.Instance.BottomInfoUI.UIBottomInfoStatus; UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = true; UIManager.Instance.BottomInfoUI.UIBottomInfoIsGrid = false; UIManager.Instance.BottomInfoUI.UIBottomInfoStatusObjectId = unitData.Id; //如果是selfplayer的unit,显示可操作区域 if (Main.UnitLogic.CheckIsSelfPlayer(Main.MapData, unitData.Id)) MapRenderer.Instance.SetUnitAllMoveAttackTargetHighlight(unitData.Id); } //如果是取消选择角色 else { CancelAllHighlight(); UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = false; } } //如果是移动 else if (roGrid.IsMoveHighlight) { CancelAllHighlight(); Main.UnitLogic.MoveTo(Main.MapData, MapRenderer.Instance.SelectUnitData, gridData); //切换相机镜头 MapRenderer.Instance.CameraController.CameraFocusOnGrid(gridData); UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = false; if (MapRenderer.Instance.CheckUnitHasMoveAttackTarget(MapRenderer.Instance.SelectUnitData.Id)) { Timer.Instance.TimerRegister(this, () => { OnTileClicked(mapData,gridData); },Table.Instance.AnimDataAssets.MoveAnimTime,"MapInteraction_OnTileClicked_Move"); } } //如果是地块点击 else if (!roGrid.IsSelectHighlight) { //切换相机镜头 MapRenderer.Instance.CameraController.CameraFocusOnGrid(gridData); CancelAllHighlight(); MapRenderer.Instance.ROGridMap[gridData.Id].SetSelectHighlight(true); if (_mapData.GetCityDataByTerritoryGid(gridData.Id, out var city)) { if(_mapData.GetGridDataByCityId(city.Id,out var gridTmp) && Main.MapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(gridTmp.Id)) MapRenderer.Instance.ROGridMap[gridTmp.Id].SetBounceAnim(); } UIManager.Instance.BottomInfoUI.UIBottomInfoHideFirst = UIManager.Instance.BottomInfoUI.UIBottomInfoStatus; UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = true; UIManager.Instance.BottomInfoUI.UIBottomInfoIsGrid = true; UIManager.Instance.BottomInfoUI.UIBottomInfoStatusObjectId = gridData.Id; } //如果是取消地块点击 else { CancelAllHighlight(); UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = false; } } public void CheckContinuousAction(MapData mapData,PlayerData player1,UnitData unit1,GridData grid2) { if (player1.Id == mapData.PlayerMap.SelfPlayerId && MapRenderer.Instance.CheckUnitHasMoveAttackTarget(unit1.Id)) { var grid = unit1.Grid(mapData); if(grid != null) _main.MapInteractionLogic.OnTileClicked(mapData,grid); } } } }