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

学习游戏制作记录(制作系统与物品掉落系统)8.16

1.制作系统

在游戏里我们可以通过材料来制作装备,当我们点击合成表中的装备时,它会检测我们是否有足够的材料数量来制作

创建相应的物品槽

ItemData_Equipment脚本:

    [Header("Crafting Requiring")]
public List<InventoryItem> craftingMaterials;//需要材料的列表

Inventory脚本:

    public bool canCraft(ItemData_Equipment _itemToCraft,List<InventoryItem> _requireMaterials)//是否可以制作
{
List<InventoryItem>  MaterialToRemove = new List<InventoryItem>();//用来保存删除的材料

        for(int i =0;i<_requireMaterials.Count;i++)
{
if (stashItemsDictionary.TryGetValue(_requireMaterials[i].data, out InventoryItem stashValue))//检查玩家材料列表
{
if(stashValue.stackSize < _requireMaterials[i].stackSize)
{
Debug.Log("Not enough Materials");
return false;
}
else//如果有足够的材料
{
MaterialToRemove.Add(_requireMaterials[i]);//添加到删除列表
}
}
else
{
Debug.Log("Not enough Materials");
return false;
}

        }


        for(int i=0;i<MaterialToRemove.Count;i++)//删除
{
if (stashItemsDictionary.TryGetValue(MaterialToRemove[i].data, out InventoryItem value))
{
value.stackSize -= MaterialToRemove[i].stackSize;

                if (value.stackSize < 1)
{
stash.Remove(value);
stashItemsDictionary.Remove(MaterialToRemove[i].data);
}
}

        }
UpdataSlotUI();

        AddItem(_itemToCraft);//将合成的装备添加到装备列表
Debug.Log("here is" + _itemToCraft.ItemName);
return true;
}

创建UI_craftSlot脚本:

    private void OnEnable()
{
UpdataSlot(Item);//更新
}

    public override void OnPointerDown(PointerEventData eventData)
{
if (Item == null)
{
return;
}
if (eventData.pointerCurrentRaycast.gameObject == gameObject)
{
ItemData_Equipment craftData = Item.data as ItemData_Equipment;

            Inventory.instance.canCraft(craftData, craftData.craftingMaterials);//调用合成
}
}

2.实现敌人掉落指定物品

为物品添加一个子对象名为触发器,它专门负责拾取

为物品本身添加2D刚体,我们希望物品掉落时有随机速度

添加Item层级确保人物不会和物品碰撞

制作为预制体

ItemObject脚本:

    [SerializeField] private  Rigidbody2D rb;

    [SerializeField] private Vector2 velocity;
[SerializeField] private ItemData itemData;

    private void SetupVisuals()
{
if (itemData == null)
return;
GetComponent<SpriteRenderer>().sprite = itemData.icon;

        gameObject.name = "Item Object -" + itemData.ItemName;
}

    public void SetupItem(ItemData _itemData,Vector2 velocity)//设置物品数据和速度
{
itemData = _itemData;
rb.velocity = velocity;

         SetupVisuals();
}
public void PickupObject()//拾取函数
{
Inventory.instance.AddItem(itemData);
Destroy(gameObject);
}

创建ItemObject_Trigger脚本:

     private ItemObject myItemObject =>GetComponentInParent<ItemObject>();//获取物品脚本

    private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.GetComponent<Player>() != null)
{
myItemObject.PickupObject();//实现拾取
}
}

创建ItemDrop脚本挂载在敌人上:

    [SerializeField] private GameObject dropprefeb;
[SerializeField] private ItemData item;//数据

     public void DropItem()
{
GameObject newDrop =Instantiate(dropprefeb,transform.position,Quaternion.identity);

        Vector2 randomVelocity = new Vector2(Random.Range(-5, 5), Random.Range(15, 20));//设置随机速度

        newDrop.GetComponent<ItemObject>().SetupItem(item, randomVelocity);

    }

EnemyStats脚本:

private ItemDrop myDropSystem;//获取掉落系统

    {
ApplyLevelModifier();
base.Start();

        enemy = GetComponent<Enemy>();
myDropSystem = GetComponent<ItemDrop>();
}

    protected override void Die()//死亡时触发掉落函数
{
base.Die();

        enemy.Die();

        myDropSystem.DropItem();
}

3.实现敌人的随机掉落

ItemData脚本:

    [Range(0, 100)]
public float dropChance;//添加掉落几率

ItemDrop脚本:

    [SerializeField] private int possibleItemDrop;//掉落的数量
[SerializeField] private ItemData[] possibleDrop;//可能掉落的物品
private List<ItemData> dropList =new List<ItemData>();//实际上掉落物品的列表

    public void GenerateDrop()//生成掉落
{
for(int i = 0; i < possibleDrop.Length; i++)//从可能掉落的物品中筛选
{
if (Random.Range(0, 100) < possibleDrop[i].dropChance)
{
dropList.Add(possibleDrop[i]);//加入到掉落列表
}
}

        for(int i = 0;i < dropList.Count; i++)
{
ItemData newItem = dropList[Random.Range(0, dropList.Count - i)];//随机掉落

dropList.Remove(newItem);

            DropItem(newItem);//生成物品
}
}

    public void DropItem(ItemData _item)//修改传入参数
{
GameObject newDrop = Instantiate(dropprefeb, transform.position, Quaternion.identity);

        Vector2 randomVelocity = new Vector2(Random.Range(-5, 5), Random.Range(15, 20));

        newDrop.GetComponent<ItemObject>().SetupItem(_item, randomVelocity);

    }

EnemyStats脚本:

    protected override void Die()
{
base.Die();

        enemy.Die();

        myDropSystem.GenerateDrop();//死亡调用
}

http://www.dtcms.com/a/333957.html

相关文章:

  • AT89C52单片机介绍
  • 《设计模式》代理模式
  • Day56 Java面向对象10 方法重写
  • 《Python学习之字典(一):基础操作与核心用法》
  • duiLib 实现鼠标拖动状态栏时,窗口跟着拖动
  • 拒绝造轮子(C#篇)使用SqlSugar实现数据库的访问
  • Windows MCP.Net:基于.NET的Windows桌面自动化MCP服务器深度解析
  • 玩转tokenizer
  • huggingface TRL中的对齐算法: KTO
  • PMP-项目管理-十大知识领域:成本管理-估算预算、控制成本、避免超支
  • 免费下载 Landsat 系列遥感影像——地理空间数据云
  • 《吃透 C++ 类和对象(中):const 成员函数与取地址运算符重载解析》
  • ALBEF/BLIP/BLIP2/Instruct BLIP/X Instruct BLIP
  • 从废弃到珍宝——旧物二手回收小程序系统的价值发现之旅
  • 曲面/线 拟合gnuplot
  • 新手向:Python列表、元组、集合和字典的用法对比
  • 谷歌手机刷机和面具ROOT保姆级别教程
  • 基于 LoRA的广义知识蒸馏(GKD)训练
  • 软考 系统架构设计师系列知识点之杂项集萃(125)
  • 给纯小白的 Python 操作 Excel 笔记
  • STM32 延时函数详解
  • HackMyVM-Uvalde
  • 第七十五章:AI的“思维操控师”:Prompt变动对潜在空间(Latent Space)的影响可视化——看懂AI的“微言大义”!
  • 整体设计 符号学与诠释学融合的整体设计框架(本篇暂时命名)--PromptPilot (助手)答问之1
  • 第四章:大模型(LLM)】06.langchain原理-(5)LangChain Prompt 用法
  • PowerPoint和WPS演示放映PPT时如何禁止鼠标翻页
  • [1Prompt1Story] 注意力机制增强 IPCA | 去噪神经网络 UNet | U型架构分步去噪
  • 国产之光时空克隆:功能对标谷歌地球,旅游规划还能加载倾斜摄影模型,三维视频融合 免费使用
  • GaussDB 数据库架构师修炼(十三)安全管理(3)-行级访问控制
  • 【C++】C++11