当前位置: 首页 > news >正文

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

给这个物品数据添加效果

成功触发

http://www.lryc.cn/news/623473.html

相关文章:

  • 《设计模式》工厂方法模式
  • 代码随想录算法训练营四十四天|图论part02
  • 天地图开发的优点
  • The Network Link Layer: 无线传感器中Delay Tolerant Networks – DTNs 延迟容忍网络
  • GANs生成对抗网络生成手写数字的Pytorch实现
  • VS Code配置MinGW64编译Apache Arrow C++库
  • 【k8s、docker】Headless Service(无头服务)
  • python+flask后端开发~项目实战 | 博客问答项目--模块化文件架构的基础搭建
  • C++算法题目分享:二叉搜索树相关的习题
  • 【前端基础】flex布局中使用`justify-content`后,最后一行的布局问题
  • ubuntu 24.04 安装
  • Android RxJava线程调度与性能优化指南
  • (一)前端面试(cookie/)
  • PostgreSQL导入mimic4
  • 数据结构代码分享-1 顺序表
  • 简单的 VSCode 设置
  • Oracle algorithm的含义
  • 基于Vue + Node能源采购系统的设计与实现/基于express的能源管理系统#node.js
  • Qt 5.5 的安装与配置(使用 VSCode编辑)
  • 【架构师从入门到进阶】第五章:DNSCDN网关优化思路——第十二节:网关安全-信息过滤
  • 基于多Agent的AFSIM复杂场景脚本生成技术(使用Claude Code)
  • 根号算法Ⅰ
  • 天地图应用篇: 增加缩放、比例尺控件
  • 24. 什么是不可变对象,好处是什么
  • 【Docker】搭建一款功能强大且免费的开源在线绘图工具 - draw.io
  • 云原生俱乐部-RH134知识点总结(2)
  • 62.不同路径
  • 【计算机网络面试】键入网址到网页显示期间,发生了什么?
  • 网络常识-DNS如何解析
  • 数据结构初阶(19)外排序·文件归并排序的实现