NPC配置总览

NPC的配置文件在project/config/npc/目录下,以json格式存储,每个NPC一个文件,文件名为NPC的姓名。

NPC的初始化有两种方式,一种是通过NPC配置文件,一种是通过UDP数据包

支持对NPC的人设、记忆、情绪、状态进行配置。

NPC配置方法

配置文件初始化

绝大多数NPC都应当以 “NPC_NAME.json”的方式放在project/config/npc/目录下,然后在Scenario配置文件中引用。

在Scenario初始化的时候,会自动读取NPC的配置文件,将NPC的初始状态加载到引擎。

如果一个NPC在多个Scenario中被初始化,只有第一次是有效的,后续的初始化会被忽略。 下面是一个例子:

# project/config/npc/村长.json
{
    "name": "村长",  # 角色姓名
    "desc": "村长有着浓密的白色胡须,出生于1940年,喜欢抽中华烟,他白天会在瓜田工作,晚上会在广场上遛弯,如果遇到矛盾他会主持调节,太晚了的时候就会回家睡觉。村长最喜欢吃西瓜。",  # 角色描述,一般包含外貌、出生日期、兴趣爱好、生活习惯等
    "mood": "开心",   # 当前的角色情绪
    "npc_state": {   # 角色当前状态
        "position": "李大爷家",   # 角色所在位置
        "observation": {   # 角色观测到的信息
            "people": [   # 角色观测到的人
                "王大妈",
                "村长",
                "隐形李飞飞"
            ],
            "items": [   # 角色观测到的物体
                "椅子#1",
                "椅子#2",
                "椅子#3[李大爷占用]",
                "床[包括:被子、枕头、床单、床垫、私房钱]"
            ],
            "locations": [   # 角色观测到的地点
                "李大爷家大门",
                "李大爷家后门",
                "李大爷家院子"
            ]
        },
        "backpack": [   # 角色随身携带的物体
            "中华烟[剩余4根]",
            "1000元",
            "吃了一半的西瓜"
        ]
    },
    "action_space": ["mov", "chat"],  # 人物的动作空间(在实际执行的时候,场景的all_actions和人物action_space取交集)
    "memory": [   # 角色的记忆,一般按照时间顺序列举, 引擎运行时可以参考,同时会更新一部分
        "11年前由于对村子做出巨大贡献被村民们推举为新一任村长。",
        "9年前调节某村民婚礼期间发生的纠纷。",
        "7年前管理的村子被评为十佳美丽乡村。"
    ],  # [可以留空 但是必须存在该字段]
    "purpose": "村长想去广场散步,因为他喜欢晚上在广场上遛弯,享受清新的空气和宁静的夜晚。",   # 角色当前的意图,一般指短期意图[仅作调试用 可以不包含这个字段 其不会生效 NPC在引擎关闭的时候会自动生成到这里 供你查看]
    "action": {   # 角色当前执行的动作[仅调试用 可以不包含这个字段]
        "action": "mov",
        "object": "广场",
        "parameters": "",
        "npc_name": "村长",
        "name": "action"
    }
}

UDP方式初始化

UDP方式是对NPC配置文件的补充,可以在游戏运行过程中动态的添加新的NPC。(存在则覆盖)

Engine关闭后,新NPC的状态会被保存到project/config/npc/目录下的NPC配置文件中。

init_packet = {
    "func": "init",
    # 必填字段,代表在什么场景初始化
    "scene_name": "雁栖村",
    "language": "C",
    # 下面是🉑️选
    "npc": [
        {
            "name": "渔夫阿强",
            "desc": "渔夫阿强是一个老练的渔民,擅长捕鱼和航海。他有一头浓密的白发和一双狡猾的眼睛。阿强经验丰富,对海洋和天气变化有着敏锐的观察力。",
            "mood": "满足",
            "npc_state": {
                "position": "河边钓鱼点",
                "observation": {
                    "people": [],
                    "items": ["船舱", "渔网", "渔具", "航海地图", "渔获"],
                    "locations": ["船舱内部", "甲板"]
                },
                "backpack": ["鱼饵", "渔具维修工具"]
            },
            "action_space": ["mov", "chat"],  # 人物的动作空间(在实际执行的时候,场景的all_actions和人物action_space取交集)
            "memory": [
                "从小就跟随父亲学习捕鱼技巧。",
                "曾多次出海捕鱼,积累丰富的经验。",
                "对海洋生态保护有着浓厚的兴趣。",
                "帮助其他渔民修理损坏的渔具。",
                "梦想拥有一艘自己的渔船,开展独立的渔业。"
            ]
        },
        {
            "name": "猎人阿明",
            "desc": "猎人阿明是一位勇敢而机敏的猎人。他身材魁梧,肌肉发达,眼神犀利。阿明擅长追踪和狩猎各种野生动物,具有过人的耐力和狙击技巧。",
            "mood": "专注",
            "npc_state": {
                "position": "猎人小屋",
                "observation": {
                    "people": [],
                    "items": ["猎枪", "弓箭", "追踪装备", "野外求生工具"],
                    "locations": ["猎人小屋内部", "周围的森林"]
                },
                "backpack": ["干粮", "水壶", "急救包"]
            },
            "action_space": ["mov", "chat"],  # 人物的动作空间(在实际执行的时候,场景的all_actions和人物action_space取交集)
            "memory": [
                "从小生活在山区,接受父亲的猎人训练。",
                "熟悉各种野生动物的习性和行踪。",
                "常常在附近的森林中追踪并捕获猎物。",
                "有着长时间在野外生存的经验。",
                "一日作息:清晨起床后进行锻炼和瞄准训练,白天进行狩猎和追踪,傍晚返回小屋整理装备并准备晚餐,晚上休息并回顾一天的狩猎经历。"
            ]
        }
    ],  # 可以留空,默认按照scene.json初始化场景NPC。非空则在之前基础上添加。
}