Udemy-Unity制作类暗黑破坏神游戏记录-P39

2024-09-11
124看过
P36-P37部分主要讲诉关于Prefab预制体的内容,可忽略,在动画状态机中添加死亡动画
微信图片_20240911160326.png


把做好的Player复制一套,移除掉PlayerControler脚本用于当作敌人,命名Enemy,添加CombatTarget和Health组件,各自做成预制体。

具体代码如下:
Health

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. // 处理生命值系统的脚本
  5. namespace RPG.Combat
  6. {
  7.     public class Health : MonoBehaviour
  8.     {
  9.         [SerializeField] float healthPoints = 100f;// 当前生命值,初始值为 100
  10.         bool isDead = false;//是否死亡
  11.         //死亡方法,这个方法用于给角色判断,是否继续进行攻击
  12.         public bool IsDead()
  13.         {
  14.             return isDead;
  15.         }
  16.         // 处理受伤逻辑的方法
  17.         public void TakeDamage(float damage)
  18.         {
  19.             healthPoints = Mathf.Max(healthPoints - damage, 0);// 减少生命值,确保生命值不会低于 0
  20.             print(healthPoints);
  21.             if (healthPoints == 0)//生命值等于0,
  22.             {
  23.                 Die();
  24.             }
  25.         }
  26.         /// <summary>
  27.         /// 死亡逻辑
  28.         /// </summary>
  29.         private void Die()
  30.         {
  31.             if (isDead) return;//如果玩家已死亡,直接跳出该方法
  32.             isDead = true;
  33.             GetComponent<Animator>().SetTrigger("death");//播放死亡动画
  34.              GetComponent<CapsuleCollider>().enabled = false;
  35.         }
  36.     }
  37. }
复制代码
Fighter
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using RPG.Movement;
  5. using RPG.Core;
  6. namespace RPG.Combat
  7. {
  8.     //攻击
  9.     public class Fighter : MonoBehaviour, IAction
  10.     {
  11.         [SerializeField] float weaponRange = 2f;// 武器范围,表示武器可以攻击的最大距离
  12.         [SerializeField] float timeBetweenAttacks = 1f;//攻击间隔时间
  13.         [SerializeField] float weaponDamage = 5f;//武器伤害
  14.         Health target;// 当前攻击的目标
  15.         float timeSinceLastAttack = 0;//攻击后的时间统计
  16.         private Mover mover;// 用于移动角色的 Mover 组件
  17.         private bool isInRange;// 标记目标是否在攻击范围内
  18.         private Animator animator;
  19.         private void Start()
  20.         {
  21.             mover = GetComponent<Mover>();// 获取 Mover 组件
  22.             animator = GetComponent<Animator>();//获取动画组件
  23.            
  24.         }
  25.         private void Update()
  26.         {
  27.             timeSinceLastAttack += Time.deltaTime;//设置攻击后的时间统计累加
  28.             if (target.IsDead()) return;//如果目标已经死亡,直接return
  29.             if (target == null) return;// 如果目标为空,则不进行任何操作
  30.             if (!GetIsInRange()) // 如果目标不在攻击范围内,则移动到目标位置
  31.             {
  32.                 mover.MoveTo(target.transform.position);
  33.             }
  34.             else
  35.             {
  36.                 mover.Cancel(); // 目标在攻击范围内,取消移动,并触发攻击动画
  37.                 AttackBehaviour();
  38.             }
  39.         }
  40.         private void AttackBehaviour()//攻击触发
  41.         {
  42.             if (timeSinceLastAttack > timeBetweenAttacks)
  43.             {
  44.                 animator.SetTrigger("attack");
  45.                
  46.                 timeSinceLastAttack = 0;//重置攻击后的时间为0
  47.                
  48.             }
  49.         }
  50.         // 动画事件:攻击时触发的事件
  51.         private void Hit()
  52.         {
  53.            
  54.             target.TakeDamage(weaponDamage);//造成伤害
  55.         }
  56.         private bool GetIsInRange()
  57.         {
  58.             return Vector3.Distance(transform.position, target.transform.position) < weaponRange;// 检查目标是否在攻击范围内
  59.         }
  60.         public void Attack(CombatTarget combatTarget)
  61.         {
  62.             GetComponent<ActionScheduler>().StartAction(this); // 启动当前动作并设置目标
  63.             target = combatTarget.GetComponent<Health>();
  64.         }
  65.         public void Cancel()
  66.         {
  67.             animator.SetTrigger("stopAttack");
  68.             target = null;// 取消攻击,清除目标
  69.         }
  70.     }
  71. }
复制代码








回复

举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表