243 lines
12 KiB
C#
243 lines
12 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description: 地图交互逻辑
|
||
* @Date: 2025年04月01日 星期二 11:04:00
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
using System.Runtime.InteropServices;
|
||
using Logic.Action;
|
||
using Logic.Audio;
|
||
using UnityEngine;
|
||
using RuntimeData;
|
||
using TH1_Anim.UnitAtomAnim;
|
||
using TH1_Core.Events;
|
||
using TH1_Core.Managers;
|
||
using TH1_Logic.Core;
|
||
using TH1_Presentation.Sequencer.Task;
|
||
using TH1_Renderer;
|
||
using TH1_Renderer.UnitAtomAnim;
|
||
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];
|
||
gridRenderer.GridVFXManager.SetStop(GridVFXType.DieHint);
|
||
gridRenderer.GridVFXManager.SetStop(GridVFXType.CounterDieHint);
|
||
|
||
gridRenderer.SetSelectHighlight(false);
|
||
gridRenderer.SetMoveHighlight(false);
|
||
gridRenderer.SetAttackHighlight(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)
|
||
{
|
||
MapRecordManager.Instance.RecordGridData = gridData;
|
||
AudioManager.Instance.PlayAudio("SFX/UNIT_click",0,0,false);
|
||
|
||
//如果当前是AI正在进行,我方不可点击格子操作,格子不会相应
|
||
if (mapData.CurPlayer != mapData.PlayerMap.SelfPlayerData) return;
|
||
//如果没有视野,播放一个动画后直接return
|
||
if (!mapData.PlayerMap.SelfPlayerData.Sight.CheckIsInSight(gridData.Id))
|
||
{
|
||
MapRenderer.Instance.ROGridMap[gridData.Id].SetBounceAnim();
|
||
MapRenderer.Instance.ROGridMap[gridData.Id].PlayVFX(new GridVFXParams(GridVFXType.Fog));
|
||
CancelAllHighlight();
|
||
//UIManager.Instance.BottomInfoUI.SetBottomInfoHide();
|
||
Debug.Log("pos 1 trigger");
|
||
EventManager.Publish(new HideUIInfoGridInfo() { });
|
||
return;
|
||
}
|
||
|
||
bool hasUnit = Main.MapData.GetUnitDataByGid(gridData.Id,out var unitData);
|
||
|
||
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);
|
||
EventManager.Publish(new ShowUIInfoGridInfo() {type = UIGridInfoType.grid,id = 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, playerData:Main.MapData.PlayerMap.SelfPlayerData,unitData:MapRenderer.Instance.SelectUnitData, targetUnit:unitData);
|
||
param.RefreshParams();
|
||
attackAction.CompleteExecute(param);
|
||
Debug.Log("pos 2 trigger");
|
||
EventManager.Publish(new HideUIInfoGridInfo() { });
|
||
|
||
|
||
//攻击后判定是否连续行动
|
||
if (MapRenderer.Instance.CheckUnitHasMoveAttackTarget(MapRenderer.Instance.SelectUnitData.Id))
|
||
PresentationManager.EnqueueTask(new InputSequencerTask(MapRenderer.Instance.SelectUnitData.Grid(Main.MapData)));
|
||
|
||
}
|
||
//如果是Ally
|
||
else if (roUnit.IsAllyHighlight)
|
||
{
|
||
CancelAllHighlight();
|
||
|
||
|
||
var attackAllyID = new CommonActionId { ActionType = CommonActionType.UnitAttackAlly };
|
||
var attackAllyAction = new UnitAttackAllyAction(attackAllyID);
|
||
var param = new CommonActionParams(Main.MapData, playerData:Main.MapData.PlayerMap.SelfPlayerData,unitData:MapRenderer.Instance.SelectUnitData, targetUnit:unitData);
|
||
param.RefreshParams();
|
||
attackAllyAction.CompleteExecute(param);
|
||
|
||
//Main.UnitLogic.AttackAlly(Main.MapData,MapRenderer.Instance.SelectUnitData, unitData);
|
||
//UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = false;
|
||
Debug.Log("pos 3 trigger");
|
||
EventManager.Publish(new HideUIInfoGridInfo() { });
|
||
|
||
//攻击后判定是否连续行动
|
||
if (MapRenderer.Instance.CheckUnitHasMoveAttackTarget(MapRenderer.Instance.SelectUnitData.Id))
|
||
PresentationManager.EnqueueTask(new InputSequencerTask(MapRenderer.Instance.SelectUnitData.Grid(Main.MapData)));
|
||
|
||
}
|
||
//如果是选择角色
|
||
else if (!roGrid.IsSelectHighlight)
|
||
{
|
||
//播放弹动动画
|
||
roUnit.AnimManager.EnqueueAnim(UnitAtomAnimType.Bounce,UnitAtomAnimDataFactory.Create(UnitAtomAnimType.Bounce));
|
||
//切换相机镜头
|
||
MapRenderer.Instance.CameraController.CameraFocusOnGrid(gridData);
|
||
CancelAllHighlight();
|
||
MapRenderer.Instance.ROUnitMap[unitData.Id].SetSelectHighlight(true);
|
||
MapRenderer.Instance.SelectUnitData = unitData;
|
||
EventManager.Publish(new ShowUIInfoGridInfo() {type = UIGridInfoType.unit,id = unitData.Id });
|
||
|
||
// ---------------------------------------------别找了 在这里!!!-----------------------------------------------------------------------------------------------------------------------------------------
|
||
//如果是selfplayer的unit,显示可操作区域
|
||
if (Main.UnitLogic.CheckIsSelfPlayer(Main.MapData, unitData.Id))
|
||
MapRenderer.Instance.SetUnitAllMoveAttackTargetHighlight(unitData.Id);
|
||
|
||
|
||
}
|
||
//如果是取消选择角色
|
||
else
|
||
{
|
||
CancelAllHighlight();
|
||
//UIManager.Instance.BottomInfoUI.UIBottomInfoStatus = false;
|
||
Debug.Log("pos 4 trigger");
|
||
EventManager.Publish(new HideUIInfoGridInfo() { });
|
||
}
|
||
|
||
}
|
||
//如果点击的是地块
|
||
//如果是移动
|
||
else if (roGrid.IsMoveHighlight)
|
||
{
|
||
CancelAllHighlight();
|
||
Main.UnitLogic.MoveTo(Main.MapData,Main.MapData.PlayerMap.SelfPlayerData, MapRenderer.Instance.SelectUnitData, gridData);
|
||
//切换相机镜头
|
||
MapRenderer.Instance.CameraController.CameraFocusOnGrid(gridData);
|
||
Debug.Log("pos 5 trigger");
|
||
EventManager.Publish(new HideUIInfoGridInfo() { });
|
||
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.IsAttackHighlight)
|
||
{
|
||
CancelAllHighlight();
|
||
|
||
|
||
var attackGroundID = new CommonActionId { ActionType = CommonActionType.UnitAttackGround };
|
||
var attackGroundAction = new UnitAttackGroundAction(attackGroundID);
|
||
var param = new CommonActionParams(Main.MapData, playerData:Main.MapData.PlayerMap.SelfPlayerData,unitData:MapRenderer.Instance.SelectUnitData, targetGrid:gridData);
|
||
param.RefreshParams();
|
||
attackGroundAction.CompleteExecute(param);
|
||
Debug.Log("pos 6 trigger");
|
||
EventManager.Publish(new HideUIInfoGridInfo() { });
|
||
|
||
//攻击后判定是否连续行动
|
||
if (MapRenderer.Instance.CheckUnitHasMoveAttackTarget(MapRenderer.Instance.SelectUnitData.Id))
|
||
PresentationManager.EnqueueTask(new InputSequencerTask(MapRenderer.Instance.SelectUnitData.Grid(Main.MapData)));
|
||
}
|
||
//如果是地块点击
|
||
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;
|
||
EventManager.Publish(new ShowUIInfoGridInfo() { type = UIGridInfoType.grid,id = gridData.Id });
|
||
//UIManager.Instance.BottomInfoUI.UIBottomInfoIsGrid = true;
|
||
//UIManager.Instance.BottomInfoUI.UIBottomInfoStatusObjectId = gridData.Id;
|
||
}
|
||
//如果是取消地块点击
|
||
else
|
||
{
|
||
CancelAllHighlight();
|
||
Debug.Log("pos 7 trigger");
|
||
EventManager.Publish(new HideUIInfoGridInfo() { });
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|