using Cysharp.Threading.Tasks; using Framework; using Gameplay.Character; using Gameplay.Unit; using Gameplay.Unit.Data; 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) { } 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(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: GameUnitManager.instance.MoveUnitToPrepare(characterIDHere); break; case EGameUnitType.Vehicle: GameUnitManager.instance.MoveUnitToPrepare(characterIDHere); 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: GameUnitManager.instance.MoveUnitToPrepare(characterIDHere); break; case EGameUnitType.Vehicle: GameUnitManager.instance.MoveUnitToPrepare(characterIDHere); 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(); 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(); 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 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); } public PrepareState(Level level) : base(level) { } } }