学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)8.17

发布于:2025-08-18 ⋅ 阅读:(12) ⋅ 点赞:(0)

1.实现玩家掉落系统

当玩家死亡时会有一定几率掉落装备和材料

ItemObject_Trigger脚本:

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(PlayerManage.instance.player.state.isDead) //如果死亡则不能拾取
            return;
        if (collision.GetComponent<Player>() != null)
        {
            myItemObject.PickupObject();
        }
    }

Inventory脚本:

    public List<ItemData> startingItem;//初始物品

    public List<InventoryItem> GetEquipmentList() => equipment;//获取装备列表

    public List<InventoryItem> GetStashList() => stash;//获取材料列表

创建PlayerItemDrop脚本:

public class PlayerItemDrop : ItemDrop//继承上一次的掉落脚本
{
    [Header("Player Drop")]
    [SerializeField] private float chanceToDropEquip;//掉落装备和材料的概率
    [SerializeField] private float chanceToDropMaterial;

    public override void GenerateDrop()
    {
        Inventory inventory = Inventory.instance;

        List<InventoryItem> itemTounequip = new List<InventoryItem>();//储存需要删除的装备材料列表
        List<InventoryItem> MaterialsToLose = new List<InventoryItem>();    

        foreach(InventoryItem item in inventory.GetEquipmentList())//调用玩家的装备列表
        {
            if(Random.Range(0,100)<chanceToDropEquip)
            {
                DropItem(item.data);//成功掉落

                itemTounequip.Add(item);//添加到删除的列表
            }
        }

        for(int i = 0; i < itemTounequip.Count; i++)
        {
            inventory.UnequipItem(itemTounequip[i].data as ItemData_Equipment);//删除
        }

        foreach(InventoryItem item in inventory.GetStashList())//同理
        {
            if(Random.Range(0,100)<chanceToDropMaterial)
            {
                DropItem(item.data);

                MaterialsToLose .Add(item);
            }
        }

        for (int i = 0;i<MaterialsToLose.Count;i++)
        {
            inventory.RemoveItem(MaterialsToLose[i].data);
        }

        
    }
}

 PlayerStats脚本:

    protected override void Die()
    {
        base.Die();

        player.Die();

        GetComponent<PlayerItemDrop>().GenerateDrop();//死亡时调用
    }

2.实现玩家删除库存物品的功能

UI_ItemSlot脚本:
 

    public virtual void OnPointerDown(PointerEventData eventData)
    {
       
        if (Item ==null)
        {
            return;
        }
        if (eventData.pointerCurrentRaycast.gameObject == gameObject)
        {
            if(Input.GetKey(KeyCode.LeftControl))//如果按下左crtl键则删除物品
            {
                Inventory.instance.RemoveItem(Item.data);

                return;
            }
            if (Item.data.itemType == ItemType.Equipment)
            {

                Inventory.instance.EquipItem(Item.data);
            }
        }


    }

3.实现独特物品

独特物品即有特殊效果的物品

创建ItemEffect脚本:
[CreateAssetMenu(fileName = "New Item Data", menuName = "Data/Effect")]//可以直接创建
public class ItemEffect : ScriptableObject
{
    public virtual void ExcuteEffect()//具体效果
    {
        Debug.Log("Effect excuted");
    }
}
 ItemData_Equipment脚本:

    public ItemEffect[] itemEffects;//武器拥有的效果

    public void ExcuteEffect()//执行效果
    {
        foreach(var effect in itemEffects)
        {
            effect.ExcuteEffect();
        }
    }

Inventory脚本:

    public ItemData_Equipment GetEquipment(EquipmentType _type)//获取指定装备武器数据
    {
        ItemData_Equipment equipedItem = null;

        foreach (KeyValuePair<ItemData_Equipment, InventoryItem> item in equipmentDictionary)
        {
            if (item.Key.equipmentType == _type)
                equipedItem = item.Key;
        }

        return equipedItem;
    }

PlayerAnimationTriggers脚本:

    private void AttackTrigger()
    {
        Collider2D[] collider2Ds = Physics2D.OverlapCircleAll(player.attackCheck.position, player.attackCheckRadius);

        foreach(var hit in collider2Ds)
        {
            if(hit.GetComponent<Enemy>()!=null)
            {
                EnemyStats EnemyTarget = hit.GetComponent<EnemyStats>();

                player.state.DoDamage(EnemyTarget);

                Inventory.instance.GetEquipment(EquipmentType.Weapon).ExcuteEffect();//这里测试武器的效果实现
            }
        }
    }

给这个物品数据添加效果

成功触发


网站公告

今日签到

点亮在社区的每一天
去签到