[UnityTips] 一种仿 Minecraft 物品合成的思路 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
UNITY: Game Development Tool
License Comparisons
unn
V2EX    UNITY

[UnityTips] 一种仿 Minecraft 物品合成的思路

  •  
  •   unn 2020 年 3 月 4 日 2892 次点击
    这是一个创建于 2244 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本文转自 Unity Connect 博主 超级汽水

    最近在做一个小游戏,遇到了合成问题这里分享一下制作思路~

    本篇只讲解一下大概思路提供部分代码,完整的代码应该会在以后和项目一同提供 ~ Minecraft 中的合成概述

    image

    在 Minecraft 中,最基本的合成台是一个 2 * 2 的合成,我这里以 A、B、C、D 来代表它的四个格子。 合成分为俩种合成 :(在 Minecraft 中不单单只有这俩种,我这里为了方便介绍简化了)

    1. 有序合成

    2. 无序合成

    有序合成是指所有的物品必须按照指定的位置摆放,位置摆放不正确是无法合成的比如斧头、锄头、盔甲等,这也是本文中着重讲解的内容,因为无序合成情况比较复杂我会在日后专门提出来尝试说明。

    image

    仿制 2 * 2 合成思路 : 对合成有了大致概念以后我来说说我对这种对位置有要求的合成的仿制方案:

    1. 对游戏中所有的物品设置唯一物品 ID,用来代表这个物品可以用数值或者字符串。

    2. 对游戏中所有物品设置唯一合成 ID,用来代表这个物品的合成公式,这里用字符串来代表。

    3. 对合成台的每个格子设置唯一标识 ,如上文中的 ABCD。

    4. 合成时将格子的标识与格子中物品的 ID 组合为一个字符串,空格用 * 来表示得出合成公式。

    5. 与已有的合成公式做比对,找到结果。( 搜索可以优化的地方很多,能力有限就不写出来误人子弟了 )

    也就是说一个物品它拥有俩种身份标识,一种是唯一的 ID 给程序进行判断它是什么物品;另外一个是它的合成配方,表示它的合成方法,这个可以有多种。

    物品具有俩种标识

    接下来我们尝试表示合成 的过程 : 假设我们要使用 (炸鸡) + (啤酒) 合成 (快乐)。

    • 把 的 id 物品设为 001

    • 把 的 id 物品设为 002

    • 把 的 id 物品设为 010

    • 把 的合成公式设置为 :A001BCD002

    提前将 的公式写好,然后将它保存好。如果游戏中有大量的公式需要保存也可以试试 SQLite 数据库,不过通常情况下只需要保存为 Json 或是 YAML 格式即可。 根据 合成公式 A001BCD002,我使用图来表示的话是这样 :

    image

    这样一个简单的合成系统设计就完成了,但是这个系统并不完美还需要后期优化许多我这里也只是起到一个抛砖引玉的作用。 代码设计

    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,在线技术答疑,发现更多资源干货!

    2 条回复    2020-03-04 12:29:57 +08:00
    maomaomao001
        1
    maomaomao001  
       2020 年 3 月 4 日
    现在 unity 文档是 被墙了还是怎么回事儿,unity,unity3d , 文档各种打不开 , 也不出现 404, 就是各种白屏,有没有流畅一点的官方文档 ,api 等
    widewing
        2
    widewing  
       2020 年 3 月 4 日 via Android
    这跟 unity 到底有啥关系
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     891 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 19:48 PVG 03:48 LAX 12:48 JFK 15:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86