meta data for this page
📚 差别
这里会显示出您选择的修订版和当前版本之间的差别。
| 两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
| developer:faq [2025/07/24 17:06] – 移除 - 外部编辑 (Unknown date) 127.0.0.1 | developer:faq [2025/07/24 17:32] (当前版本) – bibiboxs | ||
|---|---|---|---|
| 行 1: | 行 1: | ||
| + | < | ||
| + | # 开发相关问题(FAQ) | ||
| + | 沙盘引擎 内置丰富的功能及代码,很多功能不能逐一进行详细介绍,开发者应该**善用关键字**搜索,以快速寻找到自己期望的功能。 | ||
| + | |||
| + | 本文将为开发者介绍开发阶段的已知问题,以及相关功能实现的关键字指南,欢迎反馈新问题! | ||
| + | |||
| + | |||
| + | |||
| + | ## 世界关键类型对象 | ||
| + | |||
| + | > 沙盘引擎 的世界框架基本由几个**关键类型对象**组成。 | ||
| + | |||
| + | | 对象 | ||
| + | | ------------ | ------------------------------------------------------------ | | ||
| + | | `Model` | ||
| + | | `Character` | ||
| + | | `Vehicle` | ||
| + | | `Pickup` | ||
| + | | `Checkpoint` | 另外一种光圈触发器(进入\离开检测)、更适合中大型检查点 | ||
| + | |||
| + | |||
| + | |||
| + | ## 获取游戏世界坐标 | ||
| + | |||
| + | > 在游戏开发过程中,经常会遇到需要指定位置坐标的情况(例如:想要实现**传送瞬移、移动物体、建造**等功能),想要获取相关位置的坐标,可通过以下方式实现。 | ||
| + | |||
| + | - 编写简单指令(例如`/ | ||
| + | - 通过[地图编辑器](manual/ | ||
| + | - 如果有**扩展\批量**的坐标记录需求,可参考下方**地图坐标与脚本通信交互** | ||
| + | |||
| + | |||
| + | |||
| + | ## 地图坐标与脚本通信交互 | ||
| + | |||
| + | > 为了能使 沙盘引擎 地图具有更多**扩展和兼容性**,因此没有将许多功能**强制绑定**在地图文件中。 | ||
| + | > | ||
| + | > 有时候希望将一些坐标**批量、可筛选的**存到某个容器内,而不是逐一坐标**硬性记录**在脚本中**(例如:随机乱斗点坐标、生存游戏物资点坐标、大逃杀游戏空投点等)**,可以通过以下的方式来方便的实现。 | ||
| + | > | ||
| + | > **注意:当开发者或地图建造者在制作一些有 目的性\扩展性 的地图时,应该善用以下操作。** | ||
| + | |||
| + | 1. 打开**地图编辑器**,加载要**编辑\使用**的地图 | ||
| + | 2. 前往想要存储关键坐标的位置,创建资源库内**坐标点对象(ID:5)**并放置到目标位置(图标仅在编辑器可见,只有存储作用),并且可以将目标物体填写**物体标签Tag**(有助于批量筛选,允许重复Tag,例如将所有复活点坐标都命名为`spawnpoint`) | ||
| + | 3. 根据需要,完成以上操作后,保存地图 | ||
| + | 4. 开始编写脚本,在需要获取坐标的地方,使用[VectorPoint](scripting/ | ||
| + | 5. 大功告成,按照需求使用即可(例如:存到脚本数组中,等待使用) | ||
| + | |||
| + | ```javascript | ||
| + | // | ||
| + | let tag = " | ||
| + | let count = GetVectorPointCount(tag); | ||
| + | for(let i=0; | ||
| + | { | ||
| + | Debug.Log(GetVectorPoint(tag, | ||
| + | } | ||
| + | ``` | ||
| + | |||
| + | |||
| + | |||
| + | ## 获取引擎内模型的缩略图(Icon) | ||
| + | |||
| + | > 在部分游戏的开发过程中,可能会遇到需要使用模型缩略图、图标等情况(例如制作背包系统),这并不需要重新导入一份模型图片,可以考虑使用引擎自带的获取缩略图API`GUI.GetModelPreview()`,虽然这可能并非最优选择,但是会节省很多制作时间。 | ||
| + | > | ||
| + | > 当然,题外话,对于更美观、更高级的背包系统等,可以考虑重画Icon并作为图片资源导入使用。 | ||
| + | |||
| + | 详情API参考[《Client/ | ||
| + | |||
| + | |||
| + | |||
| + | ## 引擎图片资源与FGUI交互 | ||
| + | |||
| + | > 在部分游戏的开发过程中,可能会遇到需要将引擎Texture资源(包括导入的图片资源)作为UI元素使用的情况,这可以通过`GUI.TextureToUI()`将其转换为FGUI可识别的`NTexture`资源。 | ||
| + | |||
| + | 详情API参考[《Client/ | ||
| + | |||
| + | |||
| + | |||
| + | ## 对象销毁引用仍然存在 | ||
| + | |||
| + | > 在一些情况下,我们可能习惯性将某些对象引用到变量中**(主要针对`Entity`类)**。 | ||
| + | > | ||
| + | > 这样虽然可能为**开发阶段**带来方便,但是也可能会引起一些小的**隐患**。 | ||
| + | |||
| + | ```javascript | ||
| + | let chara = Character.Create(...); | ||
| + | if(chara) chara.Remove(); | ||
| + | |||
| + | Debug.Log(chara); | ||
| + | ``` | ||
| + | |||
| + | 根据上方的代码示例,有点奇怪的问题就出现了,明明角色对象已经被`Remove()`销毁,为什么仍然可以输出`chara`变量?并且其中的值基本都是正常的。 | ||
| + | |||
| + | > **这是由于GC(垃圾处理)机制并非实时的,虽然此时已经`Remove`了对象,但是`let chara`对其的引用是仍然存在的。** | ||
| + | > | ||
| + | > 这时虽然可以正常访问`chara`变量,但实际上如果继续操作对象将会**提示报错**。 | ||
| + | |||
| + | 如果希望避免这类问题,应该在**判断非`null`的基础上,额外进行合法化(`IsValid()`)的判定**。 | ||
| + | |||
| + | ```javascript | ||
| + | let chara = Character.Create(...); | ||
| + | if(chara) chara.Remove(); | ||
| + | |||
| + | Debug.Log(chara); | ||
| + | if(chara != null) Debug.Log(chara.IsValid()); | ||
| + | ``` | ||
| + | |||
| + | **问题关键在于`entity.IsValid()`方法**,这可以用来判断一个**对象是否是真实存在**的,返回`false`则表示对象**已经销毁**,只是GC没来得及清理。 | ||
| + | |||
| + | 总结:对于`Entity`类型的**引用对象**,判断是否存在不仅要判断`null`,同时也要判断`entity.IsValid()`是否正确返回。 | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | </ | ||