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

2024-09-29
145看过

在属性系统中将其他的属性声明并序列化,按照角色类型,基础属性,属性类型,等级等,方便在Unity中设置
Progression

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace RPG.Stats
  5. {
  6.     /// <summary>  
  7.     /// 角色属性成长系统,用于定义不同角色类(职业)在不同等级下的属性值。  
  8.     /// </summary>  
  9.     [CreateAssetMenu(fileName = "Progression", menuName = "Stats/New Progression", order = 0)]
  10.     public class Progression : ScriptableObject
  11.     {
  12.         /// <summary>  
  13.         /// 存储不同角色类(职业)及其对应的属性成长数据。  
  14.         /// </summary>  
  15.         [SerializeField] ProgressionCharacterClass[] characterClasses = null;
  16.         /// <summary>  
  17.         /// 根据角色类(职业)和等级获取生命值。  
  18.         /// </summary>  
  19.         /// <param name="characterClass">角色类(职业)</param>  
  20.         /// <param name="level">角色的等级</param>  
  21.         /// <returns>返回指定角色类和等级下的生命值。</returns>  
  22.         public float GetStat(Stat stat, CharacterClass characterClass,int level)
  23.         {
  24.             // 遍历角色职业类
  25.             foreach (ProgressionCharacterClass progressionClass in characterClasses)
  26.             {
  27.                 // 如果当前职业类与目标职业类不匹配,则跳过
  28.                 if (progressionClass.characterClass != characterClass) continue;
  29.                 // 遍历当前职业类的属性
  30.                 foreach (ProgressionStat progressionStat in progressionClass.stats)
  31.                 {
  32.                     if (progressionStat.stat != stat) continue; // 如果当前属性与目标属性不匹配,则跳过
  33.                     if (progressionStat.levels.Length < level) continue; // 如果属性等级数组长度小于目标等级,则跳过
  34.                     return progressionStat.levels[level - 1];  // 返回指定等级的属性值
  35.                 }
  36.                
  37.             }
  38.             return 0;// 如果没有找到匹配的角色类,返回0作为默认值  
  39.         }
  40.         /// <summary>  
  41.         /// 可序列化的类,用于存储单个角色类(职业)的属性成长数据。  
  42.         /// </summary>  
  43.         [System.Serializable]
  44.         class ProgressionCharacterClass
  45.         {
  46.             [Header("角色类型")]  
  47.             public CharacterClass characterClass;/// 角色类(职业)的引用。
  48.             [Header("基础属性")]
  49.             public ProgressionStat[] stats;
  50.            
  51.         }
  52.         [System.Serializable]
  53.         class ProgressionStat
  54.         {
  55.             [Header("属性类型")]
  56.             public Stat stat;//状态枚举的引用
  57.             [Header("等级")]
  58.             public float[] levels;//等级
  59.         }
  60.     }
  61. }
复制代码
BaseStats

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace RPG.Stats
  5. {
  6.     // 基础状态类,用于存储和计算角色的基础属性
  7.     public class BaseStats : MonoBehaviour
  8.     {
  9.         [Range(1,99)]
  10.         [SerializeField] int startingLevel = 1; /// 角色的起始等级
  11.         [SerializeField] CharacterClass characterClass; /// 角色的职业
  12.         [SerializeField] Progression progression = null;/// 角色的属性成长系统
  13.         /// <summary>  
  14.         /// 获取角色的当前生命值。  
  15.         /// 该方法通过Progression类的GetHealth方法,根据角色的职业和起始等级来计算生命值。  
  16.         /// </summary>  
  17.         /// <returns>返回计算后的生命值。</returns>  
  18.         public float GetStat(Stat stat)
  19.         {
  20.             return progression.GetStat(stat,characterClass,startingLevel);
  21.         }
  22.     }
  23. }
复制代码
Health

  1. using RPG.Control;
  2. using RPG.Core;
  3. using RPG.Saving;
  4. using RPG.Stats;
  5. using System;
  6. using System.Collections;
  7. using System.Collections.Generic;
  8. using UnityEngine;
  9. using UnityEngine.AI;
  10. // 处理生命值系统的脚本
  11. namespace RPG.Resources
  12. {
  13.     public class Health : MonoBehaviour, ISaveable
  14.     {
  15.         [SerializeField] float healthPoints = 100f;// 当前生命值,初始值为 100
  16.         
  17.         bool isDead = false;//是否死亡
  18.         bool isGetDamage = false;//是否追逐
  19.         Rigidbody rb;
  20.         private void Start()
  21.         {
  22.             healthPoints = GetComponent<BaseStats>().GetStat(Stat.Health);
  23.             rb = GetComponent<Rigidbody>();
  24.         }
  25.         //死亡方法,这个方法用于给角色判断,是否继续进行攻击
  26.         public bool IsDead()
  27.         {
  28.             return isDead;
  29.         }
  30.         // 处理受伤逻辑的方法
  31.         public void TakeDamage(GameObject instigator, float damage)
  32.         {
  33.             healthPoints = Mathf.Max(healthPoints - damage, 0);// 减少生命值,确保生命值不会低于 0
  34.             print(this.name+"生命值减少"+healthPoints);
  35.             isGetDamage = true;
  36.             
  37.             if (healthPoints == 0)//如果生命值等于0,
  38.             {
  39.                 Die();
  40.                 AwardExperience(instigator);  //获取经验方法
  41.             }
  42.         }
  43.      
  44.         public bool HasGetDamage()//返回给AI控制器当前是否有获得伤害
  45.         {
  46.             
  47.             return isGetDamage;
  48.         }
  49.         public float  GetPercentage()//返回生命值的百分比
  50.         {
  51.             //返回当前生命值 / 基础状态中的获取生命值
  52.             return 100*healthPoints / GetComponent<BaseStats>().GetStat(Stat.Health);
  53.         }
  54.       
  55.         /// <summary>
  56.         /// 死亡逻辑
  57.         /// </summary>
  58.         private void Die()
  59.         {
  60.             if (isDead) return;//如果玩家已死亡,直接跳出该方法
  61.             isDead = true;
  62.             GetComponent<Animator>().SetTrigger("death");//播放死亡动画
  63.             GetComponent<ActionScheduler>().CancelCurrentAction();//设置当前行为为空
  64.             
  65.             rb.constraints = RigidbodyConstraints.FreezeAll;
  66.         }
  67.         private void AwardExperience(GameObject instigator)//获取经验
  68.         {
  69.             Experience experience = instigator.GetComponent<Experience>();//获取经验组件
  70.             if(experience == null) return;//如果经验组件为空
  71.             experience.GainExperience(GetComponent<BaseStats>().GetStat(Stat.ExperienceReward));//获得基础状态中的 获取经验奖励
  72.         }
  73.         // 捕获当前对象的生命值状态
  74.         public object CaptureState()
  75.         {
  76.             return healthPoints;// 返回生命值状态
  77.         }
  78.         public void  RestoreState(object state)
  79.         {
  80.             healthPoints = (float)state;
  81.             // 如果生命值为零,则调用死亡处理方法
  82.             if (healthPoints <= 0)
  83.             {
  84.                 Die() ;
  85.             }
  86.             
  87.         }
  88.     }
  89. }
复制代码


回复

举报

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

本版积分规则

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