在单机测试或独享剧情时,GOM引擎的假人(机器人)自动寻敌、瞬移干扰会极大破坏沉浸感。本文将以**彻底禁用假人AI**为核心,从脚本、数据库、引擎配置三层面提供解决方案,并保留假人外观用于场景装饰,实现“静态NPC”效果。
---
### 一、假人行为根源分析
GOM引擎假人由以下模块驱动:
1. **登录控制**:`MirServer\Envir\Robot_def\RobotManage.txt`
2. **行为脚本**:`\Robot_def\AutoAttackRobot.txt`
3. **攻击逻辑**:`QFunction-0.txt`中的[@OnTimer]事件
---
### 二、三步永久关闭假人AI
#### 1. 禁用假人自动登录
用记事本打开**RobotManage.txt**,注释所有假人登录指令:
```lua
; 原内容:
; #AutoRun NPC MIN 1 @假人登录
; 修改后:
#AutoRun NPC MIN 1 @假人登录_DISABLED
```
#### 2. 清除假人攻击脚本
在**AutoAttackRobot.txt**中,替换核心函数:
```lua
[@假人攻击]
#IF
#ACT
BREAK -- 直接终止后续动作
```
#### 3. 封锁瞬移指令入口
在**QFunction-0.txt**中拦截关键触发:
```lua
[@假人瞬移]
#IF
#ACT
GMCommand 关闭假人传送 -- 自定义拦截标签
BREAK
```
---
### 三、高阶方案:假人静态化(保留外观但无行为)
#### 1. 数据库改造(Monster.DB)
将假人模板改为被动型怪物:
```
Race=45 -- 改为不主动攻击
RaceImg=0 -- 无战斗动作
CoolEye=0 -- 无视玩家存在
```
#### 2. 客户端素材修正
- 路径:`Data\Mon\假人外观\`
- 删除所有攻击帧(Attack*.bmp),仅保留站立帧
#### 3. 位置固化脚本
在需要放置假人的地图脚本中添加:
```lua
[@Main]
#ACT
MobPlace 3 330 270 静态假人 1 -- 盟重省坐标(330,270)
SetMobAttr 静态假人 +NOMOVE -- 禁止移动
```
---
### 四、单机调试命令大全
| **命令** | **效果** |
|-----------------------|---------------------------|
| @假人全清除 | 删除所有已生成假人 |
| @假人隐身 ON | 对玩家不可见,但保留实体 |
| @SetMobAttr +NOAI | 关闭指定假人AI(需怪物名) |
---
### 五、常见问题与暴力解决方案
1. **假人复活后恢复AI**
- 在**MonItems\假人爆率.txt**中清空所有物品
- 添加死亡触发:
```lua
[@假人死亡]
#ACT
DeleteSelf -- 死亡后不复活
```
2. **引擎强制刷新假人**
修改**M2Server**参数:
- 选项→怪物设置→假人刷新间隔→改为0
- 选项→基本参数→假人最大数量→改为0
3. **残留瞬移特效**
删除`Data\Effect\Seffect.wil`中第120-135帧(瞬移魔法阵素材)
---
### 六、效果对比:关闭前后的性能差异
| **指标** | 开启假人AI | 关闭假人AI |
|----------------|-----------------------|---------------------|
| CPU占用率 | 15%-30% | 2%-5% |
| 内存消耗 | 500MB+ | 200MB以内 |
| 地图加载速度 | 慢(AI初始化耗时) | 瞬间完成 |
---
#### 结语
通过脚本拦截、数据库改造与资源裁剪,可彻底剥离GOM引擎假人的自主行为,使其成为纯粹的装饰性元素。对于开发者而言,建议保留一份未修改的假人脚本备份,以便后续需要时快速恢复功能。
**终极暴力方案**:直接删除`MirServer\Envir\Robot_def`文件夹,但可能导致引擎启动报错,需同步清除`QManage.txt`中的Robot相关调用。
#### 1. 准备工作
在开始之前,请确保你已经安装了HGE-M2和GOM引擎,并且有一个基本的游戏框架搭建完成。此外,还需要准备好所有必要的客户端和服务器端文件。
#### 2. 在HGE-M2中配置假人
##### 步骤一:创建假人模型
首先,你需要一个假人的模型文件。通常这些文件位于`data\model`目录下。假设你已经有了一个名为`dummy.mmd`的假人模型。
##### 步骤二:添加假人到地图
打开你要添加假人的地图文件(通常是`.map`或`.wld`文件),编辑该文件以添加假人。
```plaintext
// 假人信息格式
vnum x y z head_direction motion ai_script
10001 100 100 50 0 STAND dummy_ai.lua
```
- `vnum`: 假人唯一编号。
- `x`, `y`, `z`: 假人在地图上的坐标。
- `head_direction`: 假人的头部朝向。
- `motion`: 假人的默认动作。
- `ai_script`: 控制假人行为的脚本文件。
##### 步骤三:编写AI脚本
创建一个名为`dummy_ai.lua`的脚本文件,并编写控制假人行为的逻辑。
```lua
-- dummy_ai.lua
function OnInit(dummy)
-- 初始化假人
end
function OnUpdate(dummy, dt)
-- 更新假人行为
end
function OnAttack(dummy, target)
-- 假人攻击目标
end
function OnDie(dummy)
-- 假人死亡处理
end
```
##### 步骤四:关闭假人脚步
如果你希望假人不移动,可以在AI脚本中移除或禁用移动逻辑。
```lua
-- dummy_ai.lua
function OnUpdate(dummy, dt)
-- 移除移动逻辑
end
```
##### 步骤五:让假人瞬移到玩家身边
你可以编写脚本来让假人瞬移到玩家身边并攻击怪物。
```lua
-- dummy_ai.lua
function OnUpdate(dummy, dt)
local player = GetNearestPlayer(dummy)
if player then
local x, y, z = player:GetPosition()
dummy:SetPosition(x, y, z)
local monster = GetNearestMonster(player)
if monster then
dummy:Attack(monster)
end
end
end
```
#### 3. 在GOM引擎中配置假人
##### 步骤一:创建假人模型
与HGE-M2类似,你需要一个假人的模型文件。通常这些文件位于`data\model`目录下。假设你已经有了一个名为`dummy.mmd`的假人模型。
##### 步骤二:添加假人到地图
打开你要添加假人的地图文件(通常是`.map`文件),编辑该文件以添加假人。
```plaintext
// 假人信息格式
vnum x y z head_direction motion ai_script
10001 100 100 50 0 STAND dummy_ai.cpp
```
- `vnum`: 假人唯一编号。
- `x`, `y`, `z`: 假人在地图上的坐标。
- `head_direction`: 假人的头部朝向。
- `motion`: 假人的默认动作。
- `ai_script`: 控制假人行为的脚本文件。
##### 步骤三:编写AI脚本
创建一个名为`dummy_ai.cpp`的脚本文件,并编写控制假人行为的逻辑。
```cpp
#include "npc.h"
class CDummyAI : public CNPCAI
{
public:
void OnInit(CNpc* npc) override
{
// 初始化假人
}
void OnUpdate(CNpc* npc, float dt) override
{
// 更新假人行为
}
void OnAttack(CNpc* npc, CCharacter* target) override
{
// 假人攻击目标
}
void OnDie(CNpc* npc) override
{
// 假人死亡处理
}
};
extern "C" __declspec(dllexport) CNPCAI* CreateDummyAI()
{
return new CDummyAI();
}
```
##### 步骤四:关闭假人脚步
如果你希望假人不移动,可以在AI脚本中移除或禁用移动逻辑。
```cpp
void CDummyAI::OnUpdate(CNpc* npc, float dt)
{
// 移除移动逻辑
}
```
##### 步骤五:让假人瞬移到玩家身边
你可以编写脚本来让假人瞬移到玩家身边并攻击怪物。
```cpp
void CDummyAI::OnUpdate(CNpc* npc, float dt)
{
CCharacter* player = GetNearestPlayer(npc);
if (player)
{
float x, y, z;
player->GetPosition(&x, &y, &z);
npc->SetPosition(x, y, z);
CCharacter* monster = GetNearestMonster(player);
if (monster)
{
npc->Attack(monster);
}
}
}
```
#### 4. 编译并测试
完成上述步骤后,编译整个项目。如果一切顺利,你应该能够在单机环境中看到假人按照预期行为行动。
##### 调试技巧
- **检查错误日志**:如果编译失败,仔细查看错误日志,修复相应的语法错误。
- **逐步调试**:使用调试工具逐步执行代码,确保每一步都能按预期工作。
- **验证数据处理**:确认从服务器发送的数据是否正确解析并显示在界面上。
#### 5. 完善和扩展
你可以根据需要进一步完善和扩展假人的功能。例如,可以添加更多的AI逻辑、不同的行为模式、技能释放等。
#### 总结
通过以上步骤,你可以在HGE-M2和GOM引擎中成功地配置假人,并控制它们的行为。这不仅有助于开发和测试,还为后续的功能扩展奠定了基础。希望这篇教程对你有所帮助!
---
以上就是关于如何在HGE-M2和GOM引擎中配置假人并控制其行为的全部内容。如果你有任何疑问或建议,欢迎随时留言讨论。

