meta data for this page
  •  

📚 差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
developer:faq [2025/07/24 17:06] bibiboxsdeveloper:faq [2025/07/24 17:32] (当前版本) bibiboxs
行 2: 行 2:
 # 开发相关问题(FAQ) # 开发相关问题(FAQ)
  
-> **《沙盘引擎内置了比较丰富的代码体量,很多功能不能逐一进行详细介绍,开发者应该善用关键字搜索功能,以快速寻找到自己期望的功能。**+沙盘引擎 内置丰富的功能及代码,很多功能不能逐一进行详细介绍,开发者应该**善用关键字**搜索,以快速寻找到自己期望的功能。
  
-本文档仅为开发者介绍一些常用或键的功能**关键字指南**具体API使用方法以及示例代码请**根据关键字**查阅**[脚本API列表](scripting "脚本API列表")**相关文档。 +本文为开发者介绍开发阶段的已知问题,以及相关功能实现的关键字指南,欢迎反馈新问题
- +
-**==注意:网站右上角可进行关键字搜索,善用搜索功能==**+
  
  
行 12: 行 10:
 ## 世界关键类型对象 ## 世界关键类型对象
  
-沙盘引擎》除了基础的世界框架外,核心玩法基本由几个**关键类型对象**组成。+> 沙盘引擎 的世界框架基本由几个**关键类型对象**组成。
  
-| 对象名     | 说明                                                         | +| 对象         | 说明                                                         | 
-| ---------- | ------------------------------------------------------------ | +------------ | ------------------------------------------------------------ | 
-| Model      | 静态、动态的模型对象<br />**世界中任何可见的模型物品基类**   | +`Model     | 静态、动态的模型对象<br />**世界中任何可见的模型物品基类**   | 
-| Character  | 任何拥有生命力的角色、生物<br />**世界中最为关键的元素和操控介质** | +`Character | 任何拥有生命力的角色、生物<br />**世界中最为关键的元素和操控介质** | 
-| Vehicle    | 任何拥有可驾驶特征的载具、车辆、飞行器                       | +`Vehicle   | 任何拥有可驾驶特征的载具、车辆、飞行器                       | 
-| Pickup     | 类似拾取物、光圈触发器(进入\离开检测)、小型检查点          | +`Pickup    | 类似拾取物、光圈触发器(进入\离开检测)、小型检查点          | 
-| Checkpoint | 另外一种光圈触发器(进入\离开检测)、更适合中大型检查点      |+`Checkpoint| 另外一种光圈触发器(进入\离开检测)、更适合中大型检查点      |
  
  
  
 +## 获取游戏世界坐标
  
-## 加载指定场景+> 在游戏开发过程中,经常会遇到需要指定位置坐标的情况(例如:想要实现**传送瞬移、移动物体、建造**等功能),想要获取相关位置的坐标,可通过以下方式实现。
  
-> 加载《沙盘引擎》公开的几个可用的场景索引。 +- 编写简单指令例如`/s`,负责**输出\写入**当前玩家角色所在位置坐标(`player.Entity.Pos`),只需控制玩家走到想要记录的地方,然后输入`/s`即可 
-> +过[地图编辑器](manual/map)来实现记录(更直观) 
-常包括:游戏世界、地图编辑器等。+- 如果有**扩展\批量**的坐标记录需求,可参考下方**地图坐标与脚本通信交互**
  
-**一般情况下不需要使用此代码,除非希望进入地图编辑器等特殊场景。** 
  
-```javascript 
-Client.LoadNativeScene(); 
-``` 
  
 +## 地图坐标与脚本通信交互
  
 +> 为了能使 沙盘引擎 地图具有更多**扩展和兼容性**,因此没有将许多功能**强制绑定**在地图文件中。
 +>
 +> 有时候希望将一些坐标**批量、可筛选的**存到某个容器内,而不是逐一坐标**硬性记录**在脚本中**(例如:随机乱斗点坐标、生存游戏物资点坐标、大逃杀游戏空投点等)**,可以通过以下的方式来方便的实现。
 +>
 +> **注意:当开发者或地图建造者在制作一些有 目的性\扩展性 的地图时,应该善用以下操作。**
  
-## 加载内置界面 +1. 打开**地图编辑器**,加载要**编辑\使用**的地图 
- +2. 前往想要存储关键坐标的位置,创建资源库**坐标点对象(ID:5)**并放到目标位置(图标仅在编辑器可见,只有存储作),并且可以将目标物体填写**物体标签Tag**有助于批量筛选,允许重复Tag,例如将所有复活点坐标都命名为`spawnpoint`) 
-> 加载《沙盘引擎》内置的原生通界面索引 +3. 根据需要,完成以上操作后,保存地图 
-> +4. 开始编写脚本,在需要获取坐标的地方,使用[VectorPoint](scripting/native/main)相关功能API+循环遍历(筛选、获取),最终得到坐标角度、缩放数据 
-> 通常包括:**游戏设置菜单、游戏模组择界面原生开发者名单界面多人联机浏览器**+5. 大功告成,按照需求使用即可(例如:存到脚本数组中,等待使用)
  
 ```javascript ```javascript
-Client.CreateNativeView();+//以下代码实例获取了所有[spawnpoint]标签的坐标点 
 +let tag = "spawnpoint"; 
 +let count = GetVectorPointCount(tag); 
 +for(let i=0;i<count;i++) 
 +
 +    Debug.Log(GetVectorPoint(tag, i).Pos); 
 +}
 ``` ```
  
  
  
-## 创建置UI菜单NativeMenu+## 获取引擎模型的缩略图Icon
  
-[《NativeMenu文档》](scripting/extend/nativemenu "《NativeMenu文档》")。+在部分游戏的开发过程中,可能会遇到需要使用模型缩略图、图标等情况(例如制作背包系统),这并不需要重新导入一份模型图片,可以虑使用引擎自带的获取缩略图API`GUI.GetModelPreview()`,虽然这可能并非最优选择,但是会节省很多制作时间。 
 +
 +> 当然,题外话,对于更美观、更高级的背包系统等,可以考虑重画Icon并作为图片资源导入使用
  
 +详情API参考[《Client/GUI文档》](scripting/client/gui)。
  
  
-## 加载屏幕后处理 
  
-> 在开发过程中,有时候希望在特定情况下屏幕多一些画面效果(例如:模糊、滤镜、特效),这些效果统称为**屏幕后处理**。+## 引擎图片资源与FGUI交互
  
-```javascript +> 在部分游戏的开发过程中,可能会遇到需要将引擎Texture资源包括导入的图片资源作为UI元素使用的情况以通过`GUI.TextureToUI()`将其转换为FGUI可识别的`NTexture`资源。
-//首先需要获取到指定Effect类型返回索引0 +
-let effect = GetScreenEffect(0); +
-//然后进行数值设定即可,类型和属性基于SE.ScreenEffect +
-//类型几乎是通用的,具体参考API详情文档 +
-effect.Intensity = 1; //0~1 +
-effect.Color = Color(255, 255, 255, 255)+
-```+
  
 +详情API参考[《Client/GUI文档》](scripting/client/gui)。
  
  
-## 自定义UI界面 
  
-> 参考[《Client/GUI》](https://sengine.mp-gamer.com/scripting/client/gui)。+## 对象销毁引用仍然存在
  
- +> 在一些情况下,我们可能习惯性将某些对象引用到变量中**(主要针对`Entity`类)**。
- +
-## 自定义网络数据 +
- +
-> 在默认脚本框架下,World\Client脚本API内置了很多可能用到**事件Event)和方法(Function)**。+
 > >
-但是,在实际开发阶段可能会遇到**希望由【World端】调用【Client端】的法或属性(反之亦然)**或者**希望服务端和客户端做一些信息交互**(比如进行一些基础数值传递或者事件激活)。 +这样虽然可能为**开发阶段**带来便但是也可能会引起一些的**隐患**。
-+
-> 此类相关需求需要使用==**自定义网络数据**==功能来实现+
  
 ```javascript ```javascript
-//World +let chara = Character.Create(...); 
-Function -> player.SendData() +if(chara) chara.Remove();
-Event -> function OnPlayerStreamDataplayer, number, data )+
  
-//Client +Debug.Log(chara); //结果不为null
-Function -> SendDataToServer() +
-Event -> OnServerStreamData( number, data )+
 ``` ```
  
-提供【自定义网络数据】功能的API关键字,开发者可前往[《脚本开发及API》](scripting)文档**搜索查看**。 +根据代码示例,有点奇怪问题就出明明角色对象已经被`Remove()`销毁为什么仍然出`chara`变?并且其中值基都是正常的。
- +
- +
- +
-## 获取游戏世界坐标 +
- +
-> 在游戏开发过程中,经常会遇到需要指定位置坐标情况(如:想要实现传送瞬移、移动物体、建造等功能)想要获取相关位置坐标,可通过以下几个方式实。 +
- +
-- 编写一个简单指令(例如`/s`)功能即是`DLog`或`输出到文件`一行当前玩家角色所在位置坐标(`player.Entity.Pos`这样即控制玩家走到想要记录的地方,然后入/s即可 +
-- 通过地图编辑器临时物体来实现记录(更直观) +
-- 如果有更扩展\批量的坐标记录需求,可参考下方【地图坐标与脚通信交互】 +
- +
- +
- +
-## 地图坐标与脚本通信交互+
  
-为了能使《沙盘引擎》地图更加具有扩展和兼容性并没有将许多功能强制绑定地图文件中+**这是由于GC(垃圾处理)机制并非实时的虽然时已经`Remove`了对象,但是`let chara`对其的引用是仍然存**
 > >
-候无论是其他人制作的地图,还是原创游戏自带的地图,都希望将一些坐标**批、可筛选的**存到某个容器内而不是一个一个坐标记录写死在脚本中**(例:随机乱斗点坐标、生存游戏物资点坐标、大逃杀游戏空投点等)**,这就可以通过以下的方式来很方便的实现。 +虽然可以正常访问`chara`变量,但实际上果继续操作对象将会**提示报错**。
-+
-**==注意:当开发者或地图建造者在制作一些有目的性\扩展性的地图时,应该善用以下操作==**+
  
-1. 打开地图编辑器,加载希望编辑的地图 +如果希望避免这类问题应该在**判断非`null`的基础上额外进行合法化(`IsValid()`)的判定**。
-2. 找到一些想要批量存储关键坐标的地方**地图编辑器资源库内【ID:5】对象**(`VectorPoint`)放置到目标位置(图标仅在地图编辑器可见,游戏世界内是完全透明的,只有存储作用),并且可以将目标物体填写【物体标签Tag】这样有助于多种筛选,允许重复Tag,例如将所有复活点坐标都命名为`spawnpoint`) +
-3. 重复多次以上操作后,保存当前地图 +
-4. 开始编写脚本,在需要用到坐标地方,使用[VectorPoint](scripting/native/main)相关功能API+循环遍历,进行筛选、获取,最终得到坐标、角度甚至缩放等 +
-5. 大功告成,将这些坐标按照需求使用即可(例如:存到脚本数组中,等待使用)+
  
 ```javascript ```javascript
-//Test Code +let chara Character.Create(...)
-//以下代码实例获取了所有[spawnpoint]标签的坐标点 +if(chara) chara.Remove(); 
-let tag "spawnpoint"+ 
-let count = GetVectorPointCount(tag); +Debug.Log(chara); //结果不为null 
-for(let i=0;i<count;i+++if(chara != nullDebug.Log(chara.IsValid()); //结果返回false
-+
-    DLog(GetVectorPoint(tag, i).Pos); +
-}+
 ``` ```
  
 +**问题关键在于`entity.IsValid()`方法**,这可以用来判断一个**对象是否是真实存在**的,返回`false`则表示对象**已经销毁**,只是GC没来得及清理。
  
- +总结:对于`Entity`类型的**引对象**判断是否存在判断`null`,判断`entity.IsValid()`是否正确返回
-## 获取引擎内模型的缩略图(Icon) +
- +
-> 在部分游戏的开发过程中,可能会遇到需要使模型缩略图、图标等情况(例如制作背包系统)这并重新导入一份模型图片,可以考虑使用引擎自带的获取缩略图API`GUI.GetModelPreview()`,虽然这可能并非最优选择,但是会节省很多制作间。 +
-+
-> 当然,题外话,对于更美观、更高级的背包系统等,可以考虑重画Icon并作为图片资源导入使用。 +
- +
-详情API参考[《Client/GUI文档》](scripting/client/gui)。 +
- +
- +
- +
-## 引擎图片资源与FGUI交互 +
- +
-> 在部分游戏的开发过程中,可能会遇到需将引擎Texture资源(包括导入的图片资源)作为UI元素使用的情况,这可以通过`GUI.TextureToUI()`将其转换为FGUI可识别的`NTexture`资源。 +
- +
-详情API参考[《Client/GUI文档》](scripting/client/gui)+