学习游戏制作记录(玩家掉落系统,删除物品功能和独特物品)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();//这里测试武器的效果实现

}

}

}

给这个物品数据添加效果

成功触发

相关推荐
AI小云3 分钟前
零基础如何系统学习AI?2026年技术路径与培训选择深度分析
人工智能·学习
Rain的Java大神之路3 分钟前
Java 三层架构,90% 的人只答对一半:Controller 不是瘦,Service 不是透传,Dao 不是只写 SQL
java·后端·面试
我命由我123453 分钟前
准入类与水平类职业资格
笔记·学习·职场和发展·产品运营·求职招聘·职场发展·产品经理
Thomas.Sir5 分钟前
第29课:微服务异步调用、线程池优化 & 事件驱动开发
java·redis·微服务
.Hypocritical.8 分钟前
【Java 进阶】泛型深度解析|泛型类、泛型方法、通配符、类型擦除、PECS 原则
java·开发语言·泛型
这个DBA有点耶13 分钟前
MySQL B-tree索引并发控制优化:写密集场景的锁瓶颈与内核级解法
java·数据库·程序人生·算法·database·dba
RuoyiOffice33 分钟前
Spring AI+Vue3 企业知识库设计:让每个答案有依据,让每份资料守住权限
java·spring boot·vue3·rag·企业知识库·spring ai·ruoyi office
ly_Enhs39 分钟前
从无光照到 PBR:我的环境光照学习记录
学习·vulkan图形渲染c/c++
小李不想当小白40 分钟前
USART串口数据包(STM32标准库学习笔记)
经验分享·笔记·stm32·单片机·嵌入式硬件·学习
xier_ran1 小时前
【infra之路】AI 编译器学习笔记(八):向量化——把小块变成 SIMD 指令
人工智能·笔记·学习