学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)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\ itemTounequip = new List\();//储存需要删除的装备材料列表 List\ MaterialsToLose = new List\(); foreach(InventoryItem item in inventory.GetEquipmentList())//调用玩家的装备列表 { if(Random.Range(0,100)\().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\ 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\()!=null) { EnemyStats EnemyTarget = hit.GetComponent\(); player.state.DoDamage(EnemyTarget); Inventory.instance.GetEquipment(EquipmentType.Weapon).ExcuteEffect();//这里测试武器的效果实现 } } } ![](https://i-blog.csdnimg.cn/direct/f5a323e8085846db98b94a594fef5235.png)给这个物品数据添加效果 ![](https://i-blog.csdnimg.cn/direct/454774a0d499438da1c7552e74cfb31c.png) 成功触发

相关推荐
用户298698530144 小时前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
码路飞4 小时前
GPT-5.3 Instant 终于学会好好说话了,顺手对比了下同天发布的 Gemini 3.1 Flash-Lite
java·javascript
用户3667462526744 小时前
接口文档汇总 - 2.设备状态管理
c#
用户3667462526744 小时前
接口文档汇总 - 3.PLC通信管理
c#
SimonKing4 小时前
OpenCode AI编程助手如何添加Skills,优化项目!
java·后端·程序员
Seven976 小时前
剑指offer-80、⼆叉树中和为某⼀值的路径(二)
java
怒放吧德德17 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆19 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌21 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊1 天前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端