先做个广告:需要购买Gemini帐号或代充值Gemini会员,请加微信:gptchongzhi
本文目录导读:
推荐使用Gemini中文版,国内可直接访问:https://ai.gpt86.top
作者: 谷歌Gemini中文网编辑
发布日期: 2025年5月
建议阅读对象: 任何有Unity、Unreal Engine或Web游戏开发经验的开发者
核心思想: 让NPC拥有“思想”,让环境能“听懂”指令,而不仅仅是触发预设动作。
大家好,欢迎来到谷歌Gemini中文网的开发者专栏。
过去两年,AI大模型已经从“能聊天”进化到“会做事”,在游戏领域,2024年我们看到了一些粗糙的AI NPC原型,但到了2025年,随着Gemini 2.5 Flash、Gemini 2.5 Pro以及刚刚推出的Gemini 2.5 Pro Experimental(0827) 的成熟,以及Google Game Agent框架的初步整合,将Gemini集成到游戏中的技术栈已经变得清晰且高效。
我们将通过一个具体的案例——为RPG游戏创造一个拥有实时记忆、能根据场景动态生成对话和动作的NPC——来手把手教你如何实现。
最新资讯摘要(2025年5月):
- 低延迟交互: Gemini 2.5 Flash实现了端到端的视觉和音频处理,延迟已低于500ms,适合实时对话。
- 上下文窗口: 2M Token的上下文窗口允许NPC记住玩家之前十几小时的游戏行为。
- Game Agent框架: Google近期推出了专为游戏设计的SDK,封装了语音、视觉和逻辑调用,简化了集成流程。
第一步:准备工作与环境搭建
在编写代码之前,需要确保以下三点到位:
- API Key: 前往 Google AI Studio 获取API密钥,建议使用付费配额,因为游戏中的调用量远大于简单的文字问答。
- 开发平台选择: 推荐使用 Unity (C#) 或 Unreal Engine 5 (C++/Blueprint),本次教程以Unity为例。
- 网络层: 确保你的游戏客户端可以发起HTTPS请求,我们使用官方的
Google.Cloud.AIPlatform.V1库或直接通过HTTP REST API。
架构选择(至关重要):
- 客户端直连(推荐用于单机/轻量化游戏): 直接从Unity发送请求到Gemini API,风险是API Key暴露,可通过后端代理或客户端混淆保护。
- 后端中继(推荐用于MMO/手游): 游戏客户端将动作发给你的服务器,服务器调用Gemini,再将结果返回客户端,本次教程采用客户端直连,以展示核心原理。
第二步:核心接口调用:让NPC“听”和“说”
我们将创建一个GeminiNPC脚本,挂在NPC对象上。
1 定义系统提示(System Prompt)
这是NPC灵魂所在,不要只写“你是一个NPC”,要深入细节:
string systemPrompt = @" 你是酒馆老板“老汤姆”,你是矮人,性格粗犷但热心。 你的知识截止于2025年5月。 你对游戏内事件(玩家完成的任务、当前装备、场景天气)有实时感知。 你的对话风格:爱开玩笑,偶尔会问玩家最近有没有去“铁砧矿洞”(游戏内一个地方)。 如果玩家提到‘黑暗骑士’,你的表情会变得严肃。 响应格式:请以JSON格式输出,包含 'emotion'(表情动作)和 'text'(说话文本)。 不要涉及现实政治或敏感话题。 ";
关键点: 这里给定了角色、知识边界、感知能力、风格和输出格式,格式约束让我们能解析对话并驱动NPC动画。
2 构建上下文
Gemini的强大在于多模态和长上下文,我们要把“游戏状态”喂给它。
// 获取游戏中的实时状态
string playerLevel = PlayerManager.Instance.GetLevel().ToString();
string currentWorldTime = TimeManager.Instance.GetTimeOfDay(); // "Morning"
string playerInventory = string.Join(",", PlayerManager.Instance.Inventory.GetAllItemNames()); // "Sword, Potion"
string recentActions = PlayerManager.Instance.GetRecentQuestLog(); // "Killed the Goblin King"
// 构建消息列表
var messages = new List<Content>
{
new Content { Role = "user", Parts = new List<Part> { new Part { Text = systemPrompt } } },
new Content { Role = "model", Parts = new List<Part> { new Part { Text = "明白,我是老汤姆,准备好招待客人了。" } } },
// 这里模拟玩家刚进酒馆
new Content
{
Role = "user",
Parts = new List<Part>
{
new Part
{
Text = @$"
[游戏状态报告]
- 玩家等级: {playerLevel}
- 当前时间: {currentWorldTime}
- 玩家携带物品: {playerInventory}
- 玩家近期完成事件: {recentActions}
- 天气: 下雨
[玩家当前说]:'嘿,老板,有啥新鲜事?'
"
}
}
}
};
3 调用Gemini API并处理响应
public async Task<NPCResponse> GenerateNPCAction()
{
var client = new HttpClient();
var requestContent = new
{
contents = messages,
generation_config = new
{
temperature = 0.8f, // 让回应更具随机性,更像真人
max_output_tokens = 256,
response_mime_type = "application/json" // 强制输出JSON
}
};
// 序列化并发送(此处省略了具体的URL和Key添加细节)
var json = JsonConvert.SerializeObject(requestContent);
var response = await client.PostAsync("https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash:generateContent?key=YOUR_API_KEY", content);
// 解析返回的JSON
var result = await response.Content.ReadAsAsync<GeminiResponse>();
string rawText = result.candidates[0].content.parts[0].text;
// 解析成我们定义的结构
NPCResponse npcResponse = JsonConvert.DeserializeObject<NPCResponse>(rawText);
// 驱动角色动画
PlayAnimation(npcResponse.emotion); // "angry", "laugh"
// 播放语音(如果有TTS)
PlayVoice(npcResponse.text);
return npcResponse;
}
public class NPCResponse
{
public string emotion { get; set; }
public string text { get; set; }
}
最新技巧: 使用 response_mime_type = "application/json" 是2025年很实用的功能,取代了以前非常繁琐的Few-shot示例,确保模型输出标准的JSON,减少了解析错误。
第三步:进阶玩法:让Gemini“看见”游戏世界
2025年Gemini的视觉能力已经非常成熟,你可以直接将游戏截图(或玩家的摄像头画面)发给Gemini。
应用场景:
- 环境问答: “老汤姆,我墙上这把剑有什么故事?” -> 截取剑的特写,发送给Gemini。
- 物品识别: 玩家捡到一个陌生的药水,Gemini能根据其外观(从截图中解读)动态生成其名称和效果。
代码示例: 在用户消息中,添加一个InlineData类型的Part,传递截图。
byte[] screenshotBytes = ScreenCapture.CaptureRawBytes(); // 获取当前屏幕截图
new Content
{
Role = "user",
Parts = new List<Part>
{
new Part { Text = "看看我的背包里有什么奇怪的东西?" },
new Part
{
InlineData = new Blob
{
MimeType = "image/png",
Data = Convert.ToBase64String(screenshotBytes)
}
}
}
}
注意: 频繁发送截图对带宽和Token消耗巨大,建议使用关键帧采样,例如只在玩家主动询问环境问题时发送,或者在场景切换时发送缩略图。
第四步:从对话到行动:Function Calling
不要让NPC只限于“说”,让它能“做”,Gemini的Function Calling允许模型在需要时主动调用游戏内的函数。
定义函数: 告诉Gemini它可以调用哪些游戏逻辑,打开商店”、“给予玩家任务”、“切换天气”。
var tools = new Tool
{
function_declarations = new List<FunctionDeclaration>
{
new FunctionDeclaration
{
Name = "open_shop",
Description = "打开店铺购买界面,供玩家购买物品。",
Parameters = new OpenApiObject
{
Properties = new Dictionary<string, OpenApiSchema>
{
{ "shop_type", new OpenApiSchema { Type = "string", Description = "店铺类型,如 '黑市'、'药水店'、'武器店'" } }
},
Required = new List<string> { "shop_type" }
}
}
}
};
// 在API请求中传入 tools
// ... requestContent.tools = tools ...
动态交互:
- 玩家说:“老汤姆,我想买点疗伤药。”
- Gemini推理后,返回一个
function_call,参数为{"shop_type": "药水店"}。 - 你的Unity代码收到这个
function_call,执行ExecuteFunction("open_shop", args),打开UI界面。 - 然后你告诉Gemini:“功能已执行,玩家界面已打开。”
这实现了真正的“意图理解与执行”。
总结与最佳实践
- Keep it Simple, Stupid (KISS): 不要一开始就想着做全自主的AI世界,从单一NPC的对话增强做起。
- Cost Control(成本控制): Token是钱,使用Gemini 2.5 Flash(成本仅为Pro的1/10)处理大部分实时对话,只在剧情关键节点或复杂推理时调用Gemini 2.5 Pro。
- Caching(缓存): 对于NPC的“常规问候语”,利用Gemini的上下文缓存功能,将系统提示和游戏背景知识预缓存,大幅降低延迟和成本。
- 安全护栏: 设置严格的系统提示,并开启API端的安全设置,不要相信玩家输入,对返回内容也要做二次过滤(检查是否包含不适宜的词)。
- 异步与回退: AI调用可能失败(网络问题、内容被拒),一定要有回退逻辑,比如播放预设的台词:“哦,我嗓子有点哑,你再说一遍?”
下一步探索
- 实时语音: 集成Google Cloud Speech-to-Text和Text-to-Speech,让玩家直接和Gemini NPC说话。
- Game Agent SDK: 关注Google近期推出的Game Agent SDK,它简化了上述很多步骤,甚至内置了用于控制角色移动和攻击的底层Agent。
将Gemini集成到游戏中,不再是科幻小说里的噱头,它是2025年增强游戏沉浸感、打破传统叙事枷锁最强大的工具,从今天开始,给你的游戏角色装上“数字大脑”吧。
(本文基于谷歌Gemini中文网编辑团队对2025年5月最新API文档及社区实践案例的整理,实际开发请以Google最新官方文档为准。)


