diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveAroundTo.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveAroundTo.cs index 51e131151a6..367325957ab 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveAroundTo.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveAroundTo.cs @@ -1 +1 @@ -using System; using BehaviorDesigner.Runtime.Tasks; using Gameplay; using Gameplay.AI; using Gameplay.BT.Variables; using Gameplay.Character; using Gameplay.Level; using Gameplay.Unit; using UnityEngine; using Action = BehaviorDesigner.Runtime.Tasks.Action; // 包抄移动 public class BTMoveAroundTo : Action { public SharedBattleInfo SharedBattleInfo; public EMoveDirection MoveDirection = EMoveDirection.Clockwise; private Character _owner; private Character _target; private Map _map; public enum EMoveDirection { Clockwise, AntiClockwise, } // target owner // | // | 1 // | 3 | // | 2 | // -------------------- // private enum EStage { None, Stage1, Stage2, MoveToTarget // 3 } private EStage _stage = EStage.None; private int _stageTargetCellIndex = -1; private int _targetCellIndex = -1; private Vector3 _baseDirection = Vector3.zero; public override void OnStart() { var level = LevelManager.Instance.CurrentLevel; _owner = GameUnitManager.instance.characterManager.Get(SharedBattleInfo.Value.ownerId); _target = GameUnitManager.instance.characterManager.Get(SharedBattleInfo.Value.theChosenOneId); _map = level?.Map; _stage = EStage.None; _stageTargetCellIndex = -1; _targetCellIndex = -1; if (_owner != null) { DebugUtil.Log("BT move to start, owner: {0}",_owner?.GetID()); } if (_map != null && _target != null && _owner != null) { var targetPosition = _map.TGSCellIndex2WorldPosition(_target.transData.cellIndex); var selfPosition = _map.TGSCellIndex2WorldPosition(_owner.transData.cellIndex); _baseDirection = targetPosition - selfPosition; } } public override TaskStatus OnUpdate() { if (_target == null) { return TaskStatus.Failure; } var attackDistance = _owner.fightData.attackDistance; var selfAsideDistance = attackDistance / 2; var targetAsideDistance = attackDistance; if (HasTargetMoved()) { RememberTarget(); switch (_stage) { case EStage.None: _stageTargetCellIndex = GetStage1TargetCell(selfAsideDistance); _stage = EStage.Stage1; _owner?.MoveTo(_stageTargetCellIndex, true); break; case EStage.Stage1: _stageTargetCellIndex = GetStage1TargetCell(selfAsideDistance); _owner?.MoveTo(_stageTargetCellIndex, true); break; case EStage.Stage2: _stageTargetCellIndex = GetStage2TargetCell(targetAsideDistance); _owner?.MoveTo(_stageTargetCellIndex, true); break; case EStage.MoveToTarget: break; default: throw new ArgumentOutOfRangeException(); } return TaskStatus.Running; } else if (HasStageArrived() && !AIUtils.IsNeedStop(_owner)) { switch (_stage) { case EStage.None: DebugUtil.LogError(" BTMoveAroundTo OnUpdate error, stage is none, owner: {0}",_owner?.GetID()); break; case EStage.Stage1: _stageTargetCellIndex = GetStage2TargetCell(targetAsideDistance); _stage = EStage.Stage2; _owner?.MoveTo(_stageTargetCellIndex, true); return TaskStatus.Running; case EStage.Stage2: _stage = EStage.MoveToTarget; _owner?.MoveTo(_target); return TaskStatus.Success; } } return TaskStatus.Running; } private int GetStage1TargetCell(int distance) { var targetPosition = _map.TGSCellIndex2WorldPosition(_target.transData.cellIndex); var supposedStartPosition = targetPosition - _baseDirection; Vector3 move; if (MoveDirection == EMoveDirection.Clockwise) { move = new Vector3(_baseDirection.z, 0, -_baseDirection.x); } else { move = new Vector3(-_baseDirection.z, 0, _baseDirection.x); } while (distance-- > 0) { var supposedMoveTo = supposedStartPosition + move.normalized * distance; if (_map.WorldPosition2TGSCellIndex(supposedMoveTo, out var cellIndex) && _map.GetRuntimeBlockProperty(cellIndex, out var data) && MapUtils.CanPass(_owner.commonData.crossLevel, data)) { return cellIndex; } } return _owner.transData.cellIndex; } private int GetStage2TargetCell(int distance) { var targetPosition = _map.TGSCellIndex2WorldPosition(_target.transData.cellIndex); Vector3 move; if (MoveDirection == EMoveDirection.Clockwise) { move = new Vector3(_baseDirection.z, 0, -_baseDirection.x); } else { move = new Vector3(-_baseDirection.z, 0, _baseDirection.x); } while (distance-- > 0) { var supposedMoveTo = targetPosition + move.normalized * distance; if (_map.WorldPosition2TGSCellIndex(supposedMoveTo, out var cellIndex) && _map.GetRuntimeBlockProperty(cellIndex, out var data) && MapUtils.CanPass(_owner.commonData.crossLevel, data)) { return cellIndex; } } return _target.transData.cellIndex; } private bool HasTargetMoved() { return _targetCellIndex != _target.transData.cellIndex; } private void RememberTarget() { _targetCellIndex = _target.transData.cellIndex; } private bool HasStageArrived() { return _stageTargetCellIndex == _owner?.transData.cellIndex; } } \ No newline at end of file +using System; using BehaviorDesigner.Runtime.Tasks; using Gameplay; using Gameplay.AI; using Gameplay.BT.Variables; using Gameplay.Character; using Gameplay.Level; using Gameplay.Unit; using UnityEngine; using Action = BehaviorDesigner.Runtime.Tasks.Action; // 包抄移动 public class BTMoveAroundTo : Action { public SharedBattleInfo SharedBattleInfo; public EMoveDirection MoveDirection = EMoveDirection.Clockwise; private Character _owner; private Character _target; private Map _map; public enum EMoveDirection { Clockwise, AntiClockwise, } // target owner // | // | 1 // | 3 | // | 2 | // -------------------- // private enum EStage { None, Stage1, Stage2, MoveToTarget // 3 } private EStage _stage = EStage.None; private int _stageTargetCellIndex = -1; private int _targetCellIndex = -1; private Vector3 _baseDirection = Vector3.zero; public override void OnStart() { var level = LevelManager.Instance.CurrentLevel; _owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId) as Character; _target = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.theChosenOneId) as Character; _map = level?.Map; _stage = EStage.None; _stageTargetCellIndex = -1; _targetCellIndex = -1; if (_owner != null) { DebugUtil.Log("BT move to start, owner: {0}",_owner?.GetID()); } if (_map != null && _target != null && _owner != null) { var targetPosition = _map.TGSCellIndex2WorldPosition(_target.transData.cellIndex); var selfPosition = _map.TGSCellIndex2WorldPosition(_owner.transData.cellIndex); _baseDirection = targetPosition - selfPosition; } } public override TaskStatus OnUpdate() { if (_target == null) { return TaskStatus.Failure; } var attackDistance = _owner.fightData.attackDistance; var selfAsideDistance = attackDistance / 2; var targetAsideDistance = attackDistance; if (HasTargetMoved()) { RememberTarget(); switch (_stage) { case EStage.None: _stageTargetCellIndex = GetStage1TargetCell(selfAsideDistance); _stage = EStage.Stage1; _owner?.MoveTo(_stageTargetCellIndex, true); break; case EStage.Stage1: _stageTargetCellIndex = GetStage1TargetCell(selfAsideDistance); _owner?.MoveTo(_stageTargetCellIndex, true); break; case EStage.Stage2: _stageTargetCellIndex = GetStage2TargetCell(targetAsideDistance); _owner?.MoveTo(_stageTargetCellIndex, true); break; case EStage.MoveToTarget: break; default: throw new ArgumentOutOfRangeException(); } return TaskStatus.Running; } else if (HasStageArrived() && !AIUtils.IsNeedStop(_owner)) { switch (_stage) { case EStage.None: DebugUtil.LogError(" BTMoveAroundTo OnUpdate error, stage is none, owner: {0}",_owner?.GetID()); break; case EStage.Stage1: _stageTargetCellIndex = GetStage2TargetCell(targetAsideDistance); _stage = EStage.Stage2; _owner?.MoveTo(_stageTargetCellIndex, true); return TaskStatus.Running; case EStage.Stage2: _stage = EStage.MoveToTarget; _owner?.MoveTo(_target); return TaskStatus.Success; } } return TaskStatus.Running; } private int GetStage1TargetCell(int distance) { var targetPosition = _map.TGSCellIndex2WorldPosition(_target.transData.cellIndex); var supposedStartPosition = targetPosition - _baseDirection; Vector3 move; if (MoveDirection == EMoveDirection.Clockwise) { move = new Vector3(_baseDirection.z, 0, -_baseDirection.x); } else { move = new Vector3(-_baseDirection.z, 0, _baseDirection.x); } while (distance-- > 0) { var supposedMoveTo = supposedStartPosition + move.normalized * distance; if (_map.WorldPosition2TGSCellIndex(supposedMoveTo, out var cellIndex) && _map.GetRuntimeBlockProperty(cellIndex, out var data) && MapUtils.CanPass(_owner.commonData.crossLevel, data)) { return cellIndex; } } return _owner.transData.cellIndex; } private int GetStage2TargetCell(int distance) { var targetPosition = _map.TGSCellIndex2WorldPosition(_target.transData.cellIndex); Vector3 move; if (MoveDirection == EMoveDirection.Clockwise) { move = new Vector3(_baseDirection.z, 0, -_baseDirection.x); } else { move = new Vector3(-_baseDirection.z, 0, _baseDirection.x); } while (distance-- > 0) { var supposedMoveTo = targetPosition + move.normalized * distance; if (_map.WorldPosition2TGSCellIndex(supposedMoveTo, out var cellIndex) && _map.GetRuntimeBlockProperty(cellIndex, out var data) && MapUtils.CanPass(_owner.commonData.crossLevel, data)) { return cellIndex; } } return _target.transData.cellIndex; } private bool HasTargetMoved() { return _targetCellIndex != _target.transData.cellIndex; } private void RememberTarget() { _targetCellIndex = _target.transData.cellIndex; } private bool HasStageArrived() { return _stageTargetCellIndex == _owner?.transData.cellIndex; } } \ No newline at end of file diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveToBornPosition.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveToBornPosition.cs index 7aaccf81b98..97f5156073e 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveToBornPosition.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/AI/Task/BTMoveToBornPosition.cs @@ -16,7 +16,7 @@ namespace Code.Scripts.Gameplay.BT.Task public override void OnStart() { - _owner = GameUnitManager.instance.characterManager.Get(SharedBattleInfo.Value.ownerId); + _owner = GameUnitManager.instance.infightUnits.Search(SharedBattleInfo.Value.ownerId) as Character; if (_owner != null) _bornCellIndex = LevelManager.Instance.CurrentLevel.Map.BlockPosition2TGSCellIndex(_owner.runtimeData.characterLevelData.BornPosition); SharedBattleInfo.Value.PartolPointIndex = -1; diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Character.Action.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Character.Action.cs index 38af612795f..02f05eed827 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Character.Action.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Character.Action.cs @@ -38,7 +38,7 @@ namespace Gameplay.Character { return; } - + var bt = await AIManager.Instance.RegisterAI(Node.GameObject, AIBehavior); bt.SetVariable("battleInfo", new SharedBattleInfo() { @@ -59,9 +59,9 @@ namespace Gameplay.Character { AIManager.Instance.UnRegisterAI(Node.GameObject); } - - BuffManager.instance.RemoveCharacter(this); - SkillManager.instance.RemoveCharacter(this); + + BuffManager.instance?.RemoveCharacter(this); + SkillManager.instance?.RemoveCharacter(this); } protected override void _OnUseSkill(int cellIndex, diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/CharacterManager.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/CharacterManager.cs index 5c3d3b592dc..c632fcc7afd 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/CharacterManager.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/CharacterManager.cs @@ -4,31 +4,18 @@ using Gameplay.Unit; namespace Gameplay.Character { - public class CharacterManager : IDisposable + public class CharacterManager { - private readonly List _characterList = new List(); private readonly Dictionary _troopDict = new Dictionary(); - public void Dispose() - { - foreach (var charactor in _characterList) - { - charactor.Dispose(); - } - _characterList.Clear(); - } - public void AddCharacter(Character character) { - _characterList.Add(character); _AddToTroop(character); } public void RemoveCharacter(Character c) { - var index = _characterList.IndexOf(c); - _characterList.RemoveAt(index); _RemoveFromTroop(c); } @@ -56,6 +43,11 @@ namespace Gameplay.Character } } + public bool Contains(uint id) + { + return GameUnitManager.instance.infightUnits.Contains(id); + } + public Character Get(uint id) { var c = GameUnitManager.instance.infightUnits.Search(id) as Character; @@ -102,17 +94,22 @@ namespace Gameplay.Character public void ForEach(Action action) { - foreach (var charactor in _characterList) + foreach (var unit in GameUnitManager.instance.infightUnits.unitList) { - action(charactor); + var charactor = unit as Character; + if (charactor != null) + { + action(charactor); + } } } public List FindAll(Func conditions) { List result = new List(); - foreach (var charactor in _characterList) + foreach (var unit in GameUnitManager.instance.infightUnits.unitList) { + var charactor = unit as Character; if (conditions(charactor)) { result.Add(charactor); @@ -124,8 +121,9 @@ namespace Gameplay.Character public Character FindOne(Func conditions) { - foreach (var charactor in _characterList) + foreach (var unit in GameUnitManager.instance.infightUnits.unitList) { + var charactor = unit as Character; if (conditions(charactor)) { return charactor; diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/LevelFight/FightSceneUI/UIFightSceneController.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/LevelFight/FightSceneUI/UIFightSceneController.cs index ea818a65be5..4d048e3a63c 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/LevelFight/FightSceneUI/UIFightSceneController.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/LevelFight/FightSceneUI/UIFightSceneController.cs @@ -13,378 +13,381 @@ using Utils; using Constants = Framework.Constants; using Image = UnityEngine.UI.Image; -public class UIFightSceneController : UIWindow{ +public class UIFightSceneController : UIWindow +{ - //UI GameObj - private GameObject GoBloods; - private GameObject GoActionStates; - private GameObject GoNumbers; + //UI GameObj + private GameObject GoBloods; + private GameObject GoActionStates; + private GameObject GoNumbers; - private List m_fightIDs = new List(); - private Dictionary m_goBloodsMap = new Dictionary(); - private Dictionary m_goActionStatesMap = new Dictionary(); - private Dictionary m_goNumbersMap = new Dictionary(); + private List m_fightIDs = new List(); + private Dictionary m_goBloodsMap = new Dictionary(); + private Dictionary m_goActionStatesMap = new Dictionary(); + private Dictionary m_goNumbersMap = new Dictionary(); - private List> _damageL = new List>(10); - private Dictionary _numbersMap = new Dictionary(); + private List> _damageL = new List>(10); + private Dictionary _numbersMap = new Dictionary(); - [Range(1, 2.5f)] - public float bloodOffsetY = 1.8f; - - [Range(0, 1.5f)] - public float stateOffsetY = 1f; + [Range(1, 2.5f)] + public float bloodOffsetY = 1.8f; - [Range(-2.5f, 0)] - public float stateOffsetX = -1f; - - // Use this for initialization - public override void OnAwake() - { - //bind UI GameObj - GoBloods = transform.Find("Content/Bloods").gameObject; - GoActionStates = transform.Find("Content/ActionStates").gameObject; - GoNumbers = transform.Find("Content/Numbers").gameObject; - } + [Range(0, 1.5f)] + public float stateOffsetY = 1f; - private void Update() - { - if (!LevelManager.Instance.CurrentLevel.IsInBattle()) - { - foreach (var uid in m_fightIDs) - { - ClearGo(uid); - } + [Range(-2.5f, 0)] + public float stateOffsetX = -1f; - return; - } + // Use this for initialization + public override void OnAwake() + { + //bind UI GameObj + GoBloods = transform.Find("Content/Bloods").gameObject; + GoActionStates = transform.Find("Content/ActionStates").gameObject; + GoNumbers = transform.Find("Content/Numbers").gameObject; + } - foreach (var uid in TeamManager.Instance.GetDeadList()) - { - ClearGo(uid); - } + private void Update() + { + if (!LevelManager.Instance.CurrentLevel.IsInBattle()) + { + foreach (var uid in m_fightIDs) + { + ClearGo(uid); + } + + return; + } + + foreach (var uid in TeamManager.Instance.GetDeadList()) + { + ClearGo(uid); + } //���Ѫ����״̬���˺�Ʈ�� foreach (var uid in m_fightIDs) - { - if (!m_goBloodsMap.ContainsKey(uid)) - { - AddBloodGo(uid); - } - if (!m_goActionStatesMap.ContainsKey(uid)) - { - AddActionStateImg(uid); - } - if (!m_goNumbersMap.ContainsKey(uid)) - { - AddDamageGo(uid); - } - } + { + if (!m_goBloodsMap.ContainsKey(uid)) + { + AddBloodGo(uid); + } + if (!m_goActionStatesMap.ContainsKey(uid)) + { + AddActionStateImg(uid); + } + if (!m_goNumbersMap.ContainsKey(uid)) + { + AddDamageGo(uid); + } + } - UpdateBloods(); - UpdateActionStates(); - } + UpdateBloods(); + UpdateActionStates(); + } //ˢ��Ѫ�� void UpdateBloods() - { - foreach (var item in m_goBloodsMap) - { - var go = item.Value; - uint uid = item.Key; - //Character character = LevelManager.Instance.CurrentLevel.CharacterManager.Get(uid); - GameUnit character = GameUnitManager.instance.totalUnits.Search(uid); - if (character != null) - { - SetBloodPos(go, character); - } - } - } + { + foreach (var item in m_goBloodsMap) + { + var go = item.Value; + uint uid = item.Key; + //Character character = LevelManager.Instance.CurrentLevel.CharacterManager.Get(uid); + GameUnit character = GameUnitManager.instance.totalUnits.Search(uid); + if (character != null) + { + SetBloodPos(go, character); + } + } + } //ˢ��״̬ͼ�� - void UpdateActionStates() - { - foreach (var item in m_goActionStatesMap) - { - var go = item.Value; - uint uid = item.Key; - if (TeamManager.Instance.IsCharacter(uid)) - { - Character character = GameUnitManager.instance.characterManager.Get(uid); - if (character != null) - { - var img = go.GetComponent(); - if (character.statusData.isRetreat) - { - img.sprite = AssetManager.Instance.LoadAsset(Constants.UI_RETREATE_STATE_MAP); - SetActionStatesPos(go, character); - go.SetActive(true); - img.SetNativeSize(); - CommonUtils.SetScaleWithCameraOrgSize(go); - } - else if (character.runtimeData.isInSuppressed) - { - img.sprite = AssetManager.Instance.LoadAsset(Constants.UI_SUPPRESS_STATE_MAP); - SetActionStatesPos(go, character); - go.SetActive(true); - img.SetNativeSize(); - CommonUtils.SetScaleWithCameraOrgSize(go); - } - else - { - go.SetActive(false); - } - } - } - } - } + void UpdateActionStates() + { + foreach (var item in m_goActionStatesMap) + { + var go = item.Value; + uint uid = item.Key; + if (TeamManager.Instance.IsCharacter(uid)) + { + if (GameUnitManager.instance.characterManager.Contains(uid)) + { + Character character = GameUnitManager.instance.characterManager.Get(uid); + var img = go.GetComponent(); + if (character.statusData.isRetreat) + { + img.sprite = AssetManager.Instance.LoadAsset(Constants.UI_RETREATE_STATE_MAP); + SetActionStatesPos(go, character); + go.SetActive(true); + img.SetNativeSize(); + CommonUtils.SetScaleWithCameraOrgSize(go); + } + else if (character.runtimeData.isInSuppressed) + { + img.sprite = AssetManager.Instance.LoadAsset(Constants.UI_SUPPRESS_STATE_MAP); + SetActionStatesPos(go, character); + go.SetActive(true); + img.SetNativeSize(); + CommonUtils.SetScaleWithCameraOrgSize(go); + } + else + { + go.SetActive(false); + } + } + } + } + } - async void AddBloodGo(uint uid) - { - var unit = GameUnitManager.instance.totalUnits.Search(uid); - if (unit != null) - { - if (unit.statusData.isOnVehicle) - { - return; - } - } - - List myFightIDs = TeamManager.Instance.GetFightList(); - GameObject prefab; - if (myFightIDs.Contains(uid)) - { - if (TeamManager.Instance.IsCharacter(uid)) - { - prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UI_CharacterState_Bar.prefab"); - } - else - { - prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UI_VehicleState_Bar.prefab"); - } - } - else - { - prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UI_EnemyState_Bar.prefab"); - } - var go = Instantiate(prefab, GoBloods.transform); - var comp = go.GetComponent(); - comp.SetUid(uid); - GameUnit character = GameUnitManager.instance.infightUnits.Search(uid); - if (character != null) - { - SetBloodPos(go, character); - } - m_goBloodsMap.Add(uid, go); - } + async void AddBloodGo(uint uid) + { + var unit = GameUnitManager.instance.totalUnits.Search(uid); + if (unit != null) + { + if (unit.statusData.isOnVehicle) + { + return; + } + } - void AddActionStateImg(uint uid) - { - var unit = GameUnitManager.instance.infightUnits.Search(uid); - if (unit == null) - { - return; - } - if (unit.statusData.isOnVehicle) - { - return; - } + List myFightIDs = TeamManager.Instance.GetFightList(); + GameObject prefab; + if (myFightIDs.Contains(uid)) + { + if (TeamManager.Instance.IsCharacter(uid)) + { + prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UI_CharacterState_Bar.prefab"); + } + else + { + prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UI_VehicleState_Bar.prefab"); + } + } + else + { + prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UI_EnemyState_Bar.prefab"); + } + var go = Instantiate(prefab, GoBloods.transform); + var comp = go.GetComponent(); + comp.SetUid(uid); + GameUnit character = GameUnitManager.instance.infightUnits.Search(uid); + if (character != null) + { + SetBloodPos(go, character); + } + m_goBloodsMap.Add(uid, go); + } - if (unit.statusData.isDead) - { - return; - } - - if(GameUnitManager.instance.infightUnits.Search(uid).gameunitType == EGameUnitType.Character) - { - Character character = GameUnitManager.instance.characterManager.Get(uid); - if (character != null) - { - GameObject Image_State = new GameObject("Image_State"); - RectTransform rect = Image_State.AddComponent(); - Image_State.AddComponent(); - Image_State.SetActive(false); - m_goActionStatesMap.Add(uid, Image_State); - Image_State.transform.SetParent(GoActionStates.transform); - } - } - } + void AddActionStateImg(uint uid) + { + var unit = GameUnitManager.instance.infightUnits.Search(uid); + if (unit == null) + { + return; + } + if (unit.statusData.isOnVehicle) + { + return; + } - void AddDamageGo(uint uid) - { - var unit = GameUnitManager.instance.infightUnits.Search(uid); - if (unit != null) - { - if (unit.statusData.isOnVehicle) - { - return; - } - } - - if (!m_goNumbersMap.ContainsKey(uid)) - { - var prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UICharacterDamage.prefab"); - var go = Instantiate(prefab); - go.transform.SetParent(GoNumbers.transform); - m_goNumbersMap.Add(uid, go); - go.transform.localScale = new Vector3(1, 1, 1); - } - } + if (unit.statusData.isDead) + { + return; + } - void SetBloodPos(GameObject go, GameUnit character) - { - var charPos = character.Node.transform.position;//character.transData.pos; - var originPos = new Vector3(charPos.x , charPos.y, charPos.z); - originPos.y += bloodOffsetY; - var pos = PhxhSDK.Utils.WorldPos2ScreenPos(originPos, CameraManager.Instance.MainCamera); + if (GameUnitManager.instance.infightUnits.Search(uid).gameunitType == EGameUnitType.Character) + { + Character character = GameUnitManager.instance.characterManager.Get(uid); + if (character != null) + { + GameObject Image_State = new GameObject("Image_State"); + RectTransform rect = Image_State.AddComponent(); + Image_State.AddComponent(); + Image_State.SetActive(false); + m_goActionStatesMap.Add(uid, Image_State); + Image_State.transform.SetParent(GoActionStates.transform); + } + } + } - pos = PhxhSDK.Utils.ScreenPos2WorldPos(pos, CameraManager.Instance.UICamera); + void AddDamageGo(uint uid) + { + var unit = GameUnitManager.instance.infightUnits.Search(uid); + if (unit != null) + { + if (unit.statusData.isOnVehicle) + { + return; + } + } - pos = new Vector3(pos.x, pos.y, 0); + if (!m_goNumbersMap.ContainsKey(uid)) + { + var prefab = AssetManager.Instance.LoadAsset("Assets/Art/UI/Prefab/LevelSceneUI/UICharacterDamage.prefab"); + var go = Instantiate(prefab); + go.transform.SetParent(GoNumbers.transform); + m_goNumbersMap.Add(uid, go); + go.transform.localScale = new Vector3(1, 1, 1); + } + } - go.transform.position = pos; - //go.transform.localScale = new Vector3(1, 1, 1); - CommonUtils.SetScaleWithCameraOrgSize(go); - } - - void SetActionStatesPos(GameObject go, Character character) - { - var originPos = character.transData.pos; - originPos.y += stateOffsetY; - originPos.x += stateOffsetX; - var pos = PhxhSDK.Utils.WorldPos2ScreenPos(originPos, CameraManager.Instance.MainCamera); + void SetBloodPos(GameObject go, + GameUnit character) + { + var charPos = character.Node.transform.position; //character.transData.pos; + var originPos = new Vector3(charPos.x, charPos.y, charPos.z); + originPos.y += bloodOffsetY; + var pos = PhxhSDK.Utils.WorldPos2ScreenPos(originPos, CameraManager.Instance.MainCamera); - pos = PhxhSDK.Utils.ScreenPos2WorldPos(pos, CameraManager.Instance.UICamera); + pos = PhxhSDK.Utils.ScreenPos2WorldPos(pos, CameraManager.Instance.UICamera); - pos = new Vector3(pos.x, pos.y, 0); + pos = new Vector3(pos.x, pos.y, 0); - go.transform.position = pos; - go.transform.localScale = new Vector3(1, 1, 1); - } + go.transform.position = pos; + //go.transform.localScale = new Vector3(1, 1, 1); + CommonUtils.SetScaleWithCameraOrgSize(go); + } - //invoke when open window - protected override void OnOpenWindow() - { - EventManager.Instance.Register(EventManager.EventName.INFIGHT_GET_DAMAGED, (Action)OnInjured); - EventManager.Instance.Register(EventManager.EventName.LevelBattleBegin, OnBattleBegin); - EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)OnBattleCharRemove); - EventManager.Instance.Register(EventManager.EventName.INFIGHT_SKILL_START_PAUSE, OnSkillPutting); - EventManager.Instance.Register(EventManager.EventName.INFIGHT_SKILL_END_PAUSE, OnSkillPutEnd); - EventManager.Instance.Register(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action)OnUpVehicle); - EventManager.Instance.Register(EventManager.EventName.LevelFightUIHPInit, (Action)OnHPInit); - } - - //invoke when reload window - protected override void OnReloadWindow() - { - - } - - //invoke when close window - protected override void OnCloseWindow() - { - foreach (var uid in m_fightIDs) - { - ClearGo(uid); - } + void SetActionStatesPos(GameObject go, + Character character) + { + var originPos = character.transData.pos; + originPos.y += stateOffsetY; + originPos.x += stateOffsetX; + var pos = PhxhSDK.Utils.WorldPos2ScreenPos(originPos, CameraManager.Instance.MainCamera); - EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_GET_DAMAGED, (Action)OnInjured); - EventManager.Instance.Unregister(EventManager.EventName.LevelBattleBegin, OnBattleBegin); - EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)OnBattleCharRemove); - EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_SKILL_START_PAUSE, OnSkillPutting); - EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_SKILL_END_PAUSE, OnSkillPutEnd); - EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action)OnUpVehicle); - EventManager.Instance.Unregister(EventManager.EventName.LevelFightUIHPInit, (Action)OnHPInit); - } + pos = PhxhSDK.Utils.ScreenPos2WorldPos(pos, CameraManager.Instance.UICamera); + + pos = new Vector3(pos.x, pos.y, 0); + + go.transform.position = pos; + go.transform.localScale = new Vector3(1, 1, 1); + } + + //invoke when open window + protected override void OnOpenWindow() + { + EventManager.Instance.Register(EventManager.EventName.INFIGHT_GET_DAMAGED, (Action)OnInjured); + EventManager.Instance.Register(EventManager.EventName.LevelBattleBegin, OnBattleBegin); + EventManager.Instance.Register(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)OnBattleCharRemove); + EventManager.Instance.Register(EventManager.EventName.INFIGHT_SKILL_START_PAUSE, OnSkillPutting); + EventManager.Instance.Register(EventManager.EventName.INFIGHT_SKILL_END_PAUSE, OnSkillPutEnd); + EventManager.Instance.Register(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action)OnUpVehicle); + EventManager.Instance.Register(EventManager.EventName.LevelFightUIHPInit, (Action)OnHPInit); + } + + //invoke when reload window + protected override void OnReloadWindow() + { + + } + + //invoke when close window + protected override void OnCloseWindow() + { + foreach (var uid in m_fightIDs) + { + ClearGo(uid); + } + + EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_GET_DAMAGED, (Action)OnInjured); + EventManager.Instance.Unregister(EventManager.EventName.LevelBattleBegin, OnBattleBegin); + EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UNIT_REMOVE, (Action)OnBattleCharRemove); + EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_SKILL_START_PAUSE, OnSkillPutting); + EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_SKILL_END_PAUSE, OnSkillPutEnd); + EventManager.Instance.Unregister(EventManager.EventName.INFIGHT_UP_VEHICLE, (Action)OnUpVehicle); + EventManager.Instance.Unregister(EventManager.EventName.LevelFightUIHPInit, (Action)OnHPInit); + } /********** ���� **********/ private void OnInjured(EventDataGetDamaged damageData) - { - uint uid = damageData.owner.GetID(); - //Character character = GameUnitManager.instance.characterManager.Get(uid); - GameUnit character = GameUnitManager.instance.infightUnits.Search(uid); - - if (!m_goNumbersMap.ContainsKey(uid)) - { - AddDamageGo(uid); - } - var go = m_goNumbersMap[uid]; - var comp = go.GetComponent(); - comp.Injured(damageData, character); - } + { + uint uid = damageData.owner.GetID(); + //Character character = GameUnitManager.instance.characterManager.Get(uid); + GameUnit character = GameUnitManager.instance.infightUnits.Search(uid); - private void OnBattleBegin() - { - var allCharac = GameUnitManager.instance.infightUnits; - var waitIDs = TeamManager.Instance.GetWaitList(); - var fightIDs = TeamManager.Instance.GetFightList(); - for (int i = 0; i < fightIDs.Count; i++) - { - m_fightIDs.Add(fightIDs[i]); - } - for (var i = 0; i < allCharac.count; ++i) - { - var c = allCharac.GetByIndex(i); - if (!fightIDs.Contains(c.GetID()) && !waitIDs.Contains(c.GetID())) - { - m_fightIDs.Add(c.GetID()); - } - } - } + if (!m_goNumbersMap.ContainsKey(uid)) + { + AddDamageGo(uid); + } + var go = m_goNumbersMap[uid]; + var comp = go.GetComponent(); + comp.Injured(damageData, character); + } - private void OnBattleCharRemove(Character character) - { - m_fightIDs.Remove(character.GetID()); - ClearGo(character.GetID()); - } + private void OnBattleBegin() + { + var allCharac = GameUnitManager.instance.infightUnits; + var waitIDs = TeamManager.Instance.GetWaitList(); + var fightIDs = TeamManager.Instance.GetFightList(); + for (int i = 0; i < fightIDs.Count; i++) + { + m_fightIDs.Add(fightIDs[i]); + } + for (var i = 0; i < allCharac.count; ++i) + { + var c = allCharac.GetByIndex(i); + if (!fightIDs.Contains(c.GetID()) && !waitIDs.Contains(c.GetID())) + { + m_fightIDs.Add(c.GetID()); + } + } + } - private void OnSkillPutting() - { - UITipsManager.ShowClickShield(); - } + private void OnBattleCharRemove(Character character) + { + m_fightIDs.Remove(character.GetID()); + ClearGo(character.GetID()); + } - private void OnSkillPutEnd() - { - UITipsManager.CloseClickShield(); - } + private void OnSkillPutting() + { + UITipsManager.ShowClickShield(); + } - private void ClearGo(uint uid) - { - if (m_goBloodsMap.ContainsKey(uid)) - { - Destroy(m_goBloodsMap[uid]); - m_goBloodsMap.Remove(uid); - } - - if (m_goActionStatesMap.ContainsKey(uid)) - { - Destroy(m_goActionStatesMap[uid]); - m_goActionStatesMap.Remove(uid); - } - - if (m_goNumbersMap.ContainsKey(uid)) - { - Destroy(m_goNumbersMap[uid]); - m_goNumbersMap.Remove(uid); - } - } + private void OnSkillPutEnd() + { + UITipsManager.CloseClickShield(); + } - private void OnUpVehicle(GameUnit unit) - { - ClearGo(unit.GetID()); - } + private void ClearGo(uint uid) + { + if (m_goBloodsMap.ContainsKey(uid)) + { + Destroy(m_goBloodsMap[uid]); + m_goBloodsMap.Remove(uid); + } - private void OnHPInit(GameUnit character) - { - if (LevelManager.Instance.CurrentLevel.IsInBattle()) - { - var fightIDs = TeamManager.Instance.GetFightList(); - for (int i = 0; i < fightIDs.Count; i++) - { - if (!m_fightIDs.Contains(fightIDs[i])) - { - m_fightIDs.Add(fightIDs[i]); - } - } - } - } -} \ No newline at end of file + if (m_goActionStatesMap.ContainsKey(uid)) + { + Destroy(m_goActionStatesMap[uid]); + m_goActionStatesMap.Remove(uid); + } + + if (m_goNumbersMap.ContainsKey(uid)) + { + Destroy(m_goNumbersMap[uid]); + m_goNumbersMap.Remove(uid); + } + } + + private void OnUpVehicle(GameUnit unit) + { + ClearGo(unit.GetID()); + } + + private void OnHPInit(GameUnit character) + { + if (LevelManager.Instance.CurrentLevel.IsInBattle()) + { + var fightIDs = TeamManager.Instance.GetFightList(); + for (int i = 0; i < fightIDs.Count; i++) + { + if (!m_fightIDs.Contains(fightIDs[i])) + { + m_fightIDs.Add(fightIDs[i]); + } + } + } + } +} diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/Data/UnitContainer.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/Data/UnitContainer.cs index 9ce08a62ab4..65596095d54 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/Data/UnitContainer.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/Data/UnitContainer.cs @@ -6,6 +6,14 @@ namespace Gameplay.Unit.Data private List _unitList = new List(); private Dictionary _unitDict = new Dictionary(); + public List unitList + { + get + { + return _unitList; + } + } + public int count { get; private set; } public void Add(GameUnit unit) @@ -46,6 +54,11 @@ namespace Gameplay.Unit.Data count--; } + public bool Contains(uint guid) + { + return _unitDict.ContainsKey(guid); + } + public GameUnit Search(uint guid) { if (_unitDict.TryGetValue(guid, out var unit)) diff --git a/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/GameUnitManager.cs b/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/GameUnitManager.cs index 525121a9350..46328fed846 100644 --- a/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/GameUnitManager.cs +++ b/ProjectNLD/Assets/Code/Scripts/Gameplay/Unit/GameUnitManager.cs @@ -191,6 +191,14 @@ namespace Gameplay.Unit infightUnits.Remove(unit); prepareUnits.Add(unit); + switch (unit.gameunitType) + { + case EGameUnitType.Character: + if (unit is Character.Character character) + characterManager.RemoveCharacter(character); + break; + } + DebugUtil.LogG($"单位:{unit.GetID()} 从战斗列表回到备战席"); } @@ -267,6 +275,14 @@ namespace Gameplay.Unit unit.ExitBattle(); infightUnits.Remove(unit); deadUnits.Add(unit); + + switch (unit.gameunitType) + { + case EGameUnitType.Character: + if (unit is Character.Character character) + characterManager.RemoveCharacter(character); + break; + } } private void _UpdateTargets() @@ -295,8 +311,18 @@ namespace Gameplay.Unit { var unit = infightUnits.GetByIndex(i); unit.ExitBattle(); + unit.Dispose(); + } + for (int i = 0; i < prepareUnits.count; i++) + { + var unit = prepareUnits.GetByIndex(i); + unit.Dispose(); + } + for (int i = 0; i < deadUnits.count; i++) + { + var unit = deadUnits.GetByIndex(i); + unit.Dispose(); } - characterManager.Dispose(); instance = null; }