Part81:Player drop system(P113-114)
1:效果和操作
效果:player被击杀有概率丢失装备
操作:利用chanceToLooseMaterials和chanceToLooseItems来控制被击杀后掉落材料和装备的概率,当玩家被击败后则调用GenerateDrop方法,进而根据概率来进行dropitem并且对掉落列表进行遍历从而对背包内的数据进行更新,功能2是control+点击扔掉物品(可以将扔掉的物品实例化,方便再捡再扔)
2:代码改变
//Inventory脚本修改(该脚本用于初始装备设置)
// [SerializeField] private itemData item;//掉落体信息
public List<ItemData> startingItem;
public void Start()
{
AddStartingItems();
}
private void AddStartingItems()//初始化物品栏
{
for (int i = 0; i < startingItem.Count; i++)
{
AddItem(startingItem[i]);
}
}
public List<InventoryItem> GetEquipmentList() => equipment;
public List<InventoryItem> GetStashList() => stash;
//上述两行为获取stash和equip列表,用于playeritemdrop直接使用
//PlayerItemDrop脚本新增
//PlayerItemDrop脚本新增
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static UnityEditor.Progress;
public class PlayerItemDrop : ItemDrop
{
[Header("Player's drop")]
[SerializeField] private float chanceToLooseItems;//掉落材料概率
[SerializeField] private float chanceToLooseMaterials;//掉落准备概率
public override void GenerateDrop()
{
Inventory inventory = Inventory.instance;//获取单例,便于获取其身上的东西
List<InventoryItem> itemsToUnequip = new List<InventoryItem>();//掉落装备表
List<InventoryItem> materialsToLoose = new List<InventoryItem>();//掉落材料表
foreach (InventoryItem item in inventory.GetEquipmentList())
{
if (Random.Range(0, 100) <= chanceToLooseItems)
{
DropItem(item.data);//实例化item
itemsToUnequip.Add(item);//添加到卸下装备表
}
}
for (int i = 0; i < itemsToUnequip.Count; i++)
{
inventory.Unequipment(itemsToUnequip[i].data as itemData_Equipment);
//掉落
}
foreach (InventoryItem item in inventory.GetStashList())
{
if (Random.Range(0, 100) <= chanceToLooseMaterials)
{
DropItem(item.data);
materialsToLoose.Add(item);
}
}
for (int i = 0; i < materialsToLoose.Count; i++)
{
inventory.RemoveItem(materialsToLoose[i].data);
//掉落
}
}
}
//itemdrop脚本修改
public virtual void GenerateDrop()//该virtual
protected virtual void DropItem(ItemData _itemData)//该protected
//ItemObjectTrigger脚本修改
if (collision.GetComponent<Player>() != null)
{
if (collision.GetComponent<CharacterStats>().isDead)
return;//千万记得及时停止,避免反复鞭尸刷装备
Debug.Log("pick up item");
myItemObject.PickupItem();//当发生点击事件则出发拾取函数
}
//PlayerStats脚本修改
protected override void Die()
{
base.Die();
player.Die();
GetComponent<PlayerItemDrop>()?.GenerateDrop();
}
//CharacterStats脚本修改
public bool isDead;//修改public
//UI_itemslot脚本修改
public virtual void OnPointerDown(PointerEventData eventData)
{
// if (item.data.itemDataType == ItemDataType.Equipment)
// Debug.Log("equiped new item" + item.data.name);
if (Input.GetKey(KeyCode.LeftControl))//按住左control和鼠标点击删除物品
{
Inventory.instance.RemoveItem(item.data);
// Debug.Log("remove"+item.data.name);
return;
}
if (item.data.itemDataType == ItemDataType.Equipment)
Inventory.instance.EquipItem(item.data);
}
3:效果图 (图2为control+点击扔物品)