TH1/Unity/Assets/Scripts/TH1_Logic/Map/MapInteraction.cs
2025-09-22 13:30:07 +08:00

195 lines
8.4 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 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);
}
}
}
}