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

2024-09-25
126看过
修复拾取武器,保证角色左右手只存在一个武器,拾取新的武器时会进行更换

Weapon:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace RPG.Combat
  5. {
  6.     /// <summary>
  7.     /// 武器脚本
  8.     /// </summary>
  9.     [CreateAssetMenu(fileName = "Weapon", menuName = "Weapons/Make New Waepon", order = 0)]
  10.     public class Weapon : ScriptableObject
  11.     {
  12.         [SerializeField] float weaponDamage = 5f;//武器伤害
  13.         [SerializeField] float weaponRange = 2f;// 武器攻击范围
  14.         [SerializeField] AnimatorOverrideController animatorOverride = null;//装备武器动画
  15.         [SerializeField] GameObject equippedPrefab = null;//武器预制体
  16.         [SerializeField] bool isRightHanded = true;//装备左右手武器,true为右手,false为左手
  17.         [SerializeField] Projectile projectile = null;//箭矢
  18.         [SerializeField] Vector3 projectileOffset = Vector3.zero;//箭矢的偏移
  19.         const string weaponName = "Weapon";//声明一个常量武器
  20.         /// <summary>
  21.         /// 诞生武器
  22.         /// </summary>
  23.         /// <param name="rightHand">右手武器产生的位置</param>
  24.         /// <param name="leftHand">左手武器产生的位置</param>
  25.         /// <param name="animator">武器对应的动画状态机</param>
  26.         public void Spawn(Transform rightHand,Transform leftHand, Animator animator)
  27.         {
  28.             DestroyOldWeapon(rightHand, leftHand);//产生武器之前先删除之前的旧武器,
  29.             if (equippedPrefab != null)//如果不为空,就实例化,防止为空时出现错误
  30.             {
  31.                 Transform handTransform = GetTransform(rightHand, leftHand);
  32.                 GameObject weapon = Instantiate(equippedPrefab, handTransform);//实例化武器
  33.                 weapon.name = weaponName;
  34.             }
  35.             if (animatorOverride != null) //如果动画状态不为空,就改变为新的动画状态
  36.             {
  37.                 animator.runtimeAnimatorController = animatorOverride;//状态机更改为装备武器的状态
  38.             }
  39.         }
  40.         /// <summary>
  41.         /// 删除旧的武器
  42.         /// </summary>
  43.         /// <param name="rightHand">右手武器</param>
  44.         /// <param name="leftHand">左手武器</param>
  45.         private void  DestroyOldWeapon(Transform rightHand, Transform leftHand)
  46.         {
  47.             Transform oldWeapon = rightHand.Find(weaponName);// 在右手中查找旧武器
  48.             if (oldWeapon == null)
  49.             {
  50.                 oldWeapon = leftHand.Find(weaponName);// 如果右手中没有找到旧武器,则在左手中查找
  51.             }
  52.             if (oldWeapon == null) return;// 如果左右手中都没有找到旧武器,则直接返回
  53.             oldWeapon.name = "Destroying";
  54.             Destroy(oldWeapon.gameObject);
  55.         }
  56.         /// <summary>
  57.         /// 获取武器出现的位置
  58.         /// </summary>
  59.         /// <param name="rightHand">右手</param>
  60.         /// <param name="leftHand">左手</param>
  61.         /// <returns></returns>
  62.         private Transform GetTransform(Transform rightHand, Transform leftHand)
  63.         {
  64.             Transform handTransform;
  65.             if (isRightHanded)
  66.             {
  67.                 handTransform = rightHand;//fasle则装备右手武器
  68.             }
  69.             else
  70.             {
  71.                 handTransform = leftHand;//装备左手武器
  72.             }
  73.             return handTransform;
  74.         }
  75.         public bool HasProjectile()//是否有箭矢
  76.         {
  77.             return projectile != null;//返回箭不为空
  78.         }
  79.         //发射箭矢
  80.         public void LacunchProjectile(Transform rightHand,Transform leftHand,Health target)
  81.         {
  82.             //实例化箭矢 Quaternion.identity没有旋转的状态
  83.             Projectile projectileInstance = Instantiate(projectile, GetTransform(rightHand, leftHand).position+ projectileOffset, Quaternion.identity);
  84.             projectileInstance.SetTarget(target,weaponDamage);//设置箭射击的攻击目标,伤害
  85.            
  86.             
  87.         }
  88.         public float GetDamage() //获取伤害
  89.         {
  90.             return weaponDamage;
  91.         }
  92.         public float GetRange()//获取武器攻击范围
  93.         {
  94.             return weaponRange;
  95.         }
  96.     }
  97. }
复制代码


回复

举报

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

本版积分规则

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