NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Level/State/PrepareState.cs

347 lines
12 KiB
C#

using Cysharp.Threading.Tasks;
using Framework;
using Gameplay.Character;
using Gameplay.Character.Utils;
using Gameplay.Common;
using Gameplay.Utils;
using Gameplay.Vehicle;
using Gameplay.Vehicle.Impl;
using TGS;
using UnityEngine;
namespace Gameplay.Level
{
public class PrepareState : LevelBaseState
{
protected override void _OnEnter()
{
// 设置为手动更新
Physics.simulationMode = SimulationMode.Script;
Physics2D.simulationMode = SimulationMode2D.Script;
// 更新地面
Physics.SyncTransforms();
}
protected override void _OnUpdate(float deltaTime)
{
VehicleManager.Inst.PreviewUpdate(deltaTime);
}
protected override void _OnExit()
{
}
protected override void _OnClick(Vector2 screenPosition)
{
var clickCellIndex = GroundHitHelper.CalcHitCellIndex(screenPosition);
if (clickCellIndex < 0)
{
return;
}
_OnCellClick(_level.Map.TerrainGridSystem, clickCellIndex, 0);
}
protected override void _OnCellClick(TerrainGridSystem tgs,
int cellIndex,
int buttonIndex)
{
if (InputManager.Instance.HandledThisFrame())
{
return;
}
var map = _level.Map;
if (map == null)
{
return;
}
// 不是准备区域
if (!_level.IsPreparingRegion(map.TGSCellIndex2BlockPosition(cellIndex)))
{
return;
}
// 如果UI没有选中角色
if (!ValueValidator.IsIdValid(TeamManager.Instance.SelectID))
{
_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(map.TGSCellIndex2BlockPosition(cellIndex));
if (!MapUtils.CanPass(crossLevel, blockData.GetTerrainTypeProperty()))
{
return;
}
var worldPosition = map.TerrainGridSystem.CellGetPosition(cellIndex);
var blockIndex = map.TGSCellIndex2BlockIndex(cellIndex);
var characterIDHere = Constants.INVALID_UINT_ID;
bool teamSelectCharacterExist = false;
var unitList = GameUnitMapper.Inst.unitList;
for (int i = 0; i < unitList.Count; i++)
{
var unit = unitList[i];
if (unit.transData.cellIndex == cellIndex)
{
characterIDHere = unit.GetID();
}
if (unit.GetID() == TeamManager.Instance.SelectID)
{
teamSelectCharacterExist = true;
}
}
_OnHit(teamSelectCharacterExist, characterIDHere, worldPosition);
}
private void _HandleUIHasNoSelect(int cellIndex)
{
GameUnit clickUnit = null;
//bool teamSelectCharacterExist = false;
var unitList = GameUnitMapper.Inst.unitList;
for (int i = 0; i < unitList.Count; i++)
{
var unit = unitList[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 void _OnHit(bool teamSelectCharacterExist,
uint characterIDHere,
Vector3 worldPosition)
{
var yaw = LevelUtils.SetCharaterToward(_level.GetLevelData().preparingRegionToward);
if (teamSelectCharacterExist)
{
var unit = GameUnitMapper.Inst.GetUnitById(characterIDHere);
if (TeamManager.Instance.SelectID == characterIDHere)
{
// 下阵
switch (unit.gameunitType)
{
case EGameUnitType.Character:
_level.CharacterManager.Remove(characterIDHere);
break;
case EGameUnitType.Vehicle:
VehicleManager.Inst.RemoveVehicleForPreview(unit as PreviewVehicle);
break;
default:
DebugUtil.LogError("暂未处理的类型:{0}", unit.gameunitType);
return;
}
}
else
{
// 交换位置
var unitHere = unit;
var selectUnit = GameUnitMapper.Inst.GetUnitById(TeamManager.Instance.SelectID);
if (unitHere != null && selectUnit != null)
{
_SetAnother(unitHere, selectUnit);
}
if (selectUnit != null)
{
_SetSelf(selectUnit, worldPosition, yaw);
}
}
}
else
{
if (ValueValidator.IsIdValid(TeamManager.Instance.SelectID))
{
if (TeamManager.Instance.IsFightListLimit(TeamManager.Instance.SelectID))
{
//TODO chenyq 需要添加到stringconfig
UITipsManager.ShowTips("上阵人数达到上限!");
return;
}
// 创建单位
if (ValueValidator.IsIdValid(characterIDHere))
{
TeamManager.Instance.SetIsChanging(true);
var oldUnit = GameUnitMapper.Inst.GetUnitById(characterIDHere);
switch (oldUnit.gameunitType)
{
case EGameUnitType.Character:
_level.CharacterManager.Remove(characterIDHere);
break;
case EGameUnitType.Vehicle:
VehicleManager.Inst.RemoveVehicleForPreview(oldUnit as PreviewVehicle);
break;
default:
DebugUtil.LogError("暂未处理的类型:{0}", oldUnit.gameunitType);
break;
}
}
var unitType = TeamManager.Instance.GetUnitType(TeamManager.Instance.SelectID);
switch (unitType)
{
case SingleTeamCharacterInfo.CharacType.Hero:
_CreateCharacter(TeamManager.Instance.SelectID, worldPosition, yaw);
break;
case SingleTeamCharacterInfo.CharacType.Vehicle:
_CreateVehicle(TeamManager.Instance.SelectID, worldPosition, yaw);
break;
}
_level.SelectUnit(TeamManager.Instance.SelectID);
}
else
{
// 选中单位
if (ValueValidator.IsIdValid(characterIDHere))
{
_level.SelectUnit(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;
await UniTask.Delay(50);
for (var i = 0; i < renders.Length; ++i)
{
renders[i].enabled = true;
OutlineManager.instance.AddRenderer(renders[i], false);
}
selectedCharacter.Node.SetActive(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;
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 void _CreateVehicle(uint id,
Vector3 pos,
float yaw)
{
var cInfo = TeamManager.Instance.GetCharacterDataInfo(id);
var vehicleId = cInfo.GetVehicleInfo().Cfg.ID;
// cInfo.GetVehicleInfo().VehicleData.SumPowerLevel()
var fakeSkillLevel = 1;
var vehicle = VehicleManager.Inst.CreateVehicleForPreview(id, vehicleId, fakeSkillLevel, ETroopsId.Self);
if (vehicle == null)
{
return;
}
vehicle.transData.pos = pos;
vehicle.transData.yaw = yaw;
vehicle.PrepareReady();
}
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 _level.CharacterManager.CreateCharacter(characterInfo, ETroopsId.Self, position, yaw);
if (character != null)
{
character.transData.pos = position;
character.transData.yaw = yaw;
character.PrepareReady();
}
}
public PrepareState(Level level) : base(level)
{
}
}
}