TH1/Unity/Assets/Scripts/TH1_Logic/Map/MapInteraction.cs

243 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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() { });
}
}
}
}