实例

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Русский (ru)中文 (zh)Translate (Translate)

实例(Instance)是通过func_instance实体引用的地图文件(en).vmf),可配合func_instance_parms和/或func_instance_io_proxy实体使用。

Note.png注意:为使实例能编译进地图,gameinfo.txt中必须包含指向游戏FGD文件的GameData键值。仅求生之路2 求生之路2及后续版本与军团要塞2 军团要塞2默认包含此配置。其他游戏需手动添加才能启用实例功能。也可使用下文提到的预编译器,但若实例旋转角度非正交方向,此方法会显著增加编译成本(en)
Note.png注意:求生之路2 求生之路2之前的引擎分支中,实例存在功能缺失或异常:不支持实例I/O系统、不可嵌套实例、实例内env_displacement可能编译失败,且实例内所有env_cubemap不会编译进最终地图。
Note.png注意:引用实例会导致编译后地图的mapversion键值取自某个实例的版本号。

实例的应用价值包括:

  • 作为预制件(en)的动态替代方案——实例地图的修改会实时同步到所有引用处
  • 替代可视分组(en)管理大型地图——将庞大地图拆分为多个易管理的小型地图(支持多人协作)
  • 简化非正交角度构造——在独立地图中正向建造结构,再通过旋转的func_instance导入主地图(相比直接编译旋转结构,此法能减少刷子表面(en)数量从而优化性能,但可能影响物理特性(en)滑行玩法(en))
  • 实现跨平台兼容——例如同时支持求生之路 求生之路求生之路2 求生之路2版本的地图

实例I/O系统

使用func_instance_io_proxy

求生之路2 求生之路2及后续版本支持实例收发输入输出。需在实例内配置名为proxyfunc_instance_io_proxy实体。向实例内实体发送输入的格式如下:

我的输出 目标实体 目标输入 参数 延迟 仅触发一次
Io11.png <输出名称> <实例实体> instance:<实体名>;<输入名> <无> 0.00

接收实例内实体输出的格式:

我的输出 目标实体 目标输入 参数 延迟 仅触发一次
Io11.png instance:<实体名>;<输出名> <外部实体> <输入名> <无> 0.00
Note.png注意:Hammer编辑器应自动补全这些输入输出。即使显示为无效,游戏中仍能正常运行。

无func_instance_io_proxy方案

求生之路2 求生之路2之前的游戏需手动处理I/O。发送输入时直接引用修正后的实体名:

我的输出 目标实体 目标输入 参数 延迟 仅触发一次
Io11.png <输出名称> <修正名>-<实体名> <输入名> <无> 0.00

接收输出需通过logic_autoAddOutput动态添加:

我的输出 目标实体 目标输入 参数 延迟 仅触发一次
Io11.png OnMapSpawn <修正名>-<实体名> AddOutput <输出名> <目标实体>:<目标输入>::0:-1 0.00
Note.png注意:若使用Hammer增强插件,推荐改用comp_kv_setter实体在编译时而非运行时添加输出
Note.png注意:Hammer不会自动补全且会标记为无效,但游戏中仍有效。若实例的"实体名修正规则"设为后缀模式,需交换修正名与实体名的位置。

清单系统

通过清单(Manifests)可进一步扩展实例功能。清单将地图内容拆分为特殊的"子地图"实例。与传统实例不同:

  • Hammer无需单独打开VMF即可无缝切换子地图
  • 子地图视为主地图的延伸(不支持名称修正或位置偏移)
  • 单个子地图可被多个清单复用

清单的核心优势:

  • 支持多人实时协作开发
  • 隔离地图损坏风险(问题仅影响单个子地图)
  • 为地图区域分配直观名称
  • 优化版本控制系统(如Git)的管理效率

可通过"实例"菜单创建清单。

Note.png注意:Hammer++ Hammer++不支持清单系统,但其实例工具已集成清单核心功能:
Note.png注意:* 工具 -> 转换实例为选区 可将选区转为实例
Note.png注意:* 在3D视图中右键实例或点击属性栏的编辑实例(预览),可在主地图参照下编辑实例
Warning.png警告:清单在多数Hammer版本中
证实:功能尚不完善?
, 且多数游戏的VBSP(en)无法正确编译清单。VMMC工具可在编译前将清单合并为单一VMF,有效解决此问题。
Note.png修复:起源2013 Source 2013 模组可通过代码修改修复VBSP问题:
Note.png修复:* DeathByNukes分支包含多项通用修复
Cpp.png代码修复:* Mapbase仓库适配半衰期2 Half-Life 2 并优化实例功能

预编译器方案

Metapyziks开发的预编译器可在每次编译前将实例合并到主VMF。虽然GameData方案已使其过时,但技术爱好者可通过二次开发添加新功能(如实例I/O支持或可视分组开关)。

扩展阅读

外部资源