Unity类银河战士恶魔城学习总结(P112 Items Drop敌人掉落 )

【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

  • 变量声明:定义Rigidbody2DItemData,用于处理物品的物理属性和显示图标。

  • 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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值