195 lines
8.4 KiB
C#
195 lines
8.4 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description: 地图交互逻辑
|
||
* @Date: 2025年04月01日 星期二 11:04:00
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
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();
|
||
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,MoveType.ActiveMove);
|
||
//切换相机镜头
|
||
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);
|
||
}
|
||
}
|
||
}
|
||
}
|