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();//这里测试武器的效果实现
}
}
}
给这个物品数据添加效果
成功触发