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