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

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(itemTounequipi.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(MaterialsToLosei.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();//这里测试武器的效果实现

}

}

}

给这个物品数据添加效果

成功触发

相关推荐
Flittly10 小时前
【AgentScope Java新手村系列】(16)从RAG到多路检索
java·spring boot·spring
小兔崽子去哪了10 小时前
Java 生成二维码解决方案
java·后端
人活一口气14 小时前
从JVM调优到MCP协议:Java全栈技术体系深度总结与企业级架构实践
java·spring boot
NE_STOP16 小时前
Vibe Coding -- 完整项目案例实操
java
荣码16 小时前
GraphRAG:普通RAG只能回答"点"的问题,我踩了4个坑才搞懂
java·python
SimonKing16 小时前
Google第三方授权登录
java·后端·程序员
明月光81816 小时前
从一行 @Builder 说起:重新拾起 Java 的 Lombok、注解与 Builder 模式
java
考虑考虑1 天前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯1 天前
GoF设计模式——中介者模式
java·后端·spring·设计模式
hez20101 天前
在 .NET 上构建超大托管数组
c#·.net·.net core·gc·clr