Notifications
Article
【UnityTips】一种仿 Minecraft 物品合成的思路
Updated 5 months ago
1.3 K
7
最近在做一个小游戏,遇到了合成问题这里分享一下制作思路~ 📕
本篇只讲解一下大概思路提供部分代码,完整的代码应该会在以后和项目一同提供 ~ 💡💡💡

Minecraft 中的合成概述

在 Minecraft 中,最基本的合成台是一个 2 * 2 的合成,我这里以 A、B、C、D 来代表它的四个格子。
合成分为俩种合成 :(在Minecraft中不单单只有这俩种,我这里为了方便介绍简化了)
  1. 有序合成
  2. 无序合成
有序合成是指所有的物品必须按照指定的位置摆放,位置摆放不正确是无法合成的比如斧头、锄头、盔甲等,这也是本文中着重讲解的内容,因为无序合成情况比较复杂我会在日后专门提出来尝试说明。

仿制 2 * 2 合成思路 :

对合成有了大致概念以后我来说说我对这种对位置有要求的合成的仿制方案:
  1. 对游戏中所有的物品设置唯一物品 ID,用来代表这个物品可以用数值或者字符串。
  2. 对游戏中所有物品设置唯一合成 ID ,用来代表这个物品的合成公式,这里用字符串来代表。
  3. 对合成台的每个格子设置唯一标识 ,如上文中的 ABCD。
  4. 合成时将格子的标识与格子中物品的ID组合为一个字符串,空格用 * 来表示得出合成公式。
  5. 与已有的合成公式做比对,找到结果。( 搜索可以优化的地方很多,能力有限就不写出来误人子弟了 )
也就是说一个物品它拥有俩种身份标识,一种是唯一的 ID 给程序进行判断它是什么物品;另外一个是它的合成配方,表示它的合成方法,这个可以有多种。

接下来我们尝试表示合成 💕 的过程 :
假设我们要使用 🍗 (炸鸡) + 🍺 (啤酒) 合成 💕 (快乐)。
  • 把 🍗 的 id 物品设为 001
  • 把 🍺 的 id 物品设为 002
  • 把 💕 的 id 物品设为 010
  • 把 💕 的合成公式设置为 : A001B*C*D002
提前将 💕 的公式写好,然后将它保存好。如果游戏中有大量的公式需要保存也可以试试 SQLite 数据库,不过通常情况下只需要保存为 Json 或是 YAML 格式即可。
根据 💕 合成公式 A001B*C*D002 ,我使用图来表示的话是这样 :
这样一个简单的合成系统设计就完成了,但是这个系统并不完美还需要后期优化许多我这里也只是起到一个抛砖引玉的作用。 🤗

代码设计

using System.Collections.Generic; using UnityEngine; public class CraftingTable : MonoBehaviour { // 合称表 private Dictionary<string, int> _itemMakeTables = new Dictionary<string, int>(); // 物品表 private Dictionary<int, string> _itemNameTables = new Dictionary<int, string>(); private void Start() { //添加一个合成配方合成产物为 ID 是10的物品 _itemMakeTables.Add("A001B*C*D002",10); //添加一个 ID 为10的物品 _itemNameTables.Add(10, "幸福星星"); //模拟合成 Debug.Log(Make("A001B*C*D002")); } // 物品合成函数,接受合成公式返回合成出的物品名 private string Make(string formula) { string itemName = null; //判断公式是否正确 if (_itemMakeTables.TryGetValue(formula,out int itemID)) { //根据物品id查询物品名字 itemName = _itemNameTables[itemID]; return itemName; } else { return itemName; } } }
超级汽水
超级热爱 - Student
14
Comments
水水水……
5 months ago
思路挺有趣的
1
王磊
5 months ago
初学者
好的,谢谢,我试试
1
超级汽水
5 months ago
超级热爱
王磊请问使用高度图快速生成真实地形的效果是怎么预览得到?我场景里看不到
地图生成出来以后你要把摄像机使劲往上拉,特别大
0
王磊
5 months ago
初学者
请问使用高度图快速生成真实地形的效果是怎么预览得到?我场景里看不到
0
王磊
5 months ago
初学者
哈哈
0