制作经验值的获取,经验值的获取和生命值有关,当AI生命值为0,给予玩家一定的经验值,所以需要定义攻击者和被攻击者。
需要在处理伤害逻辑的方法中添加攻击者的输入。
Projectile
- using RPG.Resources;
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- namespace RPG.Combat
- {
- // 定义远程射击类-主要用于发射出去的箭-魔法-
- public class Projectile : MonoBehaviour
- {
-
- [SerializeField] float speed = 1;//箭矢射出的速度
- [SerializeField] bool isHoming = true;//是否锁定目标
- [SerializeField] GameObject hitEffect = null;//命中特效
- [SerializeField] float maxLifeTime = 5f;//存在的最长时间
- [SerializeField] float lifeAfterTImpact = 2f;//存在的时间
- //[SerializeField] GameObject[] destoryOnHit = null;//删除的对象列表
-
-
- Health target = null;//被攻击者
- GameObject instigator = null;//攻击者
- float damage = 0;
-
- private void Start()
- {
- transform.LookAt(GetAimLocation());//让箭朝向目标位置
- }
-
- private void Update()
- {
- if (target == null)//如果攻击目标为空
- {
- return;
- }
- if (isHoming)
- {
- transform.LookAt(GetAimLocation());//让箭朝向目标位置
- }
- // 使用Translate方法让箭根据速度和时间增量来移动-- // Vector3.forward表示projectile的前向向量,speed是速度,Time.deltaTime是上一帧到当前帧的时间差
- transform.Translate(Vector3.forward * speed * Time.deltaTime);
- }
- public void SetTarget(Health target, GameObject instigator, float damage)//设置目标
- {
- this.target = target;
- this.damage = damage;
- this.instigator = instigator;
- Destroy(gameObject, maxLifeTime);//删除自身,防止当角色死亡后,最后一击的远程攻击一直存在,一定时间消失
- }
-
- private Vector3 GetAimLocation()//获取瞄准的目标位置
- {
- CapsuleCollider targetCapsule = target.GetComponent<CapsuleCollider>();//获取目标的碰撞组件
- if (targetCapsule == null)//如果碰撞为空
- {
- return target.transform.position;//返回目标坐标
- }
-
- // 如果有CapsuleCollider组件,则返回目标位置上方CapsuleCollider高度的一半处 -确保projectile瞄准的是目标的上半身或中心位置
- return target.transform.position + Vector3.up * targetCapsule.height / 2;
- }
-
- private void OnTriggerEnter(Collider other)
- {
-
- //print("箭的伤害:" + damage);
- Health health = other.GetComponent<Health>();//获取碰撞触发的生命值组件 return
- if (target != null && health != target) return;//如果目标不为空并且生命值不是攻击的目标 return
- if (health == null || health.IsDead()) return;//如果生命值为空 或者角色已经死亡 return
-
- target.TakeDamage(instigator,damage);//添加伤害
- // speed = 0;//击中后速度为0
-
- if (hitEffect != null || health.IsDead())//如果爆炸特效不为空 则实例化爆炸
- {
- Instantiate(hitEffect, GetAimLocation(), transform.rotation);
- }
-
- //foreach (GameObject toDestory in destoryOnHit)// 遍历需要销毁的游戏对象列表
- //{
- // Destroy(toDestory);// 销毁当前游戏对象
- //}
-
- Destroy(gameObject, lifeAfterTImpact);// 在碰撞后,延迟一段时间后销毁当前游戏对象
-
-
- }
- }
- }
-
-
复制代码
Fighter
复制代码 Health
复制代码 BaseStats
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- namespace RPG.Stats
- {
- // 基础状态类,用于存储和计算角色的基础属性
- public class BaseStats : MonoBehaviour
- {
-
- [Range(1,99)]
- [SerializeField] int startingLevel = 1; /// 角色的起始等级
- [SerializeField] CharacterClass characterClass; /// 角色的职业
- [SerializeField] Progression progression = null;/// 角色的属性成长系统
-
-
- /// <summary>
- /// 获取角色的当前生命值。
- /// 该方法通过Progression类的GetHealth方法,根据角色的职业和起始等级来计算生命值。
- /// </summary>
- /// <returns>返回计算后的生命值。</returns>
- public float GetHealth()
- {
- return progression.GetHealth(characterClass,startingLevel);
- }
-
- public float GetExperienceReward()
- {
- return 10;
- }
- }
- }
-
复制代码
Experience
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
-
- namespace RPG.Resources
- {
- public class Experience : MonoBehaviour
- {
- [SerializeField] float experiencePoints = 0;
-
- public void GainExperience(float experience)// 获得经验
- {
- experiencePoints += experience;
- }
- }
- }
复制代码
|