```
feat(buildings): 添加金矿建筑功能并优化建筑健康系统 - 为兵营和金矿添加伤害数字显示功能,包括持续时间、上升高度等参数 - 将金矿脚本重构为GoldMine组件,实现定时产出金币机制 - 为所有单位添加NavMeshAgent组件以支持导航寻路 - 为弓箭手、法师等单位添加分离半径和目标扩散参数 - 为建筑添加碰撞体和标签设置 - 修复当前能量字段命名规范(currentEnergy -> _currentEnergy) - 调整金矿健康值从100提升至500 - 统一伤害数字显示相关属性配置 ```
This commit is contained in:
1 parent
27df2aa8b1
commit
1cdb7c3910
22 files changed
+804
-55
No files matched your search
@@ -86,12 +86,19 @@ public class UnitBase : MonoBehaviour
|
||||
//初始位置坐标
|
||||
private Vector3 startPos;
|
||||
|
||||
// NavMesh 寻路更新间隔(优化性能)
|
||||
private float nextPathUpdateTime = 0f;
|
||||
private const float PathUpdateInterval = 0.5f; // 每 0.5 秒更新一次路径
|
||||
|
||||
//动画控制器
|
||||
private Animator animator;
|
||||
|
||||
// 角色控制器
|
||||
private CharacterController controller;
|
||||
|
||||
// NavMesh 寻路代理(如果有的话优先使用)
|
||||
private UnityEngine.AI.NavMeshAgent navAgent;
|
||||
|
||||
// 自身的血条组件,同时负责显示技能能量条。
|
||||
private WorldHealthBar worldHealthBar;
|
||||
|
||||
@@ -154,10 +161,27 @@ public class UnitBase : MonoBehaviour
|
||||
//初始化
|
||||
animator = GetComponent<Animator>();
|
||||
controller = GetComponent<CharacterController>();
|
||||
navAgent = GetComponent<UnityEngine.AI.NavMeshAgent>();
|
||||
worldHealthBar = GetComponent<WorldHealthBar>();
|
||||
statusEffectController = EnsureStatusEffectController();
|
||||
unitSkill = GetComponent<UnitSkill>();
|
||||
|
||||
// 如果有 NavMeshAgent,配置它并禁用 CharacterController
|
||||
if (navAgent != null)
|
||||
{
|
||||
navAgent.speed = speed;
|
||||
navAgent.angularSpeed = 120f;
|
||||
navAgent.acceleration = 8f;
|
||||
navAgent.stoppingDistance = attackRange * 0.95f; // 接近攻击范围边缘时停止
|
||||
navAgent.autoBraking = true;
|
||||
|
||||
// 禁用 CharacterController,避免冲突
|
||||
if (controller != null)
|
||||
{
|
||||
controller.enabled = false;
|
||||
}
|
||||
}
|
||||
|
||||
// 大多数角色由 CharacterController 位移;特殊攻击动作可保留动画根运动。
|
||||
animator.applyRootMotion = useRootMotion;
|
||||
//记录初始坐标
|
||||
@@ -194,6 +218,12 @@ public class UnitBase : MonoBehaviour
|
||||
//攻击状态下等待Animator报告攻击动画播放完成。
|
||||
if (state == State.Attack)
|
||||
{
|
||||
// 攻击时直接禁用 NavMeshAgent,彻底停止移动
|
||||
if (navAgent != null && navAgent.enabled)
|
||||
{
|
||||
navAgent.enabled = false;
|
||||
}
|
||||
|
||||
animator.SetInteger("speed", 0);
|
||||
attackElapsedTime += Time.deltaTime;
|
||||
applyGravity();
|
||||
@@ -270,7 +300,7 @@ public class UnitBase : MonoBehaviour
|
||||
return false;
|
||||
}
|
||||
|
||||
healthBar.TakeDamage(ModifyIncomingDamage(damage, attacker));
|
||||
healthBar.TakeDamage(ModifyIncomingDamage(damage, attacker), attacker);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -333,11 +363,10 @@ public class UnitBase : MonoBehaviour
|
||||
return false;
|
||||
}
|
||||
|
||||
// 将双方控制器半径计入判定,避免碰撞体互相阻挡时无法进入攻击距离。
|
||||
float selfRadius = GetHorizontalCollisionRadius(controller);
|
||||
CharacterController opponentController = opponent.GetComponent<CharacterController>();
|
||||
float opponentRadius = GetHorizontalCollisionRadius(opponentController);
|
||||
float reachDistance = selfRadius + opponentRadius + attackRange;
|
||||
// NavMeshAgent 会保持一定距离,所以增加额外的攻击范围缓冲
|
||||
// 原来的逻辑:selfRadius + opponentRadius + attackRange
|
||||
// 现在:直接使用 attackRange,并增加 1.5 米的缓冲,让单位在更远距离就能攻击
|
||||
float reachDistance = attackRange + 1.5f;
|
||||
return Vector3.Distance(transform.position, opponent.transform.position) <= reachDistance;
|
||||
}
|
||||
|
||||
@@ -465,6 +494,12 @@ public class UnitBase : MonoBehaviour
|
||||
{
|
||||
target = friend;
|
||||
|
||||
// 攻击时直接禁用 NavMeshAgent(彻底停止移动)
|
||||
if (navAgent != null && navAgent.enabled)
|
||||
{
|
||||
navAgent.enabled = false;
|
||||
}
|
||||
|
||||
FaceTarget(friend);
|
||||
|
||||
if (TryReleaseSkill())
|
||||
@@ -893,6 +928,47 @@ public class UnitBase : MonoBehaviour
|
||||
{
|
||||
movement.y = 0;
|
||||
|
||||
// 如果有 NavMeshAgent,使用它来移动
|
||||
if (navAgent != null)
|
||||
{
|
||||
// 重新启用 NavMeshAgent(攻击后可能被禁用)
|
||||
if (!navAgent.enabled)
|
||||
{
|
||||
navAgent.enabled = true;
|
||||
}
|
||||
|
||||
if (navAgent.isOnNavMesh)
|
||||
{
|
||||
// 确保没有被停止
|
||||
if (navAgent.isStopped)
|
||||
{
|
||||
navAgent.isStopped = false;
|
||||
}
|
||||
|
||||
// 限制寻路更新频率(性能优化)
|
||||
if (Time.time >= nextPathUpdateTime)
|
||||
{
|
||||
// 设置目标位置(相对于当前位置)
|
||||
Vector3 targetPosition = transform.position + movement.normalized * 10f;
|
||||
navAgent.SetDestination(targetPosition);
|
||||
nextPathUpdateTime = Time.time + PathUpdateInterval;
|
||||
}
|
||||
|
||||
// 根据速度设置动画
|
||||
if (navAgent.velocity.magnitude > 0.1f)
|
||||
{
|
||||
animator.SetInteger("speed", 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
animator.SetInteger("speed", 0);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// 否则使用 CharacterController(旧方式)
|
||||
//友军分离力:与过近的同阵营单位互相推开,避免扎堆
|
||||
Vector3 separation = ComputeSeparation();
|
||||
if (separation.sqrMagnitude > 0.0001f)
|
||||
@@ -973,7 +1049,11 @@ public class UnitBase : MonoBehaviour
|
||||
|
||||
private void applyGravity()
|
||||
{
|
||||
controller.Move(Vector3.up * getVerticalVelocity() * Time.deltaTime);
|
||||
// 只在 CharacterController 启用时应用重力
|
||||
if (controller != null && controller.enabled)
|
||||
{
|
||||
controller.Move(Vector3.up * getVerticalVelocity() * Time.deltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
// 在 Scene 视图中标记箭的发射位置和方向,便于调整空物体。
|
||||
|
||||
Reference in new issue
Block a user