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

728 lines
27 KiB
C#
Raw Normal View History

2023-10-19 15:00:19 +08:00
using cfg.LevelCfg;
using System.Collections.Generic;
using AOT.PostProcess.BlackArea;
2023-11-17 13:14:55 +08:00
using Code.Scripts.Gameplay.Utils;
using CriWare;
2023-08-22 19:08:45 +08:00
using Cysharp.Threading.Tasks;
using Framework;
using Gameplay.AI;
2023-12-14 14:42:27 +08:00
using Gameplay.Area;
2024-07-12 13:51:06 +08:00
using Gameplay.BT.Variables;
2023-08-22 19:08:45 +08:00
using Gameplay.Buff;
using Gameplay.Character;
2024-09-23 12:13:33 +08:00
using Gameplay.Common;
2023-08-22 19:08:45 +08:00
using Gameplay.Effect;
2023-10-19 15:00:19 +08:00
using Gameplay.Emoji;
2024-05-30 19:41:10 +08:00
using Gameplay.Fight.Capture;
using Gameplay.Fight.Flag;
2024-09-27 19:05:49 +08:00
using Gameplay.Level.Select;
2024-02-20 15:17:22 +08:00
using Gameplay.Pause;
using Gameplay.Performance;
2023-10-19 15:00:19 +08:00
using Gameplay.Pool;
using Gameplay.PostProcess.BlackArea;
2023-08-22 19:08:45 +08:00
using Gameplay.Skill;
2023-11-20 14:10:18 +08:00
using Gameplay.SubSystems;
2023-12-13 16:20:41 +08:00
using Gameplay.Unit;
2024-07-12 13:51:06 +08:00
using Gameplay.Unit.Data;
2023-08-22 19:08:45 +08:00
using Gameplay.Vehicle;
2024-09-05 13:44:22 +08:00
using Gameplay.Vehicle.Impl;
2023-10-19 15:00:19 +08:00
using PhxhSDK;
using SRF;
2023-08-22 19:08:45 +08:00
using UnityEngine;
2023-10-19 15:00:19 +08:00
using Constants = Framework.Constants;
2023-08-22 19:08:45 +08:00
namespace Gameplay.Level
{
public partial class Level : IUpdatable, ILoadable
{
2024-07-12 13:51:06 +08:00
private const string AIBehavior = "AIBehavior";
2023-10-19 15:00:19 +08:00
private int _id;
2023-08-22 19:08:45 +08:00
private LevelData _levelData;
2023-11-20 14:10:18 +08:00
private LevelInfo _currLevelInfo;
2023-08-22 19:08:45 +08:00
private Map _map;
2023-10-19 15:00:19 +08:00
private StateMachine _stateMachine = new StateMachine();
2023-08-22 19:08:45 +08:00
public bool isInBattle = false;
2023-12-26 18:19:05 +08:00
private object _param;
2023-10-19 15:00:19 +08:00
public int ID => _id;
2023-08-22 19:08:45 +08:00
public Map Map => _map;
2023-10-19 15:00:19 +08:00
public float LevelTime { set; get; }
2023-12-26 18:19:05 +08:00
public bool IsPvPLevel => _id == TableManager.Instance.Tables.GlobalConfig.PVPLevelID;
2023-10-19 15:00:19 +08:00
public bool IsWar => _currLevelInfo.ChapterInfo.Cfg.Type == E_ChapterType.War;
public Level(int leveId,
object param = null)
2023-08-22 19:08:45 +08:00
{
2023-10-19 15:00:19 +08:00
_id = leveId;
2023-12-26 18:19:05 +08:00
_param = param;
2023-10-19 15:00:19 +08:00
Init();
2023-08-22 19:08:45 +08:00
}
2023-10-19 15:00:19 +08:00
private Dictionary<string, DataLevel> _configLevelDic = new Dictionary<string, DataLevel>();
public Dictionary<string, DataLevel> ConfigLevelDic => _configLevelDic;
2023-08-22 19:08:45 +08:00
2023-10-19 15:00:19 +08:00
private void LoadConfigLevel()
2023-08-22 19:08:45 +08:00
{
2024-09-05 13:41:39 +08:00
LevelManager.Instance.TryGetLevelInfoByID(_id, out _currLevelInfo);
2023-08-22 19:08:45 +08:00
}
2023-11-20 14:10:18 +08:00
private async UniTask LoadScene()
{
2024-09-02 15:32:25 +08:00
await GameSceneManager.Instance.LoadSceneAsync(_currLevelInfo.Cfg.LevelScene);
await AssetManager.Instance.LoadAndInstAsync(CmpAreaColorSettings.ASSET_PATH);
2023-11-20 14:10:18 +08:00
}
2023-12-26 18:19:05 +08:00
2023-11-21 15:04:56 +08:00
private async UniTask UnLoadScene()
{
2024-09-02 15:32:25 +08:00
await GameSceneManager.Instance.UnLoadSceneAsync(_currLevelInfo.Cfg.LevelScene);
AssetManager.Instance.Unload(CmpAreaColorSettings.ASSET_PATH);
2023-11-21 15:04:56 +08:00
}
2023-12-26 18:19:05 +08:00
2024-06-05 19:08:49 +08:00
private void LoadData()
2023-08-22 19:08:45 +08:00
{
_levelData = _currLevelInfo.LevelData;
2023-08-22 19:08:45 +08:00
}
private async UniTask LoadMap()
{
2023-11-20 14:10:18 +08:00
// if (_levelData != null)
// {
2023-12-26 18:19:05 +08:00
// if (_map != null)
// {
// MapUtils.RemoveCameraController(CameraManager.Instance.MainCamera);
// MapUtils.UnLoadMap(_map);
// }
_map = await MapUtils.LoadMap(_currLevelInfo.MapData);
2024-01-15 14:20:22 +08:00
//NLDSceneManager.Instance.SceneCamera.gameObject.SetActive(false);
2024-02-21 17:54:08 +08:00
var sceneCamera = NLDSceneManager.Instance.SceneCamera;
2024-02-23 14:24:08 +08:00
// Debug.LogError(sceneCamera.scene + " " + sceneCamera.name);
2024-02-21 17:54:08 +08:00
CameraManager.Instance.SwitchMainCamera(sceneCamera);
2024-01-15 14:20:22 +08:00
MapUtils.BindCameraController(NLDSceneManager.Instance.SceneCamera, _map);
//MapUtils.BindCameraController(CameraManager.Instance.MainCamera, _map);
2023-11-20 14:10:18 +08:00
//}
2023-08-22 19:08:45 +08:00
}
private async UniTask _LoadNpc()
2023-12-26 18:19:05 +08:00
{
if (!IsPvPLevel)
{
await _LoadEnemyFromLevelData();
await _LoadBeProtectFromLevelData();
}
2023-12-26 18:19:05 +08:00
else
{
await _LoadNPCFromPVPData();
2024-09-10 15:28:06 +08:00
// await _TempCreateBuild();
}
}
private async UniTask<GameUnit> _TempCreateBuild(uint id, uint cellIndex)
2024-09-09 19:22:22 +08:00
{
DebugUtil.LogError("临时创建建筑");
var tempCellIndex = (int)cellIndex;//37;
var tempBuildId = (int)id;//1005;
2024-09-09 19:22:22 +08:00
var teamId = ETroopsId.Enemy1;
var createUnit = await GameUnitManager.instance.PrepareBuild(tempBuildId, teamId);
if (createUnit == null)
{
DebugUtil.LogError("创建建筑失败");
return null;
2024-09-09 19:22:22 +08:00
}
GameUnitManager.instance.MoveUnitToFight(createUnit.GetID(), tempCellIndex, 0);
return createUnit;
2024-09-09 19:22:22 +08:00
}
private async UniTask _LoadBeProtectFromLevelData()
{
if (_levelData == null) return;
2024-06-04 18:12:20 +08:00
var infos = _levelData.protectUnitInfos;
for (int i = 0; i < infos.Count; i++)
{
2024-06-04 18:12:20 +08:00
var info = infos[i];
var createUnit = await GameUnitManager.instance.PrepareBeProtectUnit(info.id);
if (createUnit == null)
{
DebugUtil.LogError("创建护送对象失败");
return;
}
2024-07-12 13:51:06 +08:00
2024-06-04 18:12:20 +08:00
createUnit.transData.bornCellIndex = info.protectStartPoint;
GameUnitManager.instance.MoveUnitToFight(createUnit.GetID(), info.protectStartPoint, 0);
2024-06-12 18:14:56 +08:00
createUnit.CreateTargetPoint(info.protectTargetPoint);
}
2023-12-26 18:19:05 +08:00
}
private async UniTask _LoadEnemyFromLevelData()
2023-08-22 19:08:45 +08:00
{
if (_levelData == null) return;
if (_map == null) return;
for (var i = 0; i < _levelData.npcInfos.Count; i++)
2023-08-22 19:08:45 +08:00
{
var npcInfo = _levelData.npcInfos[i];
// TODO: LT:临时处理,后续需要根据配置来
var teamId = ETroopsId.Enemy1;
var cellIndex = _map.BlockPosition2TGSCellIndex(npcInfo.position);
var yaw = LevelUtils.SetCharaterToward(npcInfo.npcToward);
var createUnit =
await GameUnitManager.instance.PrepareNpc(npcInfo, teamId);
if (createUnit == null)
2023-08-22 19:08:45 +08:00
{
DebugUtil.LogError("创建npc失败");
continue;
2023-08-22 19:08:45 +08:00
}
createUnit.unitLevelData = new UnitLevelData()
{
AttachAIName = npcInfo.attachAIType,
AIName = npcInfo.aIType,
BornPosition = npcInfo.position,
NpcToward = npcInfo.npcToward,
PatrolInfos = npcInfo.patrolInfos,
GroupInfos = npcInfo.groups,
};
createUnit.transData.bornCellIndex = cellIndex;
GameUnitManager.instance.MoveUnitToFight(createUnit.GetID(), cellIndex, yaw);
2023-08-22 19:08:45 +08:00
}
}
private async UniTask _LoadNPCFromPVPData()
2023-12-26 18:19:05 +08:00
{
var pvpDefenderData = _param as PVPDefenderData;
if (pvpDefenderData == null)
{
DebugUtil.LogError("pvp参数不合法!");
2024-01-03 16:40:57 +08:00
return;
2023-12-26 18:19:05 +08:00
}
2023-12-27 13:57:32 +08:00
for (var i = 0; i < pvpDefenderData.pvpRuntimeUnitInfos.Count; i++)
2023-12-26 18:19:05 +08:00
{
2023-12-27 13:57:32 +08:00
var pvpUnitData = pvpDefenderData.pvpRuntimeUnitInfos[i];
//var id = (uint)pvpUnitData.unitID;
2023-12-27 13:57:32 +08:00
var position = _map.TGSCellIndex2BlockPosition(pvpUnitData.cellIndex);
2023-12-26 18:19:05 +08:00
var teamId = ETroopsId.Enemy1;
GameUnit unit = null;
switch (pvpUnitData.type)
{
case Framework.Wrapper.Unit.UnitType.Charactor:
2023-12-27 13:57:32 +08:00
var cInfo = new CharacterDataInfo();
cInfo.Refresh(pvpUnitData.characterInfo);
2023-12-26 18:19:05 +08:00
unit = await GameUnitManager.instance.PrepareCharacter(cInfo, teamId);
break;
case Framework.Wrapper.Unit.UnitType.Vehicle:
2023-12-27 13:57:32 +08:00
//todo VehicleCultivateData第二个参数
var vInfo = new VehicleCultivateData();
vInfo.Refresh(pvpUnitData.vehicleInfo);
2023-12-26 18:19:05 +08:00
unit = await GameUnitManager.instance.PrepareVehicle(vInfo, teamId);
break;
case Framework.Wrapper.Unit.UnitType.Building:
var bInfo = pvpUnitData.fightBuildingData;
unit = await _TempCreateBuild(bInfo.Uid, (uint)pvpUnitData.cellIndex);
break;
2023-12-26 18:19:05 +08:00
}
if (unit == null)
{
DebugUtil.LogError("创建pvp unit失败");
continue;
}
unit.unitLevelData = new UnitLevelData()
{
AttachAIName = pvpUnitData.attachAIType,
AIName = pvpUnitData.aiType,
BornPosition = position,
NpcToward = _levelData.pvpDefendToward,
PatrolInfos = new(),
GroupInfos = new (),
};
2023-12-26 18:19:05 +08:00
var yaw = LevelUtils.SetCharaterToward(_levelData.pvpDefendToward);
2023-12-27 13:57:32 +08:00
GameUnitManager.instance.MoveUnitToFight(unit.GetID(), pvpUnitData.cellIndex, yaw);
2023-12-26 18:19:05 +08:00
}
}
2023-11-15 16:24:53 +08:00
// public void BindMap(Map map)
// {
// if (map != null)
// {
// _map = map;
// }
//
// if (_map.MapData.name.Equals(_levelData.mapName))
// {
// DebugUtil.LogError("{0}.{1} Errormap name not match", GetType(),
// System.Reflection.MethodBase.GetCurrentMethod()?.Name);
// }
// }
2023-08-22 19:08:45 +08:00
public void Update(float deltaTime)
{
if (!_isPause)
{
_stateMachine.Update(deltaTime * _speed);
2023-12-26 18:26:00 +08:00
// GameUnitManager.instance.LogicUpdate(deltaTime * _speed);
2023-08-22 19:08:45 +08:00
AIManager.Instance.Update(deltaTime * _speed);
}
2024-09-27 19:05:49 +08:00
selectView?.LogicUpdate();
2023-08-22 19:08:45 +08:00
}
/// <summary>
/// 这里是 level system的初始化,不是 level 场景的初始化
/// </summary>
public void Init()
{
// 初始化速度
ELevelSpeed.Level_0 = TableManager.Instance.Tables.GlobalConfig.FightSpeedParams[0];
ELevelSpeed.Level_1 = TableManager.Instance.Tables.GlobalConfig.FightSpeedParams[1];
ELevelSpeed.Level_2 = TableManager.Instance.Tables.GlobalConfig.FightSpeedParams[2];
ELevelSpeed.Level_3 = TableManager.Instance.Tables.GlobalConfig.FightSpeedParams[3];
var defaultLevelSpeedIndex = TableManager.Instance.Tables.GlobalConfig.FightSpeedDefault;
ELevelSpeed.DEFAULT_SPEED = TableManager.Instance.Tables.GlobalConfig.FightSpeedParams[defaultLevelSpeedIndex];
2023-08-22 19:08:45 +08:00
AIManager.Instance.Init();
2023-10-19 15:00:19 +08:00
2023-12-14 14:42:27 +08:00
GameUnitManager.CreateInstance();
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
SkillManager.CreateInstance();
BuffManager.CreateInstance();
2023-10-19 15:00:19 +08:00
EmojiManager.CreateInstance();
2023-08-22 19:08:45 +08:00
}
public void Release()
{
AreaManager.instance.Dispose();
2023-10-19 15:00:19 +08:00
EmojiManager.inst.Dispose();
SkillManager.instance.Dispose();
BuffManager.instance.Dispose();
2023-08-22 19:08:45 +08:00
_stateMachine?.ChangeState(null);
AIManager.Instance.Release();
2024-05-30 19:41:10 +08:00
CaptureManager.instance.Dispose();
FlagManager.instance.Dispose();
2023-10-19 15:00:19 +08:00
2024-02-20 14:33:52 +08:00
// 在这里释放所有单位
GameUnitManager.instance.Dispose();
2024-02-20 15:17:22 +08:00
if (PauseManager.instance != null)
{
PauseManager.instance.Dispose();
}
2024-02-20 15:17:22 +08:00
EffectManager.instance.ClearPool();
ObjPoolManager.instance.Clear();
2024-07-12 18:23:00 +08:00
BlackAreaManager.instance.Dispose();
AssetManager.Instance.Unload(Constants.TIREMARK_UNIT_PATH);
AssetManager.Instance.Unload(Constants.TIREMARK_MAT_PATH);
AssetManager.Instance.Unload(Constants.CHARACTER_SELECT_GROUND_GFX);
AssetManager.Instance.Unload(Constants.EMOJI_HEAD_MAT);
AssetManager.Instance.Unload(Constants.SUMMON_BOTTOM_PATH_SELF);
AssetManager.Instance.Unload(Constants.SUMMON_BOTTOM_PATH_ENEMY);
AssetManager.Instance.Unload(Constants.SKILL_GORUND_HIGH_LIGHT);
AssetManager.Instance.Unload(Constants.CAPTURE_POINT_PATH);
2024-06-12 18:14:56 +08:00
AssetManager.Instance.Unload(Constants.CAPTURE_FINISHED_POINT_PATH);
2024-05-31 16:46:35 +08:00
AssetManager.Instance.Unload(Constants.FLAG_GROUND_PATH);
AssetManager.Instance.Unload(Constants.FLAG_PICK_PATH);
AssetManager.Instance.Unload(Constants.FLAG_RETURN_PATH);
2024-06-12 18:14:56 +08:00
AssetManager.Instance.Unload(Constants.PROTECT_TARGET_POINT_PATH);
AssetManager.Instance.Unload(Constants.FIGHT_LIGHT_AREA_PATH);
2024-07-12 18:23:00 +08:00
AssetManager.Instance.Unload(Constants.FIGHT_CELL_COLLIDER_PATH);
AssetManager.Instance.Unload(SkillRotateCamera.PREFAB_PATH);
AssetManager.Instance.Unload(BlackAreaManagerImpl.BLIT_MAT_PATH);
2024-09-30 18:06:04 +08:00
AssetManager.Instance.Unload(Constants.MOVE_AREA_POINT_PATH);
2024-10-09 13:19:06 +08:00
for (int i = 0; i < PathDefine.RoadLine.END_NOTICES.Length; i++)
{
var path = PathDefine.RoadLine.END_NOTICES[i];
AssetManager.Instance.Unload(path);
}
AssetManager.Instance.Unload(PathDefine.RoadLine.ROAD_LINE);
AssetManager.Instance.Unload(PathDefine.RoadLine.ROAD_LINE_STRAIGHT);
AssetManager.Instance.Unload(PathDefine.ReadyArea.READY_AREA_POINT);
_UnloadOutlinePost();
2024-03-21 14:44:09 +08:00
_UnLoadWeather();
// 卸载关卡时强制隐藏技能相机
CameraManager.Instance.SkillCamera.gameObject.SetActive(false);
2024-03-21 14:44:09 +08:00
}
private void _UnloadOutlinePost()
{
AssetManager.Instance.Unload(Constants.SHADER_OUTLINE_PATH1);
AssetManager.Instance.Unload(Constants.SHADER_OUTLINE_PATH1_1);
AssetManager.Instance.Unload(Constants.SHADER_OUTLINE_PATH2);
AssetManager.Instance.Unload(Constants.SHADER_OUTLINE_PATH3);
AssetManager.Instance.Unload(Constants.OUTLINE_POSTPROCESS_PATH);
}
2024-03-21 14:44:09 +08:00
private void _UnLoadWeather()
{
2024-09-02 15:32:25 +08:00
var weatherType = (int)_currLevelInfo.Cfg.LevelWeather;
var groundType = (int)_currLevelInfo.Environment;
var weatherEffectConfig = TableManager.Instance.Tables.WeatherEffectConfig.Get(weatherType, groundType);
if (weatherEffectConfig == null)
2024-03-21 14:44:09 +08:00
{
return;
}
2024-07-12 13:51:06 +08:00
var cameraPrefab = weatherEffectConfig.CameraPrefab;
2024-03-21 14:44:09 +08:00
if (string.IsNullOrEmpty(cameraPrefab))
{
return;
}
2024-07-12 13:51:06 +08:00
2024-03-21 14:44:09 +08:00
AssetManager.Instance.Unload(cameraPrefab);
2023-08-22 19:08:45 +08:00
}
public async UniTask Load()
{
2023-10-19 15:00:19 +08:00
LoadConfigLevel();
2023-12-26 18:19:05 +08:00
2023-12-14 14:42:27 +08:00
// GameUnitManager.instance.PrepareUnits();
//UIManager.Instance.CloseAllNormalExcept(UINameConst.UI_Loading); // 打开加载界面时已经移除
2023-08-22 19:08:45 +08:00
2023-11-20 14:10:18 +08:00
await LoadScene();
2024-06-05 19:08:49 +08:00
LoadData();
2023-08-22 19:08:45 +08:00
await LoadMap();
2024-03-21 14:44:09 +08:00
await _LoadWeather();
2023-08-22 19:08:45 +08:00
await _InitAfterLoadMap();
2023-10-19 15:00:19 +08:00
await _LoadOthers();
2024-09-27 19:05:49 +08:00
selectView = new SelectView();
selectView.Init();
2023-10-19 15:00:19 +08:00
await _LoadNpc();
2024-05-30 19:41:10 +08:00
_CreateCapturePoints();
_CreateFlags();
2023-12-14 14:42:27 +08:00
2023-11-17 13:14:55 +08:00
_SetShadows();
2023-08-22 19:08:45 +08:00
RegisterAllEvent();
2023-11-06 18:20:55 +08:00
InitRules();
_InitAudioListener();
2023-08-22 19:08:45 +08:00
_stateMachine.ChangeState(new PrepareState(this));
2024-07-12 13:51:06 +08:00
var enableBlackArea = _currLevelInfo.Cfg.LevelTime == DayNightType.Night;
BlackAreaManager.instance.Init(enableBlackArea);
_UpdateAllUnits();
2024-07-12 13:51:06 +08:00
InitAIStart();
}
private void _InitAudioListener()
{
var cameraRoot = CameraManager.Instance.MainCamera.gameObject;
cameraRoot.RemoveComponentIfExists<CriAtomListener>();
var rayHits = new RaycastHit[10];
var ray = CameraManager.Instance.MainCamera.ScreenPointToRay(new Vector3(Screen.width / 2,
Screen.height / 2, 0));
var layerMask = LayerMask.GetMask("Ground");
var rayHit = Physics.RaycastNonAlloc(ray, rayHits, 1000, layerMask);
if (rayHit <= 0) return;
var firstHit = rayHits[0];
var hitPoint = firstHit.point;
var listenerRoot = new GameObject("Listener");
listenerRoot.transform.SetParent(cameraRoot.transform);
listenerRoot.transform.position = hitPoint;
listenerRoot.AddComponent<CriAtomListener>();
}
private void _UpdateAllUnits()
{
var units = GameUnitManager.instance.infightUnits.unitList;
for (int i = 0; i < units.Count; i++)
{
var unit = units[i];
unit.ForceUpdateBlackArea();
}
}
2024-07-12 13:51:06 +08:00
private async void InitAIStart()
{
var units = GameUnitManager.instance.infightUnits.unitList;
foreach (var unit in units)
{
2024-09-05 13:44:22 +08:00
if (unit is Character.Character unitCharacter)
2024-07-12 13:51:06 +08:00
{
2024-09-05 13:44:22 +08:00
await _HandleForCharacter(unitCharacter);
}
else if (unit is NormalVehicle unitVehicle)
{
await _HandleForVehicle(unitVehicle);
2024-07-12 13:51:06 +08:00
}
2024-09-05 13:44:22 +08:00
}
}
2024-07-12 13:51:06 +08:00
2024-09-05 13:44:22 +08:00
private async UniTask _HandleForVehicle(NormalVehicle vehicle)
{
if (vehicle == null) return;
if (vehicle.commonData.troopId == ETroopsId.Self)
{
// 玩家默认激活
vehicle.statusData.isAttackActive = true;
return;
}
// AI 默认非激活
vehicle.statusData.isAttackActive = false;
var bt = await AIManager.Instance.RegisterAI(vehicle.Node.GameObject, AIBehavior);
bt.SetVariable("battleInfo", new SharedBattleInfo()
{
Value = new BattleInfo()
2024-07-12 13:51:06 +08:00
{
2024-09-05 13:44:22 +08:00
ownerId = vehicle.GetID(),
AIName = vehicle.unitLevelData.AIName,
AttachAIName = vehicle.unitLevelData.AttachAIName,
PatrolInfos = vehicle.unitLevelData.PatrolInfos,
groupInfo = vehicle.unitLevelData.GroupInfos,
}
});
vehicle.statusData.isAIControll = true;
}
private async UniTask _HandleForCharacter(Character.Character character)
{
if (character == null) return;
if (character.troopId == ETroopsId.Self)
{
// 玩家默认激活
character.statusData.isAttackActive = true;
return;
2024-07-12 13:51:06 +08:00
}
2024-09-05 13:44:22 +08:00
// AI 默认非激活
character.statusData.isAttackActive = false;
var bt = await AIManager.Instance.RegisterAI(character.Node.GameObject, AIBehavior);
bt.SetVariable("battleInfo", new SharedBattleInfo()
{
Value = new BattleInfo()
{
ownerId = character.GetID(),
AIName = character.unitLevelData.AIName,
AttachAIName = character.unitLevelData.AttachAIName,
PatrolInfos = character.unitLevelData.PatrolInfos,
groupInfo = character.unitLevelData.GroupInfos,
}
});
character.statusData.isAIControll = true;
2023-08-22 19:08:45 +08:00
}
2024-05-30 19:41:10 +08:00
private void _CreateCapturePoints()
{
CaptureManager.CreateInstance();
CaptureManager.instance.Init();
}
private void _CreateFlags()
{
FlagManager.CreateInstance();
FlagManager.instance.Init();
}
2024-03-21 14:44:09 +08:00
private async UniTask _LoadWeather()
{
2024-09-02 15:32:25 +08:00
var weatherType = (int)_currLevelInfo.Cfg.LevelWeather;
var groundType = (int)_currLevelInfo.Environment;
var weatherEffectConfig = TableManager.Instance.Tables.WeatherEffectConfig.Get(weatherType, groundType);
if (weatherEffectConfig == null)
2024-03-21 14:44:09 +08:00
{
return;
}
2024-07-12 13:51:06 +08:00
var cameraPrefab = weatherEffectConfig.CameraPrefab;
2024-03-21 14:44:09 +08:00
if (string.IsNullOrEmpty(cameraPrefab))
{
return;
}
2024-03-21 14:44:09 +08:00
var loadObj = await AssetManager.Instance.LoadAssetAsync<GameObject>(cameraPrefab);
if (loadObj == null)
{
DebugUtil.LogError("加载天气特效失败:{0}", cameraPrefab);
return;
}
2024-07-12 13:51:06 +08:00
2024-03-21 14:44:09 +08:00
var cameraObj = CameraManager.Instance.MainCamera.gameObject;
var weatherCamera = Object.Instantiate(loadObj, cameraObj.transform);
weatherCamera.transform.localPosition = Vector3.zero;
weatherCamera.transform.localRotation = Quaternion.identity;
}
2023-11-17 13:14:55 +08:00
private void _SetShadows()
{
2024-09-02 15:32:25 +08:00
var setDistance = _currLevelInfo.Cfg.ShadowDistance;
2023-11-17 13:14:55 +08:00
ShadowEx.SetShadowDistance(setDistance);
}
2023-10-19 15:00:19 +08:00
private async UniTask _LoadOthers()
{
AssetManager.Instance.PostPreload(Constants.TIREMARK_UNIT_PATH);
AssetManager.Instance.PostPreload(Constants.TIREMARK_MAT_PATH);
AssetManager.Instance.PostPreload(Constants.CHARACTER_SELECT_GROUND_GFX);
2023-10-27 13:59:26 +08:00
AssetManager.Instance.PostPreload(Constants.EMOJI_HEAD_MAT);
2024-01-19 18:06:00 +08:00
AssetManager.Instance.PostPreload(Constants.SUMMON_BOTTOM_PATH_SELF);
AssetManager.Instance.PostPreload(Constants.SUMMON_BOTTOM_PATH_ENEMY);
AssetManager.Instance.PostPreload(Constants.SKILL_GORUND_HIGH_LIGHT);
AssetManager.Instance.PostPreload(Constants.CAPTURE_POINT_PATH);
2024-06-12 18:14:56 +08:00
AssetManager.Instance.PostPreload(Constants.CAPTURE_FINISHED_POINT_PATH);
2024-05-31 16:46:35 +08:00
AssetManager.Instance.PostPreload(Constants.FLAG_GROUND_PATH);
AssetManager.Instance.PostPreload(Constants.FLAG_PICK_PATH);
AssetManager.Instance.PostPreload(Constants.FLAG_RETURN_PATH);
2024-06-12 18:14:56 +08:00
AssetManager.Instance.PostPreload(Constants.PROTECT_TARGET_POINT_PATH);
AssetManager.Instance.PostPreload(Constants.FIGHT_LIGHT_AREA_PATH);
2024-07-12 18:23:00 +08:00
AssetManager.Instance.PostPreload(Constants.FIGHT_CELL_COLLIDER_PATH);
AssetManager.Instance.PostPreload(SkillRotateCamera.PREFAB_PATH);
AssetManager.Instance.PostPreload(BlackAreaManagerImpl.BLIT_MAT_PATH);
2024-09-30 18:06:04 +08:00
AssetManager.Instance.PostPreload(Constants.MOVE_AREA_POINT_PATH);
2024-10-09 13:19:06 +08:00
for (int i = 0; i < PathDefine.RoadLine.END_NOTICES.Length; i++)
{
var path = PathDefine.RoadLine.END_NOTICES[i];
AssetManager.Instance.PostPreload(path);
}
AssetManager.Instance.PostPreload(PathDefine.RoadLine.ROAD_LINE);
AssetManager.Instance.PostPreload(PathDefine.RoadLine.ROAD_LINE_STRAIGHT);
AssetManager.Instance.PostPreload(PathDefine.ReadyArea.READY_AREA_POINT);
2023-10-19 15:00:19 +08:00
await AssetManager.Instance.WaitAllPreloads();
}
2023-08-22 19:08:45 +08:00
private async UniTask _InitAfterLoadMap()
{
var blackAreaInst = new BlackAreaManagerImpl();
BlackAreaManager.CreateInstance(blackAreaInst);
2024-09-23 12:13:33 +08:00
_InitCameraParams();
2023-08-22 19:08:45 +08:00
// 加载后处理
await _LoadOutlinePost();
2023-12-26 18:19:05 +08:00
2023-12-14 14:42:27 +08:00
AreaManager.CreateInstance();
2023-10-19 15:00:19 +08:00
// 表情相关
// AssetManager.Instance.PostPreload(Constants.EMOJI_PREFAB_PATH);
2023-10-19 15:00:19 +08:00
await AssetManager.Instance.WaitAllPreloads();
2023-08-22 19:08:45 +08:00
}
2024-09-23 12:13:33 +08:00
private void _InitCameraParams()
{
var camera = CameraManager.Instance.MainCamera;
var cullingMask = 1 << LayerDefine.Default
| 1 << LayerDefine.GROUND
| 1 << LayerDefine.UNIT
| 1 << LayerDefine.Skill
| 1 << LayerDefine.LightArea
| 1 << LayerDefine.TeamSelf
| 1 << LayerDefine.TeamEnemy;
2024-09-23 12:13:33 +08:00
camera.cullingMask = cullingMask;
}
private async UniTask _LoadOutlinePost()
2023-08-22 19:08:45 +08:00
{
// todo: 因为逻辑上有使用outlinemanager.instance 所以这里需要先加载
// if (!PerformanceManager.instance.data.enablePostOutline) return;
2023-10-19 15:00:19 +08:00
// 加载shader
AssetManager.Instance.PostPreload(Constants.SHADER_OUTLINE_PATH1);
AssetManager.Instance.PostPreload(Constants.SHADER_OUTLINE_PATH1_1);
AssetManager.Instance.PostPreload(Constants.SHADER_OUTLINE_PATH2);
AssetManager.Instance.PostPreload(Constants.SHADER_OUTLINE_PATH3);
await AssetManager.Instance.WaitAllPreloads();
var loadObj =
await AssetManager.Instance.LoadAssetAsync<GameObject>(Constants.OUTLINE_POSTPROCESS_PATH);
2023-08-22 19:08:45 +08:00
if (loadObj != null)
{
Object.Instantiate(loadObj);
OutlineManager.instance.mat1 = AssetManager.Instance.GetPreLoadResult<Material>(Constants.SHADER_OUTLINE_PATH1);
OutlineManager.instance.mat1_1 = AssetManager.Instance.GetPreLoadResult<Material>(Constants.SHADER_OUTLINE_PATH1_1);
OutlineManager.instance.mat2 = AssetManager.Instance.GetPreLoadResult<Material>(Constants.SHADER_OUTLINE_PATH2);
OutlineManager.instance.mat3 = AssetManager.Instance.GetPreLoadResult<Material>(Constants.SHADER_OUTLINE_PATH3);
2024-10-08 16:22:47 +08:00
// 全部instance之后再设置
OutlineManager.instance.mat1 = new Material(OutlineManager.instance.mat1);
OutlineManager.instance.mat1_1 = new Material(OutlineManager.instance.mat1_1);
OutlineManager.instance.mat2 = new Material(OutlineManager.instance.mat2);
OutlineManager.instance.mat3 = new Material(OutlineManager.instance.mat3);
OutlineManager.instance.targetCamera = CameraManager.Instance.MainCamera;
OutlineManager.instance.m_EnableOutline = PerformanceManager.instance.data.enablePostOutline;
var screenWidth = Screen.width;
var sampleDistance = OutlineManager.instance.m_SampleDistance;
var wrapDistance = sampleDistance / 1080 * screenWidth;
var scaleProgress = CameraManager.Instance.GetOutlineScale(wrapDistance);
OutlineManager.instance.scaleProgress = scaleProgress;
2023-08-22 19:08:45 +08:00
}
}
public void BeginBattle()
{
_stateMachine.ChangeState(new BattleState(this));
}
public bool IsPreparing()
{
return _stateMachine.GetCurrentState() is PrepareState;
}
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
public bool IsInBattle()
{
return isInBattle;
}
2023-10-19 15:00:19 +08:00
2023-08-22 19:08:45 +08:00
public bool IsEnd()
{
return _stateMachine.GetCurrentState() is EndState;
}
2023-11-21 15:04:56 +08:00
public async UniTask Unload()
2023-08-22 19:08:45 +08:00
{
2024-07-12 13:51:06 +08:00
2024-01-15 14:20:22 +08:00
//MapUtils.RemoveCameraController(CameraManager.Instance.MainCamera);
CameraManager.Instance.RevertMainCamera();
2023-10-19 15:00:19 +08:00
MapUtils.UnLoadMap(_map);
2023-08-22 19:08:45 +08:00
UnRegisterAllEvent();
2023-11-06 18:20:55 +08:00
ReleaseRules();
2024-09-27 19:05:49 +08:00
selectView.Dispose();
2024-02-20 14:33:52 +08:00
2023-11-21 15:04:56 +08:00
await UnLoadScene();
await UniTask.NextFrame();
2023-08-22 19:08:45 +08:00
}
public LevelData GetLevelData()
{
return _levelData;
}
2023-10-19 15:00:19 +08:00
public LevelInfo GetLevelInfo()
{
return _currLevelInfo;
}
2023-08-22 19:08:45 +08:00
}
2024-07-12 13:51:06 +08:00
}