如何创建一个NPC以及NPC对话以及功能,包括前后端的创建流程
🤖 回答引擎: 热血江湖Lua |
🕒 时间: 2026-04-29 20:26:16 |
👁️ 阅读: 12
创建NPC及对话功能的完整流程如下:
## 一、NPC配置准备
### 1. 模型资源准备
- NPC模型资源存放在 `project\Assets\Art\Models\NPC` 目录下,包括模型、动作、特效等
- 需要检查资源是否完整
### 2. 配置模型资源表
- 在 `ResModelInfoCustom` 表中登记NPC模型资源
- NPC模型类型为8(通用)
- 职业字段填0,性别字段实际为资源序号
- 描述填写中文名称
- 如需穿戴装备,必须要有接挂点
### 3. 配置模型乐高表
- 在 `ResModelLegoInfoCustom` 表中配置模型组装信息
- 模型ID唯一
- NPC模型类型为8(通用)
- 柱状数据为NPC的资源模型ID
### 4. 配置NPC列表
- 在 `NpcList` 表中配置NPC基础信息
- ID唯一
- Script字段:NPC文本路径(对应脚本文件)
- MapName字段:地图编号
- X、Y字段:坐标位置
- Name字段:游戏中显示的名字
- Appr字段:模型参数(对应ResModelLegoInfo表ID)
- 配置完成后导出数据重启游戏即可看到NPC
## 二、脚本文件创建
### 1. NPC脚本存放位置
- 服务端脚本文件统一放在 `MirRXJH\Mir200\Envir\Market_Def\` 目录下
- 支持创建子文件夹,例如:`MirRXJH\Mir200\Envir\Market_Def\主城\银娇龙-101.lua`
- 文件名格式:`脚本名称-地图编号.lua`
- **注意**:必须保存为ANSI或GB2312格式,否则会造成读取乱码或无法加载
### 2. 脚本与NPC表的关联
- Npclist.xls表的Script字段对应脚本文件路径
- 例如:Script字段为"主城\银娇龙",对应文件 `主城\银娇龙-101.lua`
## 三、服务端脚本实现
### 1. 基础对话功能
在NPC脚本文件中实现对话逻辑,例如:
```lua
-- 主入口
function main()
say("欢迎来到热血江湖!")
say("我是NPC,有什么可以帮你的?")
-- 添加功能选项
local select = select("请选择功能:", "打开商店", "强化装备", "仓库存取", "结束对话")
if select == 1 then
-- 打开商店
opennpcshop(actor, 0, 商店分组ID, 出售分组ID, "商店名称")
elseif select == 2 then
-- 强化装备
opennpcshow(actor, NPC索引, 范围值)
elseif select == 3 then
-- 仓库
-- 执行仓库功能
else
say("再见!")
end
end
```
### 2. 服务端接口使用
- `opennpcshow(actor, NPCIndex, nRange)`:在范围内打开NPC界面
- `opennpcshowex(actor, NPCIndex, nRange, nRange2, isMapMove)`:寻路移动到NPC附近
- `opennpcshop(actor, type, buyGroup, sellGroup, shopName, buyBack)`:打开NPC商店
- `createnpc(actor, name, map, x, y, id, dir, script, ismapname, idx, flag)`:创建临时NPC
- `delnpc(actor, name)`:删除临时NPC
### 3. 临时NPC创建示例
```lua
local mapID = targetinfo(actor, "NEWMAP")
local _x = targetinfo(actor, "X")
local _y = targetinfo(actor, "Y")
createnpc(actor, "测试", mapID, _x, _y, 100002, 1, "..\\Market_Def\\测试", 0, 123, "@main")
```
### 4. 通过QFunction触发
可以在服务端功能触发器 `QFunction-0.lua` 中,通过点击NPC触发相应脚本:
```lua
-- 根据不同的npcid执行相应的脚本
if npcID == 1001 then
-- 执行NPC1的功能
elseif npcID == 1002 then
-- 执行NPC2的功能
end
```
## 四、客户端实现
### 1. NPC对话UI
- NPC对话UI文件:`FGUILayout/NpcDialog/npcDialog`
- 消息注册:
```lua
npcDialogUI = SL:RequireFile("FGUILayout/NpcDialog/npcDialog")
ssrMessage:RegisterNetMsg(ssrNetMsgCfg.npcDialog, npcDialogUI)
```
### 2. 客户端NPC对话处理
在 `npcDialog:Enter(initData)` 方法中:
```lua
function npcDialog:Enter(initData)
local npcid = initData.id
-- 绑定NPC模型
self._taskModel = FGUI:UIModel_Bind(self._ui.graph_role)
self._modelIndex = FGUI:UIModel_addLegoModel(self._taskModel, NpcList[npcid]['Appr'], nil, nil, Vector3.one * 1.4)
-- 设置NPC名称
FGUI:GTextField_setText(self._ui['npcname'], NpcList[npcid]['Name'])
-- 设置对话内容
local LanguageIndex = NpcList[npcid]['NpcTalk'] or 0
local context = Language_cfg[LanguageIndex] and Language_cfg[LanguageIndex]['Dec'] or ""
FGUI:GRichTextField_setText(self._ui['content'], context)
-- 设置功能按钮
local btnindexs = NpcList[npcid]['Function_Button']
local shopid = NpcList[npcid]['Npc_Store']
-- 根据按钮索引配置功能
if btnindexs[idx+1] == 1 then
FGUI:GRichTextField_setText(itemTitle, "强化")
-- 打开强化界面
elseif btnindexs[idx+1] == 3 then
FGUI:GRichTextField_setText(itemTitle, "仓库")
-- 打开仓库界面
elseif btnindexs[idx+1] == 4 then
FGUI:GRichTextField_setText(itemTitle, "结束对话")
elseif btnindexs[idx+1] == 5 then
FGUI:GRichTextField_setText(itemTitle, "打开商店")
ssrMessage:sendmsgEx("npcDialog", "toOpenShop", shopid)
end
end
```
### 3. 客户端NPC交互
- `SL:RequestTalkToNPC(npcID)`:与NPC对话
- `SL:RequestGroupData(group)`:请求NPC商店组数据
- `SL:RequestStoreBuy(index, count, npcID)`:请求购买商品
## 五、功能按钮配置
在NpcList表中配置 `Function_Button` 字段,定义NPC的功能按钮:
- 1:强化(打开强化界面)
- 3:仓库(打开仓库界面)
- 4:结束对话
- 5:打开商店
## 六、注意事项
1. **脚本文件编码**:必须保存为ANSI或GB2312格式
2. **NPC距离判断**:服务器收到客户端消息后,调用脚本时需判断NPC距离
3. **临时NPC**:使用 `createnpc` 创建的临时NPC可通过 `delnpc` 删除
4. **跨地图寻路**:使用 `opennpcshowex` 可实现跨地图寻路到NPC附近
5. **商店功能**:商店分组对应 `StoreGroup` 表分组ID,出售分组对应 `Item` 表Price中的分组
按照以上流程配置完成后,NPC即可在游戏中正常显示并实现对话、商店、强化等功能。
← 返回问答库