
本文转自 Unity Connect 博主 超级汽水
最近在做一个小游戏,遇到了合成问题这里分享一下制作思路~
本篇只讲解一下大概思路提供部分代码,完整的代码应该会在以后和项目一同提供 ~ Minecraft 中的合成概述

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

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

接下来我们尝试表示合成 的过程 : 假设我们要使用 (炸鸡) + (啤酒) 合成 (快乐)。
把 的 id 物品设为 001
把 的 id 物品设为 002
把 的 id 物品设为 010
把 的合成公式设置为 :A001BCD002
提前将 的公式写好,然后将它保存好。如果游戏中有大量的公式需要保存也可以试试 SQLite 数据库,不过通常情况下只需要保存为 Json 或是 YAML 格式即可。 根据 合成公式 A001BCD002,我使用图来表示的话是这样 :

这样一个简单的合成系统设计就完成了,但是这个系统并不完美还需要后期优化许多我这里也只是起到一个抛砖引玉的作用。 代码设计
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; } } } 
原文链接:https://connect.unity.com/p/unitytips-yi-chong-fang-minecraft-wu-pin-he-cheng-de-si-lu?app=true
欢迎戳上方原文链接,下载 Unity 官方技术社区 app,在线技术答疑,发现更多资源干货!
1 maomaomao001 2020 年 3 月 4 日 现在 unity 文档是 被墙了还是怎么回事儿,unity,unity3d , 文档各种打不开 , 也不出现 404, 就是各种白屏,有没有流畅一点的官方文档 ,api 等 |
2 widewing 2020 年 3 月 4 日 via Android 这跟 unity 到底有啥关系 |