Dungeon Mizarka 011

了解Inventory元件如何使用

UIS里初步制作分类和各品项完成後,接下来就要实际在Runtime时可以引用。

首先要试验的环节为怪物身上有带物品,物品会因为击杀怪物後掉落。

试着利用参考范例的方式进行元件摆放

元件上最重要的应该是Inventory,这个元件看起来像是用预设的分类将道具分类摆放(概念上的)。图中的Inventoryl里有先预定三个分类

  • Main
  • Equipped
  • DebugLoadout

DebugLoadout应该是除错时用的。而Main则是目前主要的分类,所有的道具都会先进入到这个分类里,待道具被装备後才会进入到Equipped里。

进行一定程度的量化

试着加入元件时发现有好几个点要进行,以手动方式拖拉有些花时间,再加上考量到之後当道具数量增加时势必要进行以表格方式进入的转换工作。故花了一些时间准备,试着将道具从定义好的Json格式读入,制作成UIS的Item。

本当不是复杂的事但因为UIS撰写的方式很奇特,所以花了不少时间了解怎麽进行。先将目前试出来的事记录下来。

首先,UIS一定要放在Assets/Opsive目录下。通常制作时会习惯把外挂摆在一个地方,不会让Assets目录下太多东西,这样在找寻资料时,不会受干扰。但,如果是将UIS摆在其它地方,会导致在Project Rider或是Visual Studio里找不到Reference。这点很有可能是因为UIS用asmdef且设定是以GUID为主。不改变UIS设定的奇怪下,只好让它放在Assets目录下。

由於ItemDefinition的Create是internal static,不能直接在Editor script进行引用,只能利用Reflection进行。参考了这篇

主要的写法为

var methodInfo = typeof(ItemDefinition).GetMethod("Create", BindingFlags.Static | BindingFlags.NonPublic);
var itemDefinition = (ItemDefinition)methodInfo.Invoke(
    null,
    new object[]
    {
        "Item Name",
        "Item Category",
        null,
        null,
        null
    });

特别注意的是原先的Create五个参数中後面三个都有预设值(null),如果正常引用时是可以不用写进来的,但利用reflection时,则需要自行放入所有的参数。到这里都还算是正常,但接下来的部份就花了很久的时间才了解怎麽进行。

首先是ItemDefinition是ScriptableObject,照理说直接用AssetDatabase.CreateAsset就可以,但这里有个奇怪的地方,不确定是不是Windows平台才有的问题。如果path是利用Path.Combine接合起来的,则目录间的连接是用"",但每次CreteAsset时都会有问题。花了一些时间才了解到要利用"/"才行。

var adjustedItemPath = itemPath.Replace("\\", "/");

在Mac或是Linux上应该不会有这个问题。不过就算是ScriptableObject顺利的被存下来了,还是不能用。

这些已经在Project下的ScriptableObject,每次只要重开Unity Editor就不会出现在Item Defintions里,也就是说二边的资料是分离的。

又花了一些时间了解怎麽样才能重开Unity Editor也保留这些资料。利用到处加Serialize和Initialize database的方式可以让重开Unity Editor後也可以看得到。

看起来问题解决了,不过细看後才发现所有Override的Attribute资料都没有进来。

又试了很多奇怪的方式,花了二个多小时,最後终於找到了

ItemDefinitionEditorUtility.AddItemDefinition()

ItemDefinition生成的所有的问题看起来都解决了。接下来就是利用ItemDefinition制作实际的道具。

了解游戏中看的到的道具如何实现

ItemDefinition只是资料面,要能够在游戏中被看到,则必需利用GameObject加上元件,主要用到的元件

  • ItemObject
  • ItemObjectVisualizer

这二个元件定义了一个可以在场景里可被看到的道具物件。而给予此物件不同概念的元件则包含了

如果是制作掉落在场景上可以被捡起来的Pickup,则额外加上

  • Interactable
  • ItemPickup

如果是制作可装备的物件,则可以额外加上

  • ItemObjectBehaviourHandler

和相关的行为(ItemObjectBehaviourhandler要拿一个继承ItemObjectBehaviour的型别)

细节就要等等串连这些元件後才知道如何进行。


<<:  如果你想要的更多,你得对自己做更高的要求。

>>:  第8天~

Day29 - 集成学习 (ensemble learning) part2

今天要继续介绍另外两个集成学习的方法 max-out unit 结合与内插(interpolatio...

[Day09] - 未知网址的弹跳视窗 - is 属性

早上查看文章时 , 发现贴到昨天的资料 本鲁立马作文章修改 , 如造成 邦友 的不便 , 请各位海...

GitHub Advanced Security - 程序码扫描 (Code Scanning)

在前一篇文章GitHub Security - 基本安全相关功能介绍 内文中我们有对於 Repo 内...

【Day 24】- 用方便的 Postman 储存或测试 API

前情提要 昨天带各位用 Selenium 写了自动发留言的 Discord 机器人,可以在指定的文字...

【Day 17】for 回圈的范例讲解

今天,我们先来看看阶乘要怎麽写~ 我的程序码长这样: #include<stdio.h>...