吧务
level 13
小鸟--
楼主

────────────────────────一、NPC 是什么
────────────────────────
NPC 并不是“简化版玩家”,也不是自动 AI。是社区重写的对齐FCNPC的组件层的功能,原则上性能、优化和稳定性更强。
官方对 NPC 的定位非常克制,也非常明确:
NPC 是一种:
• 由服务器创建
• 由服务器完全控制
• 拥有实体表现(模型、位置、动作)
• 但不具备任何自主决策能力的对象
你可以把 NPC 理解成:
“一个能走、能拿武器、能被看到的可编程角色壳子”。
它不会自己判断环境,也不会根据情况改变行为。
NPC 做什么、什么时候做、停不停,全由你脚本决定。
注意:
• 创建的NPC的ID是从玩家ID最高往下排序
如:服务器最大玩家是500,则新建的第一个NPC的ID则是499,第二个498,第三个497,以此类推
• npcid和playerid共同使用500个id槽位
• 如果服务器最大玩家数量是500,当新建npc之后,玩家客户端的服务器列表里会显示0/499而不是0/500,因为其中一个槽位被npc使用了
• npc不会显示在玩家列表里,但共用槽位
• npcid和playerid只是共用玩家槽位,不会出现重复的id,理解成一个虚拟玩家即可
config.json相关设置:
"max_bots": 100, 最大NPC数量
"max_players": 500, 最大玩家数量
────────────────────────────────
二、NPC 的生命周期(这是理解一切的基础)
────────────────────────────────
NPC 的生命周期一共只有三步:
1. 创建(Create)
2. 生成(Spawn)
3. 销毁(Destroy)
────────────────
1)NPC_Create
────────────────
功能说明:
创建一个 NPC 实体,并分配一个 NPC ID。
要点:
• 只是“创建”,不是生成
• 此时 NPC 还不存在于世界中
• 名字规则与玩家名称一致
• 失败时返回 INVALID_NPC_ID
适合理解为:
“在服务器里新建了一个 NPC 对象,但还没放进地图”。
官方文档:
https://open.mp/docs/scripting/functions/NPC_Create
────────────────
2)NPC_Spawn
────────────────
功能说明:
将已创建的 NPC 实际生成到游戏世界。
要点:
• NPC_Spawn 之后,NPC 才能被玩家看到
• Spawn 与否是一个明确状态
• 不 Spawn,后续操作很多都没有视觉效果
新手常见错误:
只 Create,不 Spawn,然后怀疑 NPC 系统坏了。
官方文档:
https://open.mp/docs/scripting/functions/NPC_Spawn
────────────────
3)NPC_Destroy
────────────────
功能说明:
彻底销毁 NPC。
要点:
• NPC ID 立刻失效
• 不能“复活”或“重新 Spawn”
这是一个删除/销毁操作,不是隐藏。
官方文档:
https://open.mp/docs/scripting/functions/NPC_Destroy
────────────────────────────────
三、NPC 有效性判断
────────────────────────────────
NPC_IsValid
功能说明:
判断一个 NPC ID 是否仍然指向一个有效的 NPC。
要点:
• 只检查“是否存在/有效”
• 不检查是否已 Spawn
• 常用于安全判断
相当于这是所有 NPC 操作前的基本判定。
官方文档:
https://open.mp/docs/scripting/functions/NPC_IsValid
────────────────────────────────
四、NPC 的控制
────────────────────────────────
不涉及行为逻辑。
────────────────
NPC_SetPos / NPC_GetPos
────────────────
功能说明:
• Set:直接设置 NPC 的世界坐标
• Get:获取 NPC 当前坐标
要点:
• SetPos 是瞬移,不是移动
• 不会触发任何寻路或动画
• 可在 Spawn 前或 Spawn 后使用
官方文档:
https://open.mp/docs/scripting/functions/NPC_SetPos
https://open.mp/docs/scripting/functions/NPC_GetPos
────────────────
NPC_SetFacingAngle
────────────────
功能说明:
设置 NPC 面朝方向。
要点:
• 只影响朝向
• 不影响位置
• 不触发动作
适合:
• 对话 NPC
• 站岗 NPC
官方文档:
https://open.mp/docs/scripting/functions/NPC_SetFacingAngle
────────────────
NPC_SetSkin
────────────────
功能说明:
设置 NPC 的外观皮肤。
要点:
• 规则与玩家 skin 完全一致
• 不影响任何行为或属性
官方文档:
https://open.mp/docs/scripting/functions/NPC_SetSkin
────────────────
NPC_SetVirtualWorld
NPC_SetInterior
────────────────
功能说明:
设置 NPC 所在的虚拟世界与室内。
要点:
• 与玩家机制完全一致
• 不在同一 world / interior 就不可见
官方文档:
https://open.mp/docs/scripting/functions/NPC_SetVirtualWorld
https://open.mp/docs/scripting/functions/NPC_SetInterior
────────────────────────────────
五、NPC 移动系统(最核心的一部分)
────────────────────────────────
官方把 NPC 移动分成三类:
• 点对点移动
• 跟随移动
• 路径移动
────────────────
NPC_Move
────────────────
功能说明:
命令 NPC 移动到指定坐标。
要点:
• 使用点(NPC所在位置)对点(目标位置)的简单移动,会穿越一切障碍物
• 可设置移动类型(走 / 慢跑 / 奔跑 / 驾车)
• 可设置到达目标点的判定距离
这是最基础、最常用的移动方式。
官方文档:
https://open.mp/docs/scripting/resources/npc-constants
https://open.mp/docs/scripting/functions/NPC_Move
────────────────
NPC_MoveToPlayer
────────────────
功能说明:
让 NPC 持续向某个玩家移动。
要点:
• 目标位置会不断更新
• 可设置跟随距离
• 可设置目标位置的更新频率
适合:
• 跟随 NPC
• 护送 / 追逐行为
官方文档:
https://open.mp/docs/scripting/functions/NPC_MoveToPlayer
────────────────
NPC_StopMove
────────────────
功能说明:
立即停止 NPC 当前的移动。
要点:
• 只是停止当前移动指令
官方文档:
https://open.mp/docs/scripting/functions/NPC_StopMove
────────────────
NPC_IsMoving
────────────────
功能说明:
判断 NPC 是否正在移动。 只返回“是否在移动”(true/false)
官方文档:
https://open.mp/docs/scripting/functions/NPC_IsMoving
────────────────────────────────
六、NPC 路径系统
────────────────────────────────
路径系统是官方提供的“半自动化移动工具”。
────────────────
NPC_CreatePath
────────────────
功能说明:
创建一个路径对象。你可以理解为一条什么都没有的空路线。
要点:
• 路径是独立资源
• 不绑定某个 NPC
• 可复用/可删除
官方文档:
https://open.mp/docs/scripting/functions/NPC_CreatePath
────────────────
NPC_AddPointToPath
────────────────
功能说明:
向路径中添加路径点。
要点:
• 按添加顺序执行
• 每个点有到达范围
• 路径(NPC_CreatePath)必须在添加点之前创建
官方文档:
https://open.mp/docs/scripting/functions/NPC_AddPointToPath
────────────────
NPC_MoveByPath
────────────────
功能说明:
让 NPC 按路径移动。
要点:
• 自动按路径上的已添加的点,按路径点的顺序移动
• 不需要手动控制每一步
官方文档:
https://open.mp/docs/scripting/functions/NPC_MoveByPath
相关回调:
OnNPCFinishMovePath:当NPC完成路径时调用
OnNPCFinishMovePathPoint:当NPC到达路径的每个路径点时调用
OnNPCFinishMove:当NPC完成任何移动命令时调用
────────────────────────────────
七、NPC 武器与射击控制
────────────────────────────────
────────────────
NPC_SetWeapon
NPC_SetAmmo
────────────────
功能说明:
设置 NPC 当前武器与弹药。
要点:
• 设置武器会让NPC装备该武器
• 不会自动射击
• 只改变装备状态
官方文档:
https://open.mp/docs/scripting/functions/NPC_SetWeapon
────────────────
NPC_Shoot
────────────────
功能说明:
让 NPC 执行射击行为。
要点:
• NPC射击前需要拥有武器
• 可指定被击中的实体类型(玩家、NPC、载具)
• 可设置偏移量(比如打歪一点)
这是一个偏底层的控制接口。
官方文档:
https://open.mp/docs/scripting/functions/NPC_Shoot
────────────────────────────────
八、最后
────────────────────────────────
官方 NPC 系统:
• 给你一个“NPC壳子”
• 给你一系列能自由操控NPC的功能
• 完全不替你做决定
NPC不是单机里的Ped,不具备任何智能行为,需要你自己构建一系列逻辑让它具备智能、有生命力的表现,和开发脚本是一样的概念。
更多NPC功能请自行前往 https://open.mp/docs 查阅,上面只提到一些常用基本的功能