首页/ 第 14 章 · 3D 游戏进阶/ 第 249 课
LESSON 249 · 3D 游戏进阶

3D 玩家状态与角色系统

角色系统完成。下一课 3D 章综合练习:完整小型 3D 游戏。

⏱ 约 15 分钟📊 难度:入门🗂 第 14 章 · 3D 游戏进阶📍 第 249 / 300 课
课程进度
249 / 300

🎯本节学习目标

  • 设计角色数据结构
  • 实现状态组件
  • 实现技能系统

🚀课程导读

3D 角色的”内在“:血量、体力、装备、技能。本课用组件化设计一套可扩展角色系统。

角色数据结构

数据与逻辑分离。

  1. 【PlayerStats 组件】集中管理角色数值:
  2. [System.Serializable] public class PlayerStats : MonoBehaviour {
  3. public int maxHp = 100; public int hp;
  4. public int maxStamina = 100; public float stamina;
  5. public int level = 1; public int xp;
  6. public float moveSpeed = 6f; public float damage = 20f;
  7. public event System.Action OnHpChanged;
  8. public void Start() { hp = maxHp; stamina = maxStamina; }
  9. public void TakeDamage(int dmg) { hp = Mathf.Max(0, hp - dmg); OnHpChanged?.Invoke(); }
  10. public void Heal(int amount) { hp = Mathf.Min(maxHp, hp + amount); OnHpChanged?.Invoke(); }
  11. }
  12. 【单一职责】一个组件管”数值“,移动/攻击组件管”行为“,互不干扰。
  13. 【事件】数值变化发事件,UI/音效订阅(第 167 课)。
  14. 【访问】GetComponent<PlayerStats>() 读取。
  15. 【升级】AddXp 升级提升属性。
  16. 【注意】数值集中一处,避免散落各脚本。
  17. 【完成】角色数据”有家“了!
💡
角色系统 = 一个 PlayerStats 组件集中数值 + 事件通知变化。数据归一。

体力与技能系统

战斗的”资源“。

  1. 【体力】跑步/攻击消耗、回恢复:
  2. void Update() {
  3. // 消耗
  4. if (sprinting) stamina -= Time.deltaTime * 20f;
  5. // 恢复
  6. else stamina = Mathf.Min(maxStamina, stamina + Time.deltaTime * 10f);
  7. stamina = Mathf.Clamp(stamina, 0, maxStamina);
  8. }
  9. 【技能系统】用 ScriptableObject 定义技能(第 85 课):
  10. public class SkillSO : ScriptableObject { public string name; public float cooldown; public int damage; public GameObject effectPrefab; }
  11. 【技能组件】
  12. public class SkillSystem : MonoBehaviour {
  13. public SkillSO[] skills;
  14. void Update() {
  15. if (Input.GetKeyDown(KeyCode.Alpha1)) CastSkill(0);
  16. }
  17. void CastSkill(int idx) {
  18. // 检查冷却、消耗、释放特效/伤害
  19. }
  20. }
  21. 【冷却】Dictionary 记录各技能冷却时间。
  22. 【扩展】任意技能加进数组即可(数据驱动)。
  23. 【完成】技能系统”可插拔“。
  24. 【注意】体力为 0 不能跑/放技能。
  25. 【测试】跑消耗体力、回血、放技能。
  26. 【进阶】技能树(进阶)。
技能 = ScriptableObject 定义数据 + 技能组件执行 + 冷却管理。加技能=加资产。

常见错误与排查

错误:体力负数/无限?
原因:没 Clamp 或恢复逻辑漏
解决:消耗/恢复都 Clamp 到 [0, maxStamina];状态一致。

动手练习

课后小任务(做出来才算真的学会)

  • 做 PlayerStats 组件与事件
  • 实现体力系统
  • 做技能系统

本节小结

角色系统完成。下一课 3D 章综合练习:完整小型 3D 游戏。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课3D 光线投射与拾取进阶