器材编辑系统-创建|编辑|还原器材
<table>
<thead>
<tr>
<th>最后更新日期</th>
<th>2024-1-10</th>
</tr>
</thead>
<tbody>
<tr>
<td>作者</td>
<td>QFord</td>
</tr>
<tr>
<td>V1.0.0</td>
<td>创建文档</td>
</tr>
<tr>
<td>V1.0.1</td>
<td>需求澄清1、编辑器材参数(2024-1-8)</td>
</tr>
<tr>
<td>V1.0.2</td>
<td>编辑器材-实现方案</td>
</tr>
<tr>
<td>V1.0.3</td>
<td>编辑器材-非运行时实现方案、验证和初步结论(2024-1-9)</td>
</tr>
<tr>
<td>V1.0.4</td>
<td>需求澄清2、编辑器材-运行时实现方案(2024-1-10)</td>
</tr>
<tr>
<td>创建日期</td>
<td>2024-1-5</td>
</tr>
<tr>
<td>名词解释</td>
<td>文中[组件]代表[物件播放组件]</td>
</tr>
</tbody>
</table>
<h1>用户故事</h1>
<p>王永弟(2024-1-4 19:30):组件需支持类似Unity编辑器创建Cube的方式来创建器材。
如下图所示:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=395727d6e537b963541638b3f1e5f462&amp;file=file.png" alt="" /></p>
<p>> 目标用户:使用组件的开发人员/策划等,如现在(2024-1)负责PSVR开发的同学。</p>
<h2>编辑器材参数(2024-1-8)</h2>
<p>在Unity开发环境中,将[器材参数菜单]的内容放置到[Inspector]面板编辑,编辑好后运行时可以反馈这些编辑的效果。
举例说明,电池可以配置几节,当设定好节数后,运行时就会加载对应节数的电池,同时也支持在运行时修改这些参数并有实时的反应。</p>
<h1>需求澄清1(2024-1-8)</h1>
<p>Unity中通过其编辑器菜单创建的Cube,支持两种模式:</p>
<ul>
<li>编辑态</li>
<li>运行态
而物件播放组件创建的器材,目前都只支持运行态。
<strong>是否有在[编辑态]创建器材的需求?在运行的时候这个创建的器材可以正常使用。</strong>
> 有这个需求,同时新增了上述的[编辑器材参数]</li>
</ul>
<h1>需求澄清2(2024-1-10)</h1>
<p>器材(Unity的游戏对象)在场景中的数据需要保存和还原</p>
<ul>
<li>所在的场景</li>
<li>游戏对象名称</li>
<li>所在的节点</li>
<li>Tag&Layer</li>
<li>Transform</li>
</ul>
<p>在某场景,对若干器材进行了操作,可以保存为文件,支持导出和导入。
对于导入时,要考虑不存在的节点的自动创建和提示。</p>
<h1>需求拆解1</h1>
<ol>
<li>我们的器材数量多达1000+,放在菜单上(即使分类好)会显得很臃肿,难以选择。
因此,需提供支持模糊搜索的列表供用户选择更合适。</li>
<li>
<p>我们可以针对用户通过菜单创建的器材的记录做保存,支持下次直接通过菜单快捷这些器材。
[可选]
2.1:支持记录的清除
2.2:支持记录的导出和导入
2.3:记录的最大数量限定为50</p>
</li>
<li>支持设置器材的父节点,并记录下来。</li>
</ol>
<p>> 上面的【记录】都只是保存在本机,仅供本地用户使用,互不干扰。
[注意]需求方已确认此文档的方案选择。</p>
<h1>创建器材-实现方案</h1>
<p>创建器材主要是依赖于器材的Code,因此[器材Code表]的来源是我们需要关心的。
下面的几个方案主要就是针对这个[器材Code表]的来源来设计的。</p>
<h2>方案1</h2>
<p>用户手动输入需要的[器材Code表],组件根据这份输入的[器材Code表]生成创建器材的快捷菜单。</p>
<h3>缺点</h3>
<ul>
<li>此快捷菜单无法共享,每个用户都要输入自己的</li>
<li>用户需要自行找器材对应的Code</li>
</ul>
<h3>优点</h3>
<ul>
<li>组件投入最小</li>
</ul>
<h2>方案2</h2>
<p>组件通过[颗粒编辑器]的[器材列表]或其他类似功能的地方,扩展出一个导出[器材Code表]的功能,把导出的[数据表]提供给[组件]使用。</p>
<h3>缺点</h3>
<ul>
<li>有新的器材时,需要重新导出这个[器材Code表]并更新组件</li>
</ul>
<h3>优点</h3>
<ul>
<li>组件投入较小</li>
<li>器材Code较全</li>
</ul>
<h2>方案3</h2>
<p>组件直接对接服务端,获取最新的[器材Code表]。
服务端提供的接口是分页获取,可参考已有实现。
需要处理器材数量变化的时候更新数据。</p>
<h3>缺点</h3>
<ul>
<li>组件投入较大</li>
</ul>
<h3>优点</h3>
<ul>
<li>器材Code最全</li>
<li>可参考已有实现代码</li>
</ul>
<h2>方案选择</h2>
<p>比较各个方案后,主要考虑到使用方的便捷和后期维护成本,首选方案3。</p>
<p>> 2024-1-8 需求澄清后,方案可能有所调整,待后续排期后再处理。</p>
<h1>编辑器材-非运行时实现方案[不推荐]</h1>
<p>编辑器材实现方案的核心是要可以在Unity编辑态下执行Lua代码</p>
<ul>
<li>器材的参数编辑后的业务执行逻辑是先由Lua负责处理的。</li>
<li>创建子器材的业务依赖于Lua代码,比如酒精灯的灯帽。</li>
</ul>
<h2>实现方案问题</h2>
<p>经过编辑态下创建器材的测试,存在较多问题
1:编辑态下不支持DontDestroyOnLoad方法,导致很多组件阻塞,影响功能。
如果去除DontDestroyOnLoad,会致使组件会多实例,需要解决,如下图所示:
<img src="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=0a7c1934d72840f3181d87a3c658a224&amp;file=file.png" alt="" />
2:编辑态下的Lua代码获取一些数据失败
3:有时无法加载资源,却无异常报错信息,仅仅创建了一个器材名称的游戏对象和一个EditorNode的节点代码
4:有时加载ab包失败,提示重复加载
5:编辑态下代码无法断点调试,解决问题的效率较为低下
6:异常问题往往不会一次性全部暴露,只能遇到一个解决一个。
7:非运行时的Awake不会执行,导致很多初始化业务失败
![非运行时创建器材-测试](<a href="https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d83f18831570915d120ffb23dbbe000d&file=file.png">https://www.showdoc.com.cn/server/api/attachment/visitFile?sign=d83f18831570915d120ffb23dbbe000d&file=file.png</a> "非运行时创建器材-测试")</p>
<h2>实现方案-初步结论</h2>
<p>初步判定,通过非运行时,想要设置器材参数并可视化反馈存在较大问题。
而运行时修改参数是没问题的,需要解决的是运行时的参数设置的保存和还原,类似颗粒编辑中的对应功能。</p>
<h1>编辑器材-运行时实现方案[推荐]</h1>
<ul>
<li>在Unity开发环境,运行后可以通过菜单或者在窗口中创建器材</li>
<li>器材的参数可以在Inspector面板上进行配置。</li>
<li>支持保存和还原器材,即下次打开场景可以还原出上次器材的操作。
实现上述需求,类似于颗粒编辑器对器材的创建、保存和还原,可以参考其实现方案。</li>
</ul>
<p>器材参数配置</p>
<p>1:通过器材参数配置信息、解析自动生成Inspector配置UI。
这个可以参考[用品编辑器]器材组件UI自动生产的方案。</p>
<p>2:器材的保存和还原可以通过一个小组件进行实现,通过菜单命令在创建器材的时候在场景中生成VLE_SaveAndLoadManager游戏对象。</p>
<p>> 因为涉及到场景操作,场景编辑是独占的,故此功能在同一场景不支持多人并发操作,应明确提醒使用方。
如果需要支持多人操作(即使支持,存在冲突的风险,如占用同一位置),需要独特的设计和实现。故不推荐这么做。</p>