学习游戏制作记录(制作系统与物品掉落系统)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\().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\();//获取物品脚本** **private void OnTriggerEnter2D(Collider2D collision) { if (collision.GetComponent\() != 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\().SetupItem(item, randomVelocity);** **}** ### EnemyStats脚本: **private ItemDrop myDropSystem;//获取掉落系统** **{ ApplyLevelModifier(); base.Start();** **enemy = GetComponent\(); myDropSystem = GetComponent\(); }** **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\ dropList =new List\();//实际上掉落物品的列表** **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\().SetupItem(_item, randomVelocity);** **}** ### EnemyStats脚本: **protected override void Die() { base.Die();** **enemy.Die();** **myDropSystem.GenerateDrop();//死亡调用 }**

相关推荐
kitsch0x9714 小时前
论文学习_One Bug, Hundreds Behind: LLMs for Large-Scale Bug Discovery
学习·bug
AA陈超15 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-13 属性菜单 - 边框值
c++·游戏·ue5·游戏引擎·虚幻
qiuiuiu41315 小时前
正点原子RK3568学习日志19- Linux错误处理 字符驱动框架完全体
linux·服务器·学习·ubuntu
蒙奇D索大15 小时前
【计算机网络】408计算机网络高分指南:物理层编码与调制技术精讲
java·前端·学习·计算机网络
姝孟15 小时前
C++学习——类与对象详细知识点总结
c++·笔记·学习
im_AMBER16 小时前
Leetcode 35
笔记·学习·算法·leetcode
2501_9291576816 小时前
【安卓+PC+IOS】psp全中文游戏+高清纹理包+金手指
android·游戏·ios
shandianchengzi17 小时前
【记录】Unity|Unity从安装到打开一个Github项目(以我的世界(仿)为例)
unity·c#·游戏引擎·github·我的世界·mc
xiaoxiaoxiaolll17 小时前
封面论文丨薄膜铌酸锂平台实现强耦合电光调制,《Light Sci. Appl. 》报道机器学习优化新范式
人工智能·学习
im_AMBER17 小时前
React 03
前端·笔记·学习·react.js·前端框架·react