From 51b0f6ed9f4e1d3bb6f8144470b46908c7699a96 Mon Sep 17 00:00:00 2001
From: yyl <yyl>
Date: 星期一, 11 五月 2026 16:20:37 +0800
Subject: [PATCH] Merge branch 'master' into h5version
---
Main/System/Battle/BattleObject/BattleObjMgr.cs | 275 +++++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 239 insertions(+), 36 deletions(-)
diff --git a/Main/System/Battle/BattleObject/BattleObjMgr.cs b/Main/System/Battle/BattleObject/BattleObjMgr.cs
index ec938e1..9b301df 100644
--- a/Main/System/Battle/BattleObject/BattleObjMgr.cs
+++ b/Main/System/Battle/BattleObject/BattleObjMgr.cs
@@ -3,48 +3,215 @@
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
+using Cysharp.Threading.Tasks;
public class BattleObjMgr
{
// 姝讳骸涓嶅彲浠ュ皢BattleObject绉诲嚭瀛楀吀/鍒楄〃
- public List<BattleObject> redCampList => new List<BattleObject>(redCampDict.Values);
- public List<BattleObject> blueCampList => new List<BattleObject>(blueCampDict.Values);
+ // 缂撳瓨闃佃惀鍒楄〃锛屼粎鍦ㄥ瓧鍏稿彉鏇存椂閲嶅缓锛岄伩鍏嶆瘡娆″睘鎬ц闂垎閰嶆柊List
+ private List<BattleObject> _redCampListCache;
+ private List<BattleObject> _blueCampListCache;
+ private bool _redCampDirty = true;
+ private bool _blueCampDirty = true;
+ public List<BattleObject> redCampList
+ {
+ get
+ {
+ if (_redCampDirty || _redCampListCache == null)
+ {
+ if (_redCampListCache == null) _redCampListCache = new List<BattleObject>(redCampDict.Count);
+ else _redCampListCache.Clear();
+ foreach (var kv in redCampDict) _redCampListCache.Add(kv.Value);
+ _redCampDirty = false;
+ }
+ return _redCampListCache;
+ }
+ }
+ public List<BattleObject> blueCampList
+ {
+ get
+ {
+ if (_blueCampDirty || _blueCampListCache == null)
+ {
+ if (_blueCampListCache == null) _blueCampListCache = new List<BattleObject>(blueCampDict.Count);
+ else _blueCampListCache.Clear();
+ foreach (var kv in blueCampDict) _blueCampListCache.Add(kv.Value);
+ _blueCampDirty = false;
+ }
+ return _blueCampListCache;
+ }
+ }
private Dictionary<int, BattleObject> redCampDict = new Dictionary<int, BattleObject>();
private Dictionary<int, BattleObject> blueCampDict = new Dictionary<int, BattleObject>();
- protected Dictionary<int, BattleObject> allBattleObjDict = new Dictionary<int, BattleObject>();
+ public Dictionary<int, BattleObject> allBattleObjDict = new Dictionary<int, BattleObject>();
+
+ public MinggeBattleObject redMingge = null;
+
+ public MinggeBattleObject blueMingge = null;
protected BattleField battleField;
- public void Init(BattleField _battleField, TeamBase _redTeam, TeamBase _blueTeam)
+ public async UniTask Init(BattleField _battleField, TeamBase _redTeam, TeamBase _blueTeam)
{
- battleField = _battleField;
- CreateTeam(battleField.battleRootNode.redTeamNodeList, redCampDict, _redTeam, BattleCamp.Red);
- CreateTeam(battleField.battleRootNode.blueTeamNodeList, blueCampDict, _blueTeam, BattleCamp.Blue);
- }
+ await Reload(_battleField, _redTeam, _blueTeam);
+ }
- protected void CreateTeam(List<GameObject> posNodeList, Dictionary<int, BattleObject> campDict, TeamBase teamBase, BattleCamp _Camp)
+ public async UniTask Reload(BattleField _battleField, TeamBase _redTeam, TeamBase _blueTeam)
+ {
+ Release();
+ battleField = _battleField;
+ await ReloadTeam(_redTeam, BattleCamp.Red);
+ await ReloadTeam(_blueTeam, BattleCamp.Blue, false); }
+
+ public async UniTask ReloadTeam(TeamBase teamBase, BattleCamp _camp, bool active = true)
+ {
+ var posNodeList = _camp == BattleCamp.Red ? battleField.battleRootNode.redTeamNodeList : battleField.battleRootNode.blueTeamNodeList;
+ var campDict = _camp == BattleCamp.Red ? redCampDict : blueCampDict;
+ await CreateTeam(posNodeList, campDict, teamBase, _camp, active);
+ }
+
+ private void MarkCampDirty(Dictionary<int, BattleObject> campDict)
+ {
+ if (campDict == redCampDict) _redCampDirty = true;
+ else if (campDict == blueCampDict) _blueCampDirty = true;
+ }
+
+ protected async UniTask CreateTeam(List<GameObject> posNodeList, Dictionary<int, BattleObject> campDict, TeamBase teamBase, BattleCamp _Camp, bool active)
{
DestroyTeam(campDict);
- for (int i = 0; i < teamBase.teamHeros.Length; i++)
+ if (teamBase == null)
{
- TeamHero teamHero = teamBase.teamHeros[i];
+ return;
+ }
+
+
+ for (int i = 0; i < teamBase.serverHeroes.Length; i++)
+ {
+ TeamHero teamHero = teamBase.serverHeroes[i];
if (teamHero != null)
{
- BattleObject battleObj = BattleObjectFactory.CreateBattleObject(battleField, posNodeList, teamHero, _Camp);
- allBattleObjDict.Add(battleObj.BattleObjectId, battleObj);
- campDict.Add(teamHero.heroIndex, battleObj);
+ BattleObject battleObj = await BattleObjectFactory.CreateBattleObjectAsync(battleField, posNodeList, teamHero, _Camp);
+ battleObj.SetActive(active);
+ allBattleObjDict.Add(battleObj.ObjID, battleObj);
+ campDict.Add(battleObj.GetPositionNum(), battleObj);
+ battleObj.SetSpeedRatio(battleField.speedRatio);
+ }
+ }
+ MarkCampDirty(campDict);
+
+ if (teamBase.teamMingge != null)
+ {
+ BattleObject minggeObj = BattleObjectFactory.CreateMinggeBattleObject(battleField, teamBase, _Camp);
+ allBattleObjDict.Add(minggeObj.ObjID, minggeObj);
+ campDict.Add(minggeObj.GetPositionNum(), minggeObj);
+ minggeObj.SetSpeedRatio(battleField.speedRatio);
+ if (_Camp == BattleCamp.Red)
+ {
+ redMingge = minggeObj as MinggeBattleObject;
+ }
+ else
+ {
+ blueMingge = minggeObj as MinggeBattleObject;
}
}
}
- public BattleObject GetBattleObject(int battleObjId)
+ public BattleObject GetBattleObject(int objId)
{
- if (allBattleObjDict.TryGetValue(battleObjId, out BattleObject battleObj))
+ if (allBattleObjDict.TryGetValue(objId, out BattleObject battleObj))
{
return battleObj;
}
+
+ if (blueMingge != null && blueMingge.ObjID == objId)
+ {
+ return blueMingge;
+ }
+
+ if (redMingge != null && redMingge.ObjID == objId)
+ {
+ return redMingge;
+ }
+
return null;
+ }
+
+ public MinggeBattleObject GetMinggeBattleObject(BattleCamp camp)
+ {
+ if (camp == BattleCamp.Red)
+ {
+ return redMingge;
+ }
+ else
+ {
+ return blueMingge;
+ }
+ }
+
+ public List<BattleObject> GetBattleObjList(BattleCamp _Camp)
+ {
+ if (_Camp == BattleCamp.Red)
+ {
+ return redCampList;
+ }
+ else
+ {
+ return blueCampList;
+ }
+ }
+
+ public List<BattleObject> GetBattleObjList(HB427_tagSCUseSkill tagUseSkillAttack)
+ {
+ List<BattleObject> retList = new List<BattleObject>();
+ foreach (var hurt in tagUseSkillAttack.HurtList)
+ {
+ BattleObject obj = GetBattleObject((int)hurt.ObjID);
+ if (null != obj)
+ {
+ retList.Add(obj);
+ }
+ }
+
+ return retList;
+ }
+
+ public void DestroyTeam(BattleCamp battleCamp)
+ {
+ Dictionary<int, BattleObject> campDict = battleCamp == BattleCamp.Red ? redCampDict : blueCampDict;
+ if (campDict == null)
+ {
+ return;
+ }
+
+ DestroyTeam(campDict);
+ }
+
+ public void DestroyObjIds(uint[] objIDs)
+ {
+ if (objIDs == null || objIDs.Length == 0)
+ {
+ return;
+ }
+
+ foreach (var objID in objIDs)
+ {
+ if (allBattleObjDict.TryGetValue((int)objID, out BattleObject battleObj))
+ {
+ if (battleObj.Camp == BattleCamp.Red)
+ {
+ redCampDict.Remove(battleObj.GetPositionNum());
+ _redCampDirty = true;
+ }
+ else
+ {
+ blueCampDict.Remove(battleObj.GetPositionNum());
+ _blueCampDirty = true;
+ }
+ allBattleObjDict.Remove((int)objID);
+ BattleObjectFactory.DestroyBattleObject((int)objID, battleObj);
+ }
+ }
}
protected void DestroyTeam(Dictionary<int, BattleObject> campDict)
@@ -52,20 +219,44 @@
foreach (var item in campDict)
{
BattleObject battleObj = item.Value;
+ var positionNum = item.Key;
if (battleObj != null)
{
- allBattleObjDict.Remove(battleObj.BattleObjectId);
- BattleObjectFactory.DestroyBattleObject(item.Key, battleObj);
+ allBattleObjDict.Remove(battleObj.ObjID);
+ BattleObjectFactory.DestroyBattleObject(battleObj.ObjID, battleObj);
}
}
campDict.Clear();
-
+ MarkCampDirty(campDict);
}
- public void Release()
+ // 绌洪棽鐘舵��
+ public virtual void HaveRest(BattleCamp _Camp)
+ {
+ // 浼戞伅鐘舵��
+ if (_Camp == BattleCamp.Red)
+ {
+ foreach (var item in redCampDict.Values)
+ {
+ item.HaveRest();
+ }
+ }
+ else
+ {
+ foreach (var item in blueCampDict.Values)
+ {
+ item.HaveRest();
+ }
+ }
+ }
+
+ public virtual void Release()
{
DestroyTeam(redCampDict);
DestroyTeam(blueCampDict);
+ allBattleObjDict.Clear();
+ redMingge = null;
+ blueMingge = null;
}
public void Run()
@@ -127,7 +318,29 @@
return blueCampList;
}
-#if UNITY_EDITOR
+ public BattleObject GetBattleObjectByIndex(BattleCamp camp, int selfIndex)
+ {
+ if (camp == BattleCamp.Red)
+ {
+ redCampDict.TryGetValue(selfIndex, out BattleObject battleObj);
+ return battleObj;
+ }
+ else
+ {
+ blueCampDict.TryGetValue(selfIndex, out BattleObject battleObj);
+ return battleObj;
+ }
+ }
+
+ public void SetSpeedRatio(float ratio)
+ {
+ foreach (var obj in allBattleObjDict.Values)
+ {
+ obj.SetSpeedRatio(ratio);
+ }
+ }
+
+#if UNITY_EDITOR_STOP_USING
public void ReviveAll()
{
foreach (var kv in allBattleObjDict)
@@ -168,7 +381,7 @@
//鏆傛椂娌℃湁鍙敜鐗�
// 鏀惧湪绗�7鏍肩殑BOSS鍚庢帓鐨勩�傘�備綅缃斁鍦ㄦ涓棿
// a)鍓嶆帓,1銆�2銆�3鍙蜂负鍓嶆帓,鍓嶆帓鍏ㄩ儴闃典骸鍚�,4銆�5銆�6鍙峰嵆鏄墠鎺掍篃鏄悗鎺� 7鍏跺疄涔熸槸鍚庢帓
- List<BattleObject> frontList = new List<BattleObject>(from BO in returnList where BO.teamHero.heroIndex < 3 && !BO.IsDead() select BO);
+ List<BattleObject> frontList = new List<BattleObject>(from BO in returnList where BO.GetPositionNum() < 3 && !BO.IsDead() select BO);
if (frontList.Count == 0)
{
frontList.AddRange(returnList);
@@ -176,7 +389,7 @@
returnList = frontList;
break;
case SkillTargetRangeType.Back:
- List<BattleObject> backList = new List<BattleObject>(from BO in returnList where BO.teamHero.heroIndex >= 3 && !BO.IsDead() select BO);
+ List<BattleObject> backList = new List<BattleObject>(from BO in returnList where BO.GetPositionNum() >= 3 && !BO.IsDead() select BO);
if (backList.Count == 0)
{
backList.AddRange(returnList);
@@ -198,18 +411,8 @@
case SkillTargetRangeType.HighestAttack:
returnList = new List<BattleObject>(from BO in returnList where !BO.IsDead() select BO);
BattleObject mostHighestAttckObj = null;
- for (int i = 0; i < returnList.Count; i++)
- {
- if (mostHighestAttckObj == null)
- {
- mostHighestAttckObj = returnList[i];
- continue;
- }
- if (returnList[i].teamHero.attack > mostHighestAttckObj.teamHero.attack)
- {
- mostHighestAttckObj = returnList[i];
- }
- }
+ // 瀹㈡埛绔笉鍖呭惈鏁版嵁 杩欓噷鍙栫涓�涓�
+ mostHighestAttckObj = returnList[0];
returnList.Clear();
if (mostHighestAttckObj != null)
returnList.Add(mostHighestAttckObj);
@@ -224,7 +427,7 @@
loweastHpObj = returnList[i];
continue;
}
- if (returnList[i].teamHero.curHp < loweastHpObj.teamHero.curHp)
+ if (returnList[i].GetCurHp() < loweastHpObj.GetCurHp())
{
loweastHpObj = returnList[i];
}
--
Gitblit v1.8.0