【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili
教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/
本章节实现了敌人可以掉落物品,并且可以捡起
本人遇到了掉落的物品拾取不了的bug,最后发现是ItemObject.cs中的ItemObject()实例化错误
ItemDrop.cs
物品掉落函数
-
变量声明:定义可能掉落的物品、掉落列表、预制体、以及最大掉落数量等数据。
-
GenerateDrop()
:根据概率生成掉落列表,从中随机选取物品并实例化掉落。 -
DropItem()
:实例化物品预制体并设置随机的掉落方向与物品属性。 -
逻辑流程:敌人死亡时,生成掉落列表,随机选择物品生成实例,并应用物理效果随机掉落。
using System.Collections;
using System.Collections.Generic;
using System.Xml;
using UnityEngine;
using UnityEngine.UIElements;
public class ItemDrop : MonoBehaviour
{
[SerializeField] private int possibleItemDrop;
[SerializeField] private ItemData[] possibleDrop;
private List<ItemData> dropList = new List<ItemData>();
[SerializeField] private GameObject dropPrefab;
[SerializeField] private ItemData item;
public void GenerateDrop()
{
for (int i = 0; i < possibleDrop.Length; i++)
{
if(Random.Range(0,100) <= possibleDrop[i].dropChance)//生成掉落列表
dropList.Add(possibleDrop[i]);
}
for(int i=0;i<possibleItemDrop;i++)// 从掉落列表中随机选择物品并生成掉落
{
ItemData randomItem = dropList[Random.Range(0, dropList.Count-1)];
dropList.Remove(randomItem);
DropItem(randomItem);
}
}
public void DropItem(ItemData _itemData)//敌人死亡时调用这个函数就行
{
GameObject newDrop = Instantiate(dropPrefab, transform.position, Quaternion.identity);
Vector2 randomVelocity = new Vector2(Random.Range(-5,5),Random.Range(15,20));//随机掉落方向
newDrop.GetComponent<ItemObject>().SetupItem(_itemData, randomVelocity);
}
}
ItemObject.cs
-
变量声明:定义
Rigidbody2D
和ItemData
,用于处理物品的物理属性和显示图标。 -
SetupVisuals()
:设置物品的图标和名称,在编辑器中直观显示。 -
SetupItem()
:配置物品的数据和掉落的初始速度,并调用SetupVisuals()
来设置物品的外观。 -
PickupItem()
:将物品添加到玩家的背包(调用Inventory
类),然后销毁该物品对象。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//创建一个物体,放入这个脚本
public class ItemObject : MonoBehaviour
{
[SerializeField] private Rigidbody2D rb;
[SerializeField] private ItemData itemData;//就是你放入的图标
private void SetupVisuals()//设置物品的图标和名称
{
if (itemData == null)
return;
GetComponent<SpriteRenderer>().sprite = itemData.icon;//在编辑器中显示图标
gameObject.name = "Item object - " + itemData.itemName;//直接在编辑器中显示名字
}
public void SetupItem(ItemData _itemData,Vector2 _velocity)//配置物品的数据和掉落的初始速度
{
itemData = _itemData;
rb.velocity = _velocity;
SetupVisuals();
}
public void PickupItem()//将物品添加到背包,然后销毁
{
Inventory.instance.AddItem(itemData);
Destroy(gameObject);
}
}
ItemData.cs
增加了物品的掉落几率
using UnityEngine;
//2024年10月31日
//在敌人图层之上,可以看得到
public enum ItemType
{
Material,
Equipment
}
[CreateAssetMenu(fileName = "New Item Data", menuName = "Data/Item")]//在资源管理器中创建新的Item,创建的物品自带这个脚本
public class ItemData : ScriptableObject //在编辑器中创建和编辑的类
{
public ItemType itemType;//定义你的物品的类型
public string itemName;//定义你的物品的名字
public Sprite icon;//可以选择图标
[Range(0,100)]
public float dropChance;//掉落几率
}
EnemyStats.cs
建议取消敌人暴击率和暴击伤害的成长,主要更改了Die()函数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyStats : CharacterStats
{
private Enemy enemy;
private ItemDrop myDropSystem;
[Header("Level details")]
[SerializeField] private int level = 1;
[Range(0f, 1f)]
[SerializeField] private float percentageModfier = .4f;
protected override void Start()
{
ApplyLevelModfiers();
base.Start();
enemy = GetComponent<Enemy>();
myDropSystem = GetComponent<ItemDrop>();
}
private void ApplyLevelModfiers()//根据等级修正数值
{
Modify(damage);
Modify(agility);
Modify(intelligence);
Modify(vitality);
Modify(damage);
//Modify(critChance);
//Modify(critPower);
Modify(maxHealth);
Modify(armor);
Modify(evasion);
Modify(magicResistance);
Modify(fireDamage);
Modify(iceDamage);
Modify(lightningDamage);
}
private void Modify(Stat _stat)//修正数值
{
for(int i = 0; i < level; i++)
{
float modifier =_stat.GetValue() * percentageModfier;
_stat.AddModifier(Mathf.RoundToInt(modifier));
}
}
public override void TakeDamage(int _damage)
{
base.TakeDamage(_damage);
}
protected override void Die()
{
base.Die();
enemy.Die();
myDropSystem.GenerateDrop();
}
}