doom3 entitydef实体定义

doom3 entitydef实体定义
原文地址 https://www.iddevnet.com/doom3/entitydefs.phpdoom3实体定义一个entityDef只不过是一个带有一个名字的键/值对的集合。它们通常用于定义实体因此名称但它们可以真正用于定义可以使用键/值对列表定义的任何内容。键和值的含义完全取决于对象的类型但是有两个键/值对保持不变不管类型如何。“spawnclass”键定义了“生成”这个实体的C 类。项目使用idItemtrigger_once使用idTrigger_Multiple怪物使用idAI 等。如果你 知道 C 你 可以 添加 新的 spawn类 到 游戏代码如果现有的 不 适合 你的 需要。没有“spawnclass”键的实体无法产生。“继承”键可以让游戏复制来自另一个entityDef的所有键/值对。循环引用是不可能的因为每个entityDef只解析一次你会得到一个错误。这是一个非常有用的钥匙。你可以做一些事情如 创建一个所有 怪物 继承的 默认 怪物。这不仅可以节省打字而且可以让你在一个地方改变一些东西并影响一堆物体这是一种祝福和诅咒。编辑键编辑器使用任何以editor_开头的键。它特别寻找的一些键是键价值/描述editor_color3个浮点数用于定义编辑器中 实体 的 颜色editor_minseditor_max3个浮动每个定义实体的边界框的大小。可用于创建动态大小的实体如触发器。注意编辑器中的大小并不总是游戏中的大小因为碰撞几何可能在其他地方指定。editor_usage描述 实体 是什么 以及 如何 使用 它的 文本editor_material适用于 实体 的 材质editor_var key描述spawnvar key的文本描述。这允许 级别设计器 覆盖 entityDef中 的 值editor_copy key当 创建 此类型的对象时将密钥从 实体def 复制 到 实体editor_rotatableBool如果实体可以自由旋转设置为1editor_showangleBool 设置为1 以 显示 角度 箭头editor_moverBool 设置为 1 以 使用“movedir”而不是 “angle” 作为 角度editor_envBool如果 对象是 某种 环境布娃娃则设置为1editor_combatnodeBool设置为1 以 绘制 该实体的 combat 区域editor_lightBool 设置为 1 以 像 光 一样 对待 这个 实体“shotgun”游戏中 实体 的一个定义 而已……我们来看一下霰弹枪的一个例子entityDef这不是在def 文件中看到的方式为了清楚起见我已经重新排列了一些东西entityDef weapon_shotgun { //全局 “spawnclass”“idItem” //编辑器使用 “editor_color”“.3 .3 1” “editor_mins” “-16 -16 0” “editor_maxs” “16 16 32” “editor_usage” “shotgun” “editor_rotatable” “1” //由idItem使用 “def_dropItem”“moveable_item_shotgun” “inv_name”“shotgun” “inv_weapon”“weapon_shotgun” “inv_ammo_shells”“4” “inv_item”“5” “snd_acquire”“sound_weapon_acquire” “snd_respawn”“sound_weapon_respawn” // 由 idEntity 使用 “size”“32 32 32” “型号”“型号/weapon/shotgun/ w_shotgun2.lwo” // 由idWeapon使用 “model_view”“viewmodel_shotgun” “model_world”“worldmodel_shotgun” “joint_attach”“SHOTGUN_ATTACHER” “icon”“guis / assets / hud / wpn_2” “weapon_scriptobject”“weapon_shotgun” “def_projectile”“projectile_bullet_shotgun” “ammoType”“ammo_shells”“ammoRequired”“1”“clipSize”“8” “lowAmmo”“2” “mtr_flashShader”“muzzleflash” “flashColor”“1 0.8 0.4” “flashRadius”“120” “silent_fire”“0” “recoilTime”“325” “recoilAngles”“-1 0 0” “weaponAngleOffsetAverages” “15” “weaponAngleOffsetScale” “.40” “weaponAngleOffsetMax” “20” “weaponsOffsetTime” “500” “weaponOffsetScale” “0.005” “hide_time” “0.3” “hide_distance” “-15” “smoke_muzzle” “shotgunmuzzlesmoke.prt” “def_ejectBrass” “fragments_shotgunbrass” “ejectBrassDelay” “650” //由脚本使用 “传播” “22” “skin_invisible” “皮肤/ shotgun_invis” // 此处 可能 有误…… }//全局 “spawnclass”“idItem” //编辑器使用 “editor_color”“.3 .3 1” “editor_mins”“-16 -16 0” “editor_maxs”“16 16 32” “editor_usage”“shotgun” “editor_rotatable”“1” //由idItem使用 “def_dropItem” “moveable_item_shotgun” “inv_name” “shotgun” “inv_weapon” “weapon_shotgun” “inv_ammo_shells” “4” “inv_item” “5” “snd_acquire”“sound_weapon_acquire” “snd_respawn”“sound_weapon_respawn” //由idEntity使用 “size”“32 32 32” “型号”“型号/weapon/shotgun/ w_shotgun2.lwo” //由idWeapon使用 “model_view”“viewmodel_shotgun” “model_world”“worldmodel_shotgun” “joint_attach”“SHOTGUN_ATTACHER” “icon”“guis / assets / hud / wpn_2” “weapon_scriptobject” “weapon_shotgun” “def_projectile” “projectile_bullet_shotgun” “ammoType” “ammo_shells” “ammoRequired” “1” “clipSize” “8” “lowAmmo” “2” “mtr_flashShader” “muzzleflash” “flashColor” “1 0.8 0.4” “flashRadius” “120” “silent_fire” “0” “recoilTime” “325” “recoilAngles” “-1 0 0” “weaponAngleOffsetAverages” “15” “weaponAngleOffsetScale” “.40” “weaponAngleOffsetMax” “20” “weaponsOffsetTime” “500” “weaponOffsetScale” “0.005” “hide_time” “0.3” “hide_distance” “-15” “smoke_muzzle” “shotgunmuzzlesmoke.prt” “def_ejectBrass” “fragments_shotgunbrass” “ejectBrassDelay” “650” //由脚本使用 “传播” “22” “skin_invisible” “皮肤/ shotgun_invis” }看这个脚本我们开始看到代码中有3个不同的部分都使用这个entityDef。第一个是编辑器我们几乎可以忽略。下一段代码是idItem。这是有道理的因为我们将idItem指定为spawnclass所以自然地类 将要 窥视一些值 来 正确地 产生 对象。idEntity 关心这个实体的原因是idItem来自idEntity。这意味着每个idItem都是一个idEntity。游戏代码中的几乎所有内容都是从idEntity派生的。它类似于我们如何使用inherit从另一个entityDef复制公共属性。令人困惑的部分是idWeapon适合图片的位置。我们知道shotgun是一种weapon但似乎没有任何地方可以 告诉我们的代码。这里的魔术钥匙是 inv_weapon。该键告诉idItem该项是武器并使用 weapon_shotgun entityDef 定义 idWeapon 的 参数。它只是发生在idItem的entityDef与idWeapon的entityDef相同。重要的是要注意虽然它们都设置为“ Weapon gun”游戏中 实体 定义 但不一定是它们。其实他们不是像 背包 这样的东西。这是一个给你 “健康”护甲 和 ammo 的 物品。背包entityDef 定义了世界上的对象但 其他东西在其他地方定义。为了测试这个你可以添加“inv_weapon”“weapon_shotgun”到“item_medkit”entityDef并注意你每次拿起一个 medkit 时都会 得到一个 shotgun。另一个真正重要的关键 是“weapon_scriptobject”这说明游戏代码运行哪个脚本来使 shotgun 工作。在这种情况下对象名称 与 实体名称 相同但是它不一定是必须的。装备霰弹枪时它告诉weapon代码 开始 使用“weapon_shotgun”对象在 weapon_shotgun.script 中定义。有趣的是只有一个 weapon 脚本 运行。当您切换weapon时它不会 破坏脚本对象并创建一个新的对象它只是告诉脚本对象变成一个新的类型。我们难题的缺失部分是伤害。毕竟没有损坏的猎枪只是一个玩具。损伤的方式看起来很奇怪但实际上效果非常好。当您按下attack按钮时shotgun 脚本会调用launchProjectiles13该弹射器 发射13枚“射弹”。这些弹丸也是由“def_projectile”键 定义为“projectile_bullet_shotgun”的 实体。如果我们看 “projectile_bullet_shotgun”我们看到它是一个 idProjectile它具有一系列的属性可以定义它的外观它如何飞行它如何爆炸当它碰到各种类型的曲面时它的声音以及一个一堆其他的东西。它定义的一个是“def_damage”它是一个定义 损害 的entityDef。原来还有更多的伤害比伤害多少。还有第一人看起来如何第三人看起来如何你如何敲你回来以及它是否能够吸收身体。看着“damage_shotgun”我们看到每颗球都有14点伤害。乘以13粒你会痛苦很多。预缓存entityDefs在级别加载时间中起着非常重要的作用。级别加载的资产通过走在级别和代码中定义的entityDefs来确定。在创建新的entityDefs时遵循这些命名指南是非常重要的以便预备功能正常工作字首类型SND声音消失mtrmaterials(材质 )modelModelssmoke烟雾系统GUIGUI文件高清另一个实体皮肤皮肤pda_name掌上电脑FXFX视频视频解析音频音频日志inv_icon库存图标还有其他一些你可以通过查看游戏代码找到但它们几乎贬值不应该被使用。未使用这些前缀意味着并非所有资产都将在地图加载中加载。它们在被引用时会被加载从而在游戏中引起联机这是doom3 mapdefdoom3的地图定义在脚本编辑器中来进行定义了地图定义非常像Quake 3中的.arena文件。它定义了地图的名称它支持哪些游戏模式以及在每个质量模式下以多少以字节为单位。以下是Alpha Labs 1的示例mapDef 游戏/ alphalabs1 { “名称”“Alpha Labs Sector 1” “devname”“05-Alpha 1” “singleplayer”“1” “size0”“208322592” “size1”“208322592” “size2”“325950691” “size3” “470025492” }“名称”“Alpha Labs Sector 1” “devname” “05-Alpha 1” “singleplayer”“1” “size0”“208322592” “size1”“208322592” “size2”“325950691” “size3”“470025492” }和DM地图比较mapDef 游戏/ mp / d3dm5 { “名字”“熄灯” “death match”“1” “团队DM”“1” “Last Man”“1” “旅程”“1” “size0”93855710“ “size1”“93855710” “size2”“156267217” “size3”“237413960” }“名字”“熄灯” “死亡匹配”“1” “团队DM”“1” “Last Man”“1” “旅程”“1” “size0”93855710“ “size1”“93855710” “size2”“156267217” “size3”“237413960” }这个decl中的字段应该很容易弄清楚“devname”是我们指向地图的内部名称。它主要被takeViewNotes2命令使用这可能不再起作用内部使用它来帮助查找错误。即使mapDef没有列出游戏类型也可以通过在控制台中指定地图来为特定的游戏类型加载地图。游戏类型仅用于在创建服务器中列出地图和投票菜单。关于创建mapDef的唯一困难在于指定大小。cvar“com_updateLoadSize”有很多帮助。当cvar设置为1时游戏将在地图加载后自动更新地图def中的大小信息不能将其设置为只读。制作完成后我们将运行一个批处理文件该文件通过com_updateLoadSize设置启动游戏加载地图退出游戏重复播放。我们会为所有4种质量模式 尽管size0和size1往往总是相同。以下是批处理文件的片段doom3.exe com_updateLoadSize 1 map game \ admin.map quit doom3.exe com_updateLoadSize 1 map game \ alphalabs1.map quitdoom3.exe com_updateLoadSize 1 si_map game \ mp \ d3dm1.map si_pure 0 spawnserver quitdoom3.exe com_updateLoadSize 1 si_map game \ mp \ d3dm2.map si_pure 0 spawnserver quitdoom3.exe com_updateLoadSize 1 map game \ alphalabs1.map quitdoom3.exe com_updateLoadSize 1 si_map game \ mp \ d3dm1.map si_pure 0 spawnserver quitdoom3.exe com_updateLoadSize 1 si_map game \ mp \ d3dm2.map si_pure 0 spawnserver quitmapdef不必在def文件中。它可以在任何你想要的文件甚至一个材料文件但是我强烈建议在defs文件夹中创建一个mapdef其中包含您可能使用的任何entityDefs或自定义模型的mymap .def。