428 lines
16 KiB
C#
428 lines
16 KiB
C#
using System;
|
|
using BehaviorDesigner.Runtime.Tasks;
|
|
using Cysharp.Threading.Tasks;
|
|
using Framework;
|
|
using Gameplay.Area;
|
|
using Gameplay.Character;
|
|
using Gameplay.Guide;
|
|
using Gameplay.PostProcess.BlackArea;
|
|
using Gameplay.Unit;
|
|
using Gameplay.Unit.Data;
|
|
using Gameplay.Vehicle;
|
|
using Gameplay.Vehicle.Impl;
|
|
using PhxhSDK;
|
|
using TGS;
|
|
using UnityEngine;
|
|
using Constants = Framework.Constants;
|
|
|
|
namespace Gameplay.Level
|
|
{
|
|
public class PrepareState : LevelBaseState
|
|
{
|
|
protected override void _OnEnter()
|
|
{
|
|
// 设置为手动更新
|
|
Physics.simulationMode = SimulationMode.Script;
|
|
Physics2D.simulationMode = SimulationMode2D.Script;
|
|
|
|
// 更新地面
|
|
Physics.SyncTransforms();
|
|
EventManager.Instance.Register(EventManager.EventName.ToFightModelDragEnd, (Action<Vector2>)_OnModelDragEnd);
|
|
|
|
var cameraInfo = _level.Map.MapData.cameraMarginInfo;
|
|
CameraManager.Instance.MainCamera.GetComponent<CameraController>().rightMargin = cameraInfo.rightMarginInPre;
|
|
CameraManager.Instance.MainCamera.GetComponent<CameraController>().leftMargin = cameraInfo.leftMarginInPre;
|
|
CameraManager.Instance.MainCamera.GetComponent<CameraController>().topMargin = cameraInfo.topMarginInInPre;
|
|
CameraManager.Instance.MainCamera.GetComponent<CameraController>().bottomMargin = cameraInfo.bottomMarginInPre;
|
|
|
|
CameraManager.Instance.MainCamera.GetComponent<CameraController>().AdjustSelf();
|
|
}
|
|
|
|
protected override void _OnUpdate(float deltaTime)
|
|
{
|
|
BlackAreaManager.instance.AutoLightUpReadyArea();
|
|
BlackAreaManager.instance.LogicUpdate(deltaTime);
|
|
}
|
|
|
|
protected override void _OnExit()
|
|
{
|
|
EventManager.Instance.Unregister(EventManager.EventName.ToFightModelDragEnd, (Action<Vector2>)_OnModelDragEnd);
|
|
}
|
|
|
|
protected override void _OnClick(Vector2 screenPosition)
|
|
{
|
|
var clickCellIndex = GroundHitHelper.CalcHitCellIndex(screenPosition, _level.Map.TerrainGridSystem);
|
|
if (clickCellIndex < 0)
|
|
{
|
|
if (GuideManager.Instance.IsGuiding && GuideManager.Instance.IsControlFloor)
|
|
return;
|
|
|
|
_SendDragCancelEvent();
|
|
return;
|
|
}
|
|
|
|
CheckCellClick(_level.Map.TerrainGridSystem, clickCellIndex, 0);
|
|
}
|
|
|
|
protected override void _OnCellClick(TerrainGridSystem tgs,
|
|
int cellIndex,
|
|
int buttonIndex)
|
|
{
|
|
if (InputManager.Instance.HandledThisFrame())
|
|
{
|
|
_SendDragCancelEvent();
|
|
return;
|
|
}
|
|
var map = _level.Map;
|
|
if (map == null)
|
|
{
|
|
_SendDragCancelEvent();
|
|
return;
|
|
}
|
|
|
|
// 不是准备区域
|
|
if (!AreaManager.instance.readyAreaManager.CheckIsInReadyArea(cellIndex))
|
|
{
|
|
_SendDragCancelEvent();
|
|
return;
|
|
}
|
|
|
|
// 如果UI没有选中角色
|
|
if (!ValueValidator.IsIdValid(TeamManager.Instance.SelectID))
|
|
{
|
|
_SendDragCancelEvent();
|
|
_HandleUIHasNoSelect(cellIndex);
|
|
return;
|
|
}
|
|
|
|
// 如果UI有选中角色
|
|
if (ValueValidator.IsIdValid(TeamManager.Instance.SelectID))
|
|
{
|
|
_HandleUIHasSelect(cellIndex, map);
|
|
}
|
|
|
|
}
|
|
private void _HandleUIHasSelect(int cellIndex,
|
|
Map map)
|
|
{
|
|
var unitType = TeamManager.Instance.GetUnitType(TeamManager.Instance.SelectID);
|
|
var crossLevel = 0;
|
|
switch (unitType)
|
|
{
|
|
case SingleTeamCharacterInfo.CharacType.Hero:
|
|
var characterDataInfo = TeamManager.Instance.GetCharacterDataInfo(TeamManager.Instance.SelectID)
|
|
.GetConfigInfo();
|
|
crossLevel = characterDataInfo.Cfg.MoveCrossLevel;
|
|
break;
|
|
case SingleTeamCharacterInfo.CharacType.Vehicle:
|
|
var vehicleInfo = TeamManager.Instance.GetCharacterDataInfo(TeamManager.Instance.SelectID)
|
|
.GetVehicleInfo();
|
|
crossLevel = vehicleInfo.Cfg.MoveCrossLevel;
|
|
break;
|
|
default:
|
|
DebugUtil.LogError("暂未处理的类型:{0}", unitType);
|
|
return;
|
|
}
|
|
|
|
// 检查通行级别是否可以放置
|
|
var blockData = map.GetBlockData(cellIndex);
|
|
if (!MapUtils.CanPass(crossLevel, blockData.GetTerrainTypeProperty()))
|
|
{
|
|
_SendDragCancelEvent();
|
|
return;
|
|
}
|
|
|
|
var worldPosition = map.TerrainGridSystem.CellGetPosition(cellIndex);
|
|
|
|
var blockIndex = map.TGSCellIndex2BlockIndex(cellIndex);
|
|
|
|
var characterIDHere = Constants.INVALID_UINT_ID;
|
|
bool teamSelectCharacterExist = false;
|
|
var unitList = GameUnitManager.instance.infightUnits;
|
|
for (int i = 0; i < unitList.count; i++)
|
|
{
|
|
var unit = unitList.GetByIndex(i);
|
|
if (unit.transData.cellIndex == cellIndex)
|
|
{
|
|
characterIDHere = unit.GetID();
|
|
}
|
|
|
|
if (unit.GetID() == TeamManager.Instance.SelectID)
|
|
{
|
|
teamSelectCharacterExist = true;
|
|
}
|
|
}
|
|
|
|
_OnHit(teamSelectCharacterExist, characterIDHere, worldPosition);
|
|
_SendDragSuccess();
|
|
}
|
|
private void _HandleUIHasNoSelect(int cellIndex)
|
|
{
|
|
|
|
GameUnit clickUnit = null;
|
|
|
|
//bool teamSelectCharacterExist = false;
|
|
var unitList = GameUnitManager.instance.infightUnits;
|
|
for (int i = 0; i < unitList.count; i++)
|
|
{
|
|
var unit = unitList.GetByIndex(i);
|
|
if (unit.transData.cellIndex == cellIndex)
|
|
{
|
|
clickUnit = unit;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 如果点中了已有角色
|
|
if (clickUnit != null)
|
|
{
|
|
var worldPosition =
|
|
_level.Map.TGSCellIndex2WorldPosition(clickUnit.transData.cellIndex);
|
|
_OnHit(false, clickUnit.GetID(), worldPosition);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private async void _OnHit(bool teamSelectCharacterExist,
|
|
uint characterIDHere,
|
|
Vector3 worldPosition)
|
|
{
|
|
var yaw = LevelUtils.SetCharaterToward(_level.GetLevelData().preparingRegionToward);
|
|
if (teamSelectCharacterExist)
|
|
{
|
|
if (TeamManager.Instance.SelectID == characterIDHere)
|
|
{
|
|
var unit = GameUnitManager.instance.totalUnits.Search(characterIDHere);
|
|
// 下阵
|
|
switch (unit.gameunitType)
|
|
{
|
|
case EGameUnitType.Character:
|
|
GameUnitManager.instance.MoveUnitToPrepare(characterIDHere);
|
|
break;
|
|
case EGameUnitType.Vehicle:
|
|
GameUnitManager.instance.MoveUnitToPrepare(characterIDHere);
|
|
break;
|
|
default:
|
|
DebugUtil.LogError("暂未处理的类型:{0}", unit.gameunitType);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// 交换位置
|
|
var unitHere =characterIDHere == 0 ? null : GameUnitManager.instance.totalUnits.Search(characterIDHere);
|
|
var selectUnit = GameUnitManager.instance.totalUnits.Search(TeamManager.Instance.SelectID);
|
|
|
|
if (unitHere != null && selectUnit != null)
|
|
{
|
|
_SetAnother(unitHere, selectUnit);
|
|
}
|
|
if (selectUnit != null)
|
|
{
|
|
_SetSelf(selectUnit, worldPosition, yaw);
|
|
}
|
|
|
|
if (TeamManager.IsHideAllUI)
|
|
{
|
|
TeamManager.IsHideAllUI = false;
|
|
TeamManager.Instance.CloseFightPosterUI();
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (ValueValidator.IsIdValid(TeamManager.Instance.SelectID))
|
|
{
|
|
// 创建单位
|
|
if (ValueValidator.IsIdValid(characterIDHere))
|
|
{
|
|
TeamManager.Instance.SetIsChanging(true);
|
|
var oldUnit = GameUnitManager.instance.totalUnits.Search(characterIDHere);
|
|
switch (oldUnit.gameunitType)
|
|
{
|
|
case EGameUnitType.Character:
|
|
GameUnitManager.instance.MoveUnitToPrepare(characterIDHere);
|
|
break;
|
|
case EGameUnitType.Vehicle:
|
|
GameUnitManager.instance.MoveUnitToPrepare(characterIDHere);
|
|
break;
|
|
default:
|
|
DebugUtil.LogError("暂未处理的类型:{0}", oldUnit.gameunitType);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (TeamManager.Instance.IsFightListLimit(TeamManager.Instance.SelectID))
|
|
{
|
|
//TODO chenyq 需要添加到stringconfig
|
|
UITipsManager.ShowTips("上阵人数达到上限!");
|
|
_SendDragCancelEvent();
|
|
LevelManager.Instance.CurrentLevel.UnSelectUnit();
|
|
TeamManager.Instance.SetSelectID();
|
|
return;
|
|
}
|
|
}
|
|
|
|
var unitType = TeamManager.Instance.GetUnitType(TeamManager.Instance.SelectID);
|
|
|
|
switch (unitType)
|
|
{
|
|
case SingleTeamCharacterInfo.CharacType.Hero:
|
|
await _CreateCharacter(TeamManager.Instance.SelectID, worldPosition, yaw);
|
|
break;
|
|
case SingleTeamCharacterInfo.CharacType.Vehicle:
|
|
await _CreateVehicle(TeamManager.Instance.SelectID, worldPosition, yaw);
|
|
break;
|
|
}
|
|
|
|
_level.SelectUnit(TeamManager.Instance.SelectID);
|
|
}
|
|
else
|
|
{
|
|
// 选中单位
|
|
if (ValueValidator.IsIdValid(characterIDHere))
|
|
{
|
|
_level.SelectUnit(characterIDHere);
|
|
if (!TeamManager.IsHideAllUI)
|
|
{
|
|
TeamManager.IsHideAllUI = true;
|
|
TeamManager.Instance.OpenFightPosterUI(characterIDHere);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static async void _SetSelf(GameUnit selectedCharacter,
|
|
Vector3 worldPosition,
|
|
float yaw)
|
|
{
|
|
var renders = selectedCharacter.Node.GameObject.GetComponentsInChildren<Renderer>();
|
|
for (var i = 0; i < renders.Length; ++i)
|
|
{
|
|
renders[i].enabled = false;
|
|
OutlineManager.instance.RemoveRenderer(renders[i], false);
|
|
}
|
|
|
|
// selectedCharacter.Node.SetActive(false);
|
|
selectedCharacter.transData.pos = worldPosition;
|
|
selectedCharacter.transData.yaw = yaw;
|
|
selectedCharacter.Node.transform.position = worldPosition;
|
|
selectedCharacter.Node.transform.eulerAngles = new Vector3(0, yaw, 0);
|
|
|
|
await UniTask.Delay(50);
|
|
|
|
for (var i = 0; i < renders.Length; ++i)
|
|
{
|
|
renders[i].enabled = true;
|
|
OutlineManager.instance.AddRenderer(renders[i], false);
|
|
}
|
|
selectedCharacter.Node.IsActive = true;
|
|
}
|
|
|
|
private static async void _SetAnother(GameUnit characterHere,
|
|
GameUnit selectedCharacter)
|
|
{
|
|
// characterHere.Node.SetActive(false);
|
|
var renders = characterHere.Node.GameObject.GetComponentsInChildren<Renderer>();
|
|
for (var i = 0; i < renders.Length; ++i)
|
|
{
|
|
renders[i].enabled = false;
|
|
OutlineManager.instance.RemoveRenderer(renders[i], false);
|
|
}
|
|
|
|
characterHere.transData.pos = selectedCharacter.transData.pos;
|
|
characterHere.Node.GameObject.transform.position = selectedCharacter.transData.pos;
|
|
|
|
await UniTask.Delay(50);
|
|
|
|
for (var i = 0; i < renders.Length; ++i)
|
|
{
|
|
renders[i].enabled = true;
|
|
OutlineManager.instance.AddRenderer(renders[i], false);
|
|
}
|
|
// characterHere.Node.SetActive(true);
|
|
}
|
|
|
|
private async UniTask _CreateVehicle(uint id,
|
|
Vector3 pos,
|
|
float yaw)
|
|
{
|
|
// var vInfo = VehicleCultivateDataManager.Instance.GetVehicleCultivateData(id);
|
|
// var vehicle = await GameUnitManager.instance.PrepareVehicle(vInfo, ETroopsId.Self);
|
|
// if (vehicle == null)
|
|
// {
|
|
// DebugUtil.LogError("创建载具失败");
|
|
// return;
|
|
// }
|
|
if (!_level.Map.WorldPosition2TGSCellIndex(pos, out var cellIndex))
|
|
{
|
|
DebugUtil.LogError("无法获取到cellIndex: {0}", pos);
|
|
return;
|
|
}
|
|
var vehicle = GameUnitManager.instance.totalUnits.Search(id);
|
|
GameUnitManager.instance.MoveUnitToFight(vehicle.GetID(), cellIndex, yaw);
|
|
}
|
|
|
|
private async UniTask _CreateCharacter(uint id,
|
|
Vector3 position,
|
|
float yaw)
|
|
{
|
|
var map = _level.Map;
|
|
if (map == null) return;
|
|
|
|
// var characterInfo = CharacterDataInfoManager.Instance.GetCharacterInfo(TeamManager.Instance.SelectID);
|
|
// if (characterInfo == null)
|
|
// {
|
|
// return;
|
|
// }
|
|
|
|
//var character = await GameUnitManager.instance.PrepareCharacter(characterInfo, ETroopsId.Self);
|
|
// if (character == null)
|
|
// {
|
|
// DebugUtil.LogError("创建角色失败");
|
|
// return;
|
|
// }
|
|
if (!map.WorldPosition2TGSCellIndex(position, out var cellIndex))
|
|
{
|
|
DebugUtil.LogError("无法获取到cellIndex: {0}", position);
|
|
return;
|
|
}
|
|
|
|
var character = GameUnitManager.instance.totalUnits.Search(id);
|
|
GameUnitManager.instance.MoveUnitToFight(character.GetID(), cellIndex, yaw);
|
|
}
|
|
|
|
private void _OnModelDragEnd(Vector2 screenPos)
|
|
{
|
|
_OnClick(screenPos);
|
|
}
|
|
|
|
private void _SendDragCancelEvent()
|
|
{
|
|
if (TeamManager.IsHideAllUI)
|
|
{
|
|
TeamManager.IsHideAllUI = false;
|
|
TeamManager.Instance.CloseFightPosterUI();
|
|
}
|
|
EventManager.Instance.Send(EventManager.EventName.ToFightModelDragSuc, false);
|
|
}
|
|
|
|
private void _SendDragSuccess()
|
|
{
|
|
if (TeamManager.IsHideAllUI)
|
|
{
|
|
TeamManager.IsHideAllUI = false;
|
|
TeamManager.Instance.CloseFightPosterUI();
|
|
}
|
|
EventManager.Instance.Send(EventManager.EventName.ToFightModelDragSuc, true);
|
|
}
|
|
|
|
public PrepareState(Level level) : base(level)
|
|
{
|
|
}
|
|
}
|
|
}
|