MusicBeat
This commit is contained in:
@@ -16,24 +16,24 @@ namespace Cielonos.MainGame
|
||||
Farthest
|
||||
}
|
||||
|
||||
public List<CharacterBase> activeEnemiesList;
|
||||
public List<Enemy> activeEnemiesList;
|
||||
|
||||
/// <summary>
|
||||
/// 敌人从活跃列表中移除时触发(即敌人死亡/离场)。
|
||||
/// 参数为被移除的敌人实例。
|
||||
/// </summary>
|
||||
public event Action<CharacterBase> OnEnemyRemoved;
|
||||
public event Action<Enemy> OnEnemyRemoved;
|
||||
|
||||
public EnemySubmodule(CombatManager owner) : base(owner)
|
||||
{
|
||||
activeEnemiesList = new List<CharacterBase>();
|
||||
activeEnemiesList = new List<Enemy>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 将敌人从活跃列表中移除并触发 OnEnemyRemoved 事件。
|
||||
/// 由 Automata.Die() 调用,替代直接操作 activeEnemiesList。
|
||||
/// </summary>
|
||||
public void RemoveEnemy(CharacterBase enemy)
|
||||
public void RemoveEnemy(Enemy enemy)
|
||||
{
|
||||
if (!activeEnemiesList.Remove(enemy)) return;
|
||||
OnEnemyRemoved?.Invoke(enemy);
|
||||
@@ -47,10 +47,10 @@ namespace Cielonos.MainGame
|
||||
activeEnemiesList.Clear();
|
||||
}
|
||||
|
||||
public List<CharacterBase> GetEnemiesInRadius(Vector3 origin, float radius, SortingType sortingType = SortingType.Nearest)
|
||||
public List<Enemy> GetEnemiesInRadius(Vector3 origin, float radius, SortingType sortingType = SortingType.Nearest)
|
||||
{
|
||||
List<CharacterBase> enemiesInRadius = new List<CharacterBase>();
|
||||
foreach (CharacterBase enemy in activeEnemiesList)
|
||||
List<Enemy> enemiesInRadius = new List<Enemy>();
|
||||
foreach (Enemy enemy in activeEnemiesList)
|
||||
{
|
||||
float enemyRadius = enemy.collisionSc.useCharacterController
|
||||
? enemy.collisionSc.characterController.radius
|
||||
@@ -78,12 +78,12 @@ namespace Cielonos.MainGame
|
||||
/// <summary>
|
||||
/// 获取所有可见敌人
|
||||
/// </summary>
|
||||
public List<CharacterBase> GetVisibleEnemies(float radius = 50f)
|
||||
public List<Enemy> GetVisibleEnemies(float radius = 50f)
|
||||
{
|
||||
List<CharacterBase> result = new List<CharacterBase>();
|
||||
List<CharacterBase> enemies = GetEnemiesInRadius(Player.transform.position, radius);
|
||||
List<Enemy> result = new List<Enemy>();
|
||||
List<Enemy> enemies = GetEnemiesInRadius(Player.transform.position, radius);
|
||||
|
||||
foreach (CharacterBase enemy in enemies)
|
||||
foreach (Enemy enemy in enemies)
|
||||
{
|
||||
if (enemy == null || enemy.statusSm.isDead) continue;
|
||||
|
||||
@@ -104,9 +104,9 @@ namespace Cielonos.MainGame
|
||||
/// <summary>
|
||||
/// 获取按屏幕X坐标从左到右排序的可见敌人列表
|
||||
/// </summary>
|
||||
public List<CharacterBase> GetVisibleEnemiesSortedByScreenX(float radius = 50f)
|
||||
public List<Enemy> GetVisibleEnemiesSortedByScreenX(float radius = 50f)
|
||||
{
|
||||
List<CharacterBase> visibleEnemies = GetVisibleEnemies(radius);
|
||||
List<Enemy> visibleEnemies = GetVisibleEnemies(radius);
|
||||
|
||||
visibleEnemies.Sort((a, b) =>
|
||||
{
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace Cielonos.MainGame
|
||||
/// <summary>
|
||||
/// 从已有的敌人列表中选取评分最高的目标。
|
||||
/// </summary>
|
||||
public CharacterBase GetBestEnemy(List<CharacterBase> enemies)
|
||||
public Enemy GetBestEnemy(List<Enemy> enemies)
|
||||
{
|
||||
if (enemies.Count == 0) return null;
|
||||
if (enemies.Count == 1) return enemies[0];
|
||||
@@ -33,7 +33,7 @@ namespace Cielonos.MainGame
|
||||
/// 从已有的敌人列表中进行评分,返回完整的评分列表(按分数从高到低)。
|
||||
/// 适合后续通过 ApplyScoreModifier 施加修正。
|
||||
/// </summary>
|
||||
public List<TargetingScore> GetScoredEnemies(List<CharacterBase> enemies,
|
||||
public List<TargetingScore> GetScoredEnemies(List<Enemy> enemies,
|
||||
float radius = float.MaxValue, Transform origin = null)
|
||||
{
|
||||
List<TargetingScore> allScores = GetScoredEnemies(radius, origin);
|
||||
@@ -55,12 +55,12 @@ namespace Cielonos.MainGame
|
||||
/// 获取可被扰乱的敌人列表:
|
||||
/// <para>目前获取的是当前可以受到Disruption打断,且有对应Buff(黄光,红光等)的敌人</para>
|
||||
/// </summary>
|
||||
public List<CharacterBase> GetDisruptableEnemies(List<CharacterBase> enemies,
|
||||
public List<Enemy> GetDisruptableEnemies(List<Enemy> enemies,
|
||||
Breakthrough.Type breakthroughType = Breakthrough.Type.Disruption)
|
||||
{
|
||||
List<CharacterBase> disruptableEnemies = new List<CharacterBase>();
|
||||
List<Enemy> disruptableEnemies = new List<Enemy>();
|
||||
|
||||
foreach (CharacterBase enemy in enemies)
|
||||
foreach (Enemy enemy in enemies)
|
||||
{
|
||||
bool hasBuff = enemy.buffSm.HasBuff<BreakthroughResistanceModification>();
|
||||
if (!enemy.reactionSc.breakthroughResistances[breakthroughType].Value && hasBuff)
|
||||
|
||||
@@ -15,7 +15,7 @@ namespace Cielonos.MainGame
|
||||
/// </summary>
|
||||
public struct TargetingScore
|
||||
{
|
||||
public CharacterBase target;
|
||||
public Enemy target;
|
||||
/// <summary>最终评分 = baseScore + bonusScore。</summary>
|
||||
public float totalScore;
|
||||
/// <summary>基础加权评分(由 GetScoredEnemies 计算,不受后续修正影响)。</summary>
|
||||
@@ -61,7 +61,7 @@ namespace Cielonos.MainGame
|
||||
origin = Player.transform;
|
||||
}
|
||||
|
||||
List<CharacterBase> candidates = GetEnemiesInRadius(origin.position, radius);
|
||||
List<Enemy> candidates = GetEnemiesInRadius(origin.position, radius);
|
||||
if (candidates.Count == 0) return new List<TargetingScore>();
|
||||
|
||||
Camera camera = Player.viewSc.playerCamera;
|
||||
@@ -111,7 +111,7 @@ namespace Cielonos.MainGame
|
||||
|
||||
List<TargetingScore> results = new List<TargetingScore>(candidates.Count);
|
||||
|
||||
foreach (CharacterBase enemy in candidates)
|
||||
foreach (Enemy enemy in candidates)
|
||||
{
|
||||
if (enemy == null || enemy.statusSm.isDead) continue;
|
||||
|
||||
@@ -178,11 +178,11 @@ namespace Cielonos.MainGame
|
||||
/// <summary>
|
||||
/// 综合索敌的便捷方法:返回评分最高的单个敌人。
|
||||
/// </summary>
|
||||
public CharacterBase GetBestEnemy(float radius, Transform origin = null, Func<CharacterBase> overrideCandidate = null)
|
||||
public Enemy GetBestEnemy(float radius, Transform origin = null, Func<Enemy> overrideCandidate = null)
|
||||
{
|
||||
if (overrideCandidate != null)
|
||||
{
|
||||
CharacterBase oc = overrideCandidate();
|
||||
Enemy oc = overrideCandidate();
|
||||
if (oc != null)
|
||||
{
|
||||
return oc;
|
||||
@@ -196,10 +196,10 @@ namespace Cielonos.MainGame
|
||||
/// <summary>
|
||||
/// 综合索敌的便捷方法:返回评分前 N 的敌人列表。
|
||||
/// </summary>
|
||||
public List<CharacterBase> GetBestEnemies(float radius, int count, Transform origin = null)
|
||||
public List<Enemy> GetBestEnemies(float radius, int count, Transform origin = null)
|
||||
{
|
||||
List<TargetingScore> scores = GetScoredEnemies(radius, origin);
|
||||
List<CharacterBase> result = new List<CharacterBase>(Mathf.Min(count, scores.Count));
|
||||
List<Enemy> result = new List<Enemy>(Mathf.Min(count, scores.Count));
|
||||
for (int i = 0; i < scores.Count && i < count; i++)
|
||||
{
|
||||
result.Add(scores[i].target);
|
||||
@@ -214,7 +214,7 @@ namespace Cielonos.MainGame
|
||||
{
|
||||
return GetBestEnemy(50f, null, ReturnLockon);
|
||||
|
||||
CharacterBase ReturnLockon()
|
||||
Enemy ReturnLockon()
|
||||
{
|
||||
LockTargetSubmodule lockModule = MainGameManager.Player.viewSc.lockTargetModule;
|
||||
if (lockModule.isLocking && lockModule.lockTarget != null)
|
||||
@@ -229,17 +229,17 @@ namespace Cielonos.MainGame
|
||||
|
||||
public partial class EnemySubmodule
|
||||
{
|
||||
public CharacterBase GetNearestEnemy(float radius, Transform origin = null)
|
||||
public Enemy GetNearestEnemy(float radius, Transform origin = null)
|
||||
{
|
||||
origin ??= Player.transform;
|
||||
List<CharacterBase> candidates = GetEnemiesInRadius(origin.position, radius);
|
||||
List<Enemy> candidates = GetEnemiesInRadius(origin.position, radius);
|
||||
return candidates.FirstOrDefault();
|
||||
}
|
||||
|
||||
public List<CharacterBase> GetNearestEnemies(float radius, int count, Transform origin = null)
|
||||
public List<Enemy> GetNearestEnemies(float radius, int count, Transform origin = null)
|
||||
{
|
||||
origin ??= Player.transform;
|
||||
List<CharacterBase> candidates = GetEnemiesInRadius(origin.position, radius);
|
||||
List<Enemy> candidates = GetEnemiesInRadius(origin.position, radius);
|
||||
return candidates.Take(count).ToList();
|
||||
}
|
||||
}
|
||||
@@ -249,11 +249,11 @@ namespace Cielonos.MainGame
|
||||
{
|
||||
public static List<CombatManager.EnemySubmodule.TargetingScore> ApplyScoreModifier(
|
||||
this List<CombatManager.EnemySubmodule.TargetingScore> scores,
|
||||
List<CharacterBase> boostTargets, float amplifier, float offset = 0)
|
||||
List<Enemy> boostTargets, float amplifier, float offset = 0)
|
||||
{
|
||||
return scores.ApplyScoreModifier(Predicate, amplifier, offset);
|
||||
|
||||
bool Predicate(CharacterBase target)
|
||||
bool Predicate(Enemy target)
|
||||
{
|
||||
return boostTargets != null && boostTargets.Contains(target);
|
||||
}
|
||||
@@ -261,7 +261,7 @@ namespace Cielonos.MainGame
|
||||
|
||||
public static List<CombatManager.EnemySubmodule.TargetingScore> ApplyScoreModifier(
|
||||
this List<CombatManager.EnemySubmodule.TargetingScore> scores,
|
||||
Predicate<CharacterBase> match, float amplifier, float offset = 0)
|
||||
Predicate<Enemy> match, float amplifier, float offset = 0)
|
||||
{
|
||||
bool changed = false;
|
||||
for (int i = 0; i < scores.Count; i++)
|
||||
@@ -283,14 +283,14 @@ namespace Cielonos.MainGame
|
||||
return scores;
|
||||
}
|
||||
|
||||
public static CharacterBase BestEnemy(this List<CombatManager.EnemySubmodule.TargetingScore> scores)
|
||||
public static Enemy BestEnemy(this List<CombatManager.EnemySubmodule.TargetingScore> scores)
|
||||
{
|
||||
return scores.Count > 0 ? scores[0].target : null;
|
||||
}
|
||||
|
||||
public static List<CharacterBase> BestEnemies(this List<CombatManager.EnemySubmodule.TargetingScore> scores, int count)
|
||||
public static List<Enemy> BestEnemies(this List<CombatManager.EnemySubmodule.TargetingScore> scores, int count)
|
||||
{
|
||||
List<CharacterBase> result = new List<CharacterBase>(Mathf.Min(count, scores.Count));
|
||||
List<Enemy> result = new List<Enemy>(Mathf.Min(count, scores.Count));
|
||||
for (int i = 0; i < scores.Count && i < count; i++)
|
||||
{
|
||||
result.Add(scores[i].target);
|
||||
|
||||
Reference in New Issue
Block a user