引言:为什么Ollama是AI游戏开发的革命性工具
Ollama作为本地化大语言模型运行框架,正在彻底改变独立游戏开发者和AI爱好者的创作方式。与传统的云端API调用相比,Ollama提供了零成本、低延迟、高隐私的本地AI解决方案,特别适合游戏开发中的NPC对话生成、动态叙事、智能决策等场景。根据2024年最新数据,使用Ollama的游戏项目平均响应时间比云端API快3-5倍,且完全避免了API调用费用。
第一部分:Ollama基础入门(0-1小时)
1.1 安装与配置:避开新手常见陷阱
系统要求:
- Windows 10/11(推荐WSL2)
- macOS 12+(Apple Silicon原生支持)
- Linux(Ubuntu 20.04+)
安装步骤(以Windows为例):
# 1. 下载安装包(推荐使用PowerShell)
curl -fsSL https://ollama.ai/install.ps1 | powershell
# 2. 验证安装
ollama --version
# 应显示:ollama version 0.1.30
# 3. 拉取第一个模型(推荐7B参数量起步)
ollama pull llama3:7b
# 注意:首次下载约需4GB空间,建议使用SSD
# 4. 启动服务(后台运行)
ollama serve
# 默认端口:11434
避坑指南:
- 内存不足:7B模型至少需要8GB RAM,13B需要16GB
- 显存不足:GPU加速需要NVIDIA显卡(8GB+显存)
- 防火墙问题:确保11434端口未被占用
- 模型路径:默认存储在
~/.ollama/models,可修改环境变量
1.2 第一个游戏对话系统
创建简单的NPC对话生成器:
import requests
import json
class OllamaGameNPC:
def __init__(self, model="llama3:7b", host="http://localhost:11434"):
self.model = model
self.host = host
def generate_dialogue(self, character_name, context, player_input):
"""生成NPC对话"""
prompt = f"""你是一个游戏角色{character_name},正在与玩家对话。
背景:{context}
玩家说:{player_input}
请以{character_name}的身份回复,保持角色性格一致。"""
response = requests.post(
f"{self.host}/api/generate",
json={
"model": self.model,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 200
}
}
)
return response.json()["response"]
# 使用示例
npc = OllamaGameNPC()
dialogue = npc.generate_dialogue(
character_name="老铁匠",
context="一个在边境小镇工作了50年的老铁匠,性格固执但善良",
player_input="你好,能帮我修理这把剑吗?"
)
print(f"老铁匠:{dialogue}")
输出示例:
老铁匠:年轻人,这把剑看起来经历过不少战斗啊。剑刃上有几处缺口,剑柄也有些松动了。让我看看...嗯,需要重新淬火,再打磨一下。不过我得提醒你,这把剑的材质比较特殊,修理起来会比普通铁剑贵一些。你愿意出多少银币?
第二部分:进阶技巧(1-4小时)
2.1 游戏状态管理与上下文保持
问题:如何让NPC记住之前的对话历史?
解决方案:实现对话历史管理器
class DialogueHistory:
def __init__(self, max_history=10):
self.history = []
self.max_history = max_history
def add_turn(self, speaker, text):
"""添加对话轮次"""
self.history.append({"speaker": speaker, "text": text})
if len(self.history) > self.max_history:
self.history.pop(0)
def get_context(self):
"""获取对话上下文"""
return "\n".join([f"{turn['speaker']}: {turn['text']}"
for turn in self.history])
class ContextAwareNPC(OllamaGameNPC):
def __init__(self, model="llama3:7b"):
super().__init__(model)
self.memory = DialogueHistory()
def respond(self, character_name, player_input, context=""):
"""带上下文的对话生成"""
# 构建包含历史的提示词
full_context = self.memory.get_context()
if context:
full_context = f"{context}\n\n{full_context}"
prompt = f"""你是一个游戏角色{character_name}。
背景:{full_context}
玩家说:{player_input}
请以{character_name}的身份回复,保持角色性格一致。"""
response = requests.post(
f"{self.host}/api/generate",
json={
"model": self.model,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 200
}
}
)
reply = response.json()["response"]
# 更新历史
self.memory.add_turn("玩家", player_input)
self.memory.add_turn(character_name, reply)
return reply
# 使用示例
npc = ContextAwareNPC()
print("玩家:你好,能帮我修理这把剑吗?")
reply1 = npc.respond("老铁匠", "你好,能帮我修理这把剑吗?",
"一个在边境小镇工作了50年的老铁匠")
print(f"老铁匠:{reply1}")
print("\n玩家:上次你说要多少钱来着?")
reply2 = npc.respond("老铁匠", "上次你说要多少钱来着?")
print(f"老铁匠:{reply2}")
2.2 游戏内事件触发与决策系统
场景:NPC根据玩家行为做出不同反应
class EventDrivenNPC(ContextAwareNPC):
def __init__(self, model="llama3:7b"):
super().__init__(model)
self.event_flags = {} # 存储游戏事件状态
def set_event(self, event_name, value=True):
"""设置事件标志"""
self.event_flags[event_name] = value
def respond_with_events(self, character_name, player_input,
context="", events=None):
"""基于事件的对话生成"""
if events:
for event_name, value in events.items():
self.set_event(event_name, value)
# 构建事件描述
event_desc = ""
if self.event_flags:
event_desc = "当前游戏状态:\n"
for flag, value in self.event_flags.items():
event_desc += f"- {flag}: {value}\n"
prompt = f"""你是一个游戏角色{character_name}。
背景:{context}
{event_desc}
玩家说:{player_input}
请以{character_name}的身份回复,考虑当前游戏状态。"""
response = requests.post(
f"{self.host}/api/generate",
json={
"model": self.model,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 200
}
}
)
reply = response.json()["response"]
# 更新历史
self.memory.add_turn("玩家", player_input)
self.memory.add_turn(character_name, reply)
return reply
# 使用示例:一个会根据玩家声望变化的NPC
npc = EventDrivenNPC()
npc.set_event("player_reputation", "neutral")
npc.set_event("has_completed_quest", False)
print("玩家:你好,我来接取任务。")
reply1 = npc.respond_with_events(
"酒馆老板",
"你好,我来接取任务。",
"一个经验丰富的酒馆老板,发布各种冒险任务"
)
print(f"酒馆老板:{reply1}")
# 玩家完成任务后
print("\n玩家:我已经完成了清理地精的任务。")
reply2 = npc.respond_with_events(
"酒馆老板",
"我已经完成了清理地精的任务。",
"一个经验丰富的酒馆老板,发布各种冒险任务",
{"has_completed_quest": True, "player_reputation": "good"}
)
print(f"酒馆老板:{reply2}")
第三部分:高级实战技巧(4-8小时)
3.1 多模型协作与角色扮演系统
场景:游戏中多个NPC同时对话,需要保持角色一致性
class MultiCharacterSystem:
def __init__(self, models=None):
self.models = models or {}
self.conversation_history = []
def add_character(self, name, model="llama3:7b", personality=""):
"""添加角色"""
self.models[name] = {
"model": model,
"personality": personality,
"memory": DialogueHistory()
}
def generate_dialogue(self, speaker, listener, player_input, context=""):
"""生成角色间对话"""
if speaker not in self.models or listener not in self.models:
raise ValueError("角色不存在")
speaker_info = self.models[speaker]
listener_info = self.models[listener]
# 构建提示词
prompt = f"""你是一个游戏角色{speaker}。
你的性格:{speaker_info['personality']}
你正在与{listener}对话。
背景:{context}
{listener}说:{player_input}
请以{speaker}的身份回复,保持角色性格一致。"""
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": speaker_info["model"],
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 200
}
}
)
reply = response.json()["response"]
# 更新历史
speaker_info["memory"].add_turn(listener, player_input)
speaker_info["memory"].add_turn(speaker, reply)
# 记录对话
self.conversation_history.append({
"speaker": speaker,
"listener": listener,
"player_input": player_input,
"reply": reply
})
return reply
# 使用示例:酒馆中的对话场景
system = MultiCharacterSystem()
system.add_character(
"老铁匠",
personality="固执、直率、经验丰富,说话简短有力"
)
system.add_character(
"酒馆老板",
personality="热情、健谈、喜欢打听消息"
)
print("场景:酒馆中,酒馆老板向老铁匠搭话")
reply = system.generate_dialogue(
speaker="酒馆老板",
listener="老铁匠",
player_input="老铁匠,听说你最近在帮那个冒险者修理武器?",
context="一个普通的酒馆,下午时分,客人不多"
)
print(f"酒馆老板:{reply}")
print("\n老铁匠的回复:")
reply2 = system.generate_dialogue(
speaker="老铁匠",
listener="酒馆老板",
player_input="老铁匠,听说你最近在帮那个冒险者修理武器?",
context="一个普通的酒馆,下午时分,客人不多"
)
print(f"老铁匠:{reply2}")
3.2 性能优化与资源管理
问题:如何在游戏运行时高效管理Ollama资源?
解决方案:实现模型预加载和缓存系统
import threading
import time
from queue import Queue
import json
class OllamaGameEngine:
def __init__(self, max_concurrent=2):
self.models = {}
self.request_queue = Queue()
self.response_cache = {}
self.max_concurrent = max_concurrent
self.active_workers = 0
self.lock = threading.Lock()
def preload_model(self, model_name):
"""预加载模型到内存"""
if model_name not in self.models:
print(f"预加载模型: {model_name}")
# 实际调用Ollama API预加载
requests.post(
"http://localhost:11434/api/pull",
json={"name": model_name}
)
self.models[model_name] = {"loaded": True, "last_used": time.time()}
def generate_with_cache(self, model, prompt, max_cache_age=300):
"""带缓存的生成"""
cache_key = f"{model}:{hash(prompt)}"
# 检查缓存
if cache_key in self.response_cache:
cached = self.response_cache[cache_key]
if time.time() - cached["timestamp"] < max_cache_age:
return cached["response"]
# 生成新响应
response = self._generate(model, prompt)
# 更新缓存
self.response_cache[cache_key] = {
"response": response,
"timestamp": time.time()
}
# 清理旧缓存
self._cleanup_cache()
return response
def _generate(self, model, prompt):
"""实际生成调用"""
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": model,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 150
}
}
)
return response.json()["response"]
def _cleanup_cache(self, max_items=100):
"""清理缓存"""
if len(self.response_cache) > max_items:
# 按时间排序,删除最旧的
sorted_items = sorted(
self.response_cache.items(),
key=lambda x: x[1]["timestamp"]
)
for key, _ in sorted_items[:len(sorted_items) - max_items]:
del self.response_cache[key]
def batch_generate(self, prompts, model="llama3:7b"):
"""批量生成(适合游戏中的多个NPC同时思考)"""
results = []
# 预加载模型
self.preload_model(model)
# 并行处理(限制并发数)
threads = []
for prompt in prompts:
while self.active_workers >= self.max_concurrent:
time.sleep(0.1)
with self.lock:
self.active_workers += 1
thread = threading.Thread(
target=self._worker,
args=(model, prompt, results)
)
thread.start()
threads.append(thread)
# 等待所有线程完成
for thread in threads:
thread.join()
return results
def _worker(self, model, prompt, results):
"""工作线程"""
try:
response = self._generate(model, prompt)
results.append(response)
finally:
with self.lock:
self.active_workers -= 1
# 使用示例:游戏中的批量对话生成
engine = OllamaGameEngine(max_concurrent=2)
# 批量生成多个NPC的对话
prompts = [
"你是一个守卫,看到陌生人靠近城堡,你会说什么?",
"你是一个商人,看到顾客犹豫不决,你会说什么?",
"你是一个法师,看到学徒犯错,你会说什么?"
]
print("批量生成NPC对话...")
responses = engine.batch_generate(prompts)
for i, response in enumerate(responses):
print(f"NPC {i+1}: {response}")
第四部分:避坑指南与常见问题
4.1 性能问题排查
问题1:响应速度慢
原因:模型太大,硬件不足
解决方案:
# 检查模型大小 ollama list # 选择适合硬件的模型 ollama pull llama3:8b # 8B参数,适合8GB RAM ollama pull phi3:mini # 3.8B参数,适合4GB RAM
问题2:内存泄漏
解决方案:定期清理模型缓存 “`python
在游戏循环中定期清理
import requests
def cleanup_ollama():
"""清理Ollama缓存"""
# 停止服务
requests.post("http://localhost:11434/api/stop")
# 重启服务
import subprocess
subprocess.Popen(["ollama", "serve"])
### 4.2 游戏逻辑集成问题
**问题**:AI生成内容与游戏规则冲突
**解决方案**:使用结构化输出和约束生成
```python
import re
class ConstrainedNPC(OllamaGameNPC):
def __init__(self, model="llama3:7b"):
super().__init__(model)
self.game_rules = {
"max_gold": 1000,
"allowed_items": ["sword", "potion", "armor"],
"quest_types": ["fetch", "kill", "escort"]
}
def generate_quest(self, character_name, difficulty="medium"):
"""生成符合游戏规则的Quest"""
prompt = f"""你是一个游戏设计师,需要为{character_name}设计一个任务。
任务难度:{difficulty}
必须遵守以下规则:
1. 任务奖励金币不超过{self.game_rules['max_gold']}
2. 任务类型必须是:{', '.join(self.game_rules['quest_types'])}
3. 任务物品必须是:{', '.join(self.game_rules['allowed_items'])}
请以JSON格式返回任务详情:
{{
"title": "任务标题",
"description": "任务描述",
"reward": {{
"gold": 金币数量,
"items": ["物品1", "物品2"]
}},
"type": "任务类型"
}}"""
response = requests.post(
f"{self.host}/api/generate",
json={
"model": self.model,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.5, # 降低随机性
"top_p": 0.8,
"max_tokens": 300
}
}
)
result = response.json()["response"]
# 解析JSON
try:
# 提取JSON部分
json_match = re.search(r'\{.*\}', result, re.DOTALL)
if json_match:
quest_data = json.loads(json_match.group())
return quest_data
except Exception as e:
print(f"解析失败: {e}")
return None
return None
# 使用示例
npc = ConstrainedNPC()
quest = npc.generate_quest("老铁匠", "medium")
if quest:
print("生成的任务:")
print(json.dumps(quest, indent=2, ensure_ascii=False))
else:
print("任务生成失败,请重试")
4.3 模型选择与调优
不同游戏场景的模型推荐:
| 游戏类型 | 推荐模型 | 参数量 | 适用场景 | 预估响应时间 |
|---|---|---|---|---|
| 文字冒险 | phi3:mini | 3.8B | 简单对话 | 0.5-1秒 |
| RPG对话 | llama3:7b | 7B | 复杂角色 | 1-2秒 |
| 策略游戏 | qwen2:7b | 7B | 决策分析 | 1.5-3秒 |
| 多人游戏 | llama3:13b | 13B | 高质量生成 | 3-5秒 |
调优参数建议:
# 游戏场景参数配置
GAME_CONFIGS = {
"对话生成": {
"temperature": 0.7, # 平衡创意与一致性
"top_p": 0.9,
"max_tokens": 150,
"repeat_penalty": 1.1 # 防止重复
},
"任务生成": {
"temperature": 0.5, # 更确定性
"top_p": 0.8,
"max_tokens": 300
},
"剧情生成": {
"temperature": 0.8, # 更有创意
"top_p": 0.95,
"max_tokens": 500
}
}
第五部分:实战项目案例
5.1 完整的小型RPG对话系统
import json
import random
from datetime import datetime
class SmallRPGGame:
def __init__(self):
self.player = {
"name": "冒险者",
"level": 1,
"gold": 100,
"reputation": 0,
"inventory": []
}
self.npcs = {
"老铁匠": {
"personality": "固执、直率、经验丰富",
"location": "铁匠铺",
"quests": [],
"dialogue_history": []
},
"酒馆老板": {
"personality": "热情、健谈、消息灵通",
"location": "酒馆",
"quests": [],
"dialogue_history": []
},
"神秘法师": {
"personality": "神秘、智慧、说话隐晦",
"location": "法师塔",
"quests": [],
"dialogue_history": []
}
}
self.game_state = {
"current_location": "酒馆",
"time_of_day": "下午",
"weather": "晴朗",
"active_quests": []
}
self.ollama_engine = OllamaGameEngine(max_concurrent=3)
def interact(self, npc_name, player_input):
"""与NPC互动"""
if npc_name not in self.npcs:
return "NPC不存在"
npc = self.npcs[npc_name]
# 构建上下文
context = f"""
游戏状态:
- 地点:{self.game_state['current_location']}
- 时间:{self.game_state['time_of_day']}
- 天气:{self.game_state['weather']}
- 玩家声望:{self.player['reputation']}
- 玩家金币:{self.player['gold']}
NPC信息:
- 名字:{npc_name}
- 性格:{npc['personality']}
- 位置:{npc['location']}
"""
# 生成对话
prompt = f"""你是一个游戏角色{npc_name}。
{context}
玩家说:{player_input}
请以{npc_name}的身份回复,保持角色性格一致,考虑游戏状态。"""
response = self.ollama_engine.generate_with_cache(
model="llama3:7b",
prompt=prompt
)
# 更新历史
npc["dialogue_history"].append({
"timestamp": datetime.now().isoformat(),
"player_input": player_input,
"npc_response": response
})
# 分析对话,可能触发事件
self._analyze_dialogue(npc_name, player_input, response)
return response
def _analyze_dialogue(self, npc_name, player_input, npc_response):
"""分析对话,触发游戏事件"""
# 简单的关键词分析
if "任务" in player_input or "quest" in player_input.lower():
self._offer_quest(npc_name)
elif "购买" in player_input or "buy" in player_input.lower():
self._sell_item(npc_name)
elif "修理" in player_input or "repair" in player_input.lower():
self._repair_item(npc_name)
def _offer_quest(self, npc_name):
"""提供任务"""
prompt = f"""你是一个游戏设计师,需要为{npc_name}设计一个任务。
玩家声望:{self.player['reputation']}
玩家等级:{self.player['level']}
请设计一个适合当前玩家的任务,返回JSON格式:
{{
"title": "任务标题",
"description": "任务描述",
"reward": {{"gold": 金币, "items": ["物品1"]}},
"difficulty": "easy/medium/hard"
}}"""
response = self.ollama_engine.generate_with_cache(
model="llama3:7b",
prompt=prompt
)
try:
import re
json_match = re.search(r'\{.*\}', response, re.DOTALL)
if json_match:
quest = json.loads(json_match.group())
self.npcs[npc_name]["quests"].append(quest)
self.game_state["active_quests"].append(quest)
except:
pass
def _sell_item(self, npc_name):
"""出售物品"""
# 简化的物品系统
items = ["铁剑", "皮甲", "治疗药水", "魔法卷轴"]
item = random.choice(items)
price = random.randint(10, 50)
if self.player["gold"] >= price:
self.player["gold"] -= price
self.player["inventory"].append(item)
return f"你购买了{item},花费{price}金币"
else:
return "你的金币不足"
def _repair_item(self, npc_name):
"""修理物品"""
if "铁剑" in self.player["inventory"]:
cost = 20
if self.player["gold"] >= cost:
self.player["gold"] -= cost
return f"修理完成,花费{cost}金币"
else:
return "你的金币不足"
else:
return "你没有需要修理的物品"
def display_status(self):
"""显示玩家状态"""
print(f"\n=== 玩家状态 ===")
print(f"等级: {self.player['level']}")
print(f"金币: {self.player['gold']}")
print(f"声望: {self.player['reputation']}")
print(f"背包: {', '.join(self.player['inventory'])}")
print(f"当前位置: {self.game_state['current_location']}")
print(f"当前任务: {len(self.game_state['active_quests'])}个")
if self.game_state['active_quests']:
print("\n当前任务:")
for i, quest in enumerate(self.game_state['active_quests'], 1):
print(f" {i}. {quest['title']} (难度: {quest['difficulty']})")
# 运行游戏
def main():
game = SmallRPGGame()
print("=== 欢迎来到AI驱动的RPG世界 ===")
print("你可以与以下NPC对话:老铁匠、酒馆老板、神秘法师")
print("输入 'quit' 退出游戏")
while True:
game.display_status()
npc_name = input("\n选择NPC: ").strip()
if npc_name.lower() == 'quit':
break
if npc_name not in game.npcs:
print("无效的NPC名称")
continue
player_input = input("你说: ").strip()
if player_input.lower() == 'quit':
break
response = game.interact(npc_name, player_input)
print(f"\n{npc_name}: {response}")
if __name__ == "__main__":
main()
第六部分:最佳实践与性能优化
6.1 内存管理策略
问题:长时间运行游戏时内存占用过高
解决方案:
import psutil
import os
class MemoryManager:
def __init__(self, max_memory_gb=4):
self.max_memory = max_memory_gb * 1024 * 1024 * 1024 # 转换为字节
self.model_cache = {}
def check_memory(self):
"""检查当前内存使用"""
process = psutil.Process(os.getpid())
memory_mb = process.memory_info().rss / 1024 / 1024
return memory_mb
def should_unload_model(self, model_name):
"""判断是否应该卸载模型"""
if model_name not in self.model_cache:
return False
# 检查内存使用
current_memory = self.check_memory()
if current_memory > self.max_memory * 0.8: # 使用超过80%
return True
# 检查最近使用时间
last_used = self.model_cache[model_name]["last_used"]
if time.time() - last_used > 300: # 5分钟未使用
return True
return False
def unload_model(self, model_name):
"""卸载模型"""
if model_name in self.model_cache:
# 调用Ollama卸载API
requests.post(
"http://localhost:11434/api/delete",
json={"name": model_name}
)
del self.model_cache[model_name]
print(f"已卸载模型: {model_name}")
def manage_models(self, active_models):
"""管理模型生命周期"""
for model in active_models:
if self.should_unload_model(model):
self.unload_model(model)
# 预加载常用模型
for model in active_models:
if model not in self.model_cache:
self.model_cache[model] = {
"last_used": time.time(),
"size": self._get_model_size(model)
}
def _get_model_size(self, model_name):
"""获取模型大小"""
try:
response = requests.get(
f"http://localhost:11434/api/tags"
)
models = response.json()["models"]
for m in models:
if m["name"] == model_name:
return m["size"]
except:
return 0
return 0
6.2 错误处理与恢复机制
class ResilientOllamaClient:
def __init__(self, max_retries=3, timeout=30):
self.max_retries = max_retries
self.timeout = timeout
self.fallback_models = ["phi3:mini", "llama3:7b"]
def generate_with_fallback(self, prompt, primary_model="llama3:7b"):
"""带降级策略的生成"""
for attempt in range(self.max_retries):
try:
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": primary_model,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 200
}
},
timeout=self.timeout
)
if response.status_code == 200:
return response.json()["response"]
else:
print(f"请求失败,状态码: {response.status_code}")
except requests.exceptions.Timeout:
print(f"请求超时,尝试 {attempt + 1}/{self.max_retries}")
except requests.exceptions.ConnectionError:
print(f"连接错误,尝试 {attempt + 1}/{self.max_retries}")
except Exception as e:
print(f"未知错误: {e}")
# 等待重试
time.sleep(2 ** attempt) # 指数退避
# 降级到备用模型
print("主模型失败,尝试备用模型...")
for fallback in self.fallback_models:
if fallback != primary_model:
try:
response = requests.post(
"http://localhost:11434/api/generate",
json={
"model": fallback,
"prompt": prompt,
"stream": False,
"options": {
"temperature": 0.7,
"top_p": 0.9,
"max_tokens": 200
}
},
timeout=self.timeout
)
if response.status_code == 200:
print(f"使用备用模型 {fallback} 成功")
return response.json()["response"]
except:
continue
raise Exception("所有模型都失败了")
第七部分:未来展望与扩展
7.1 与游戏引擎集成
Unity集成示例(概念代码):
// C# Unity脚本示例
using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
public class OllamaNPC : MonoBehaviour
{
private string ollamaUrl = "http://localhost:11434/api/generate";
private string modelName = "llama3:7b";
public IEnumerator GenerateDialogue(string prompt, System.Action<string> callback)
{
string jsonPayload = JsonUtility.ToJson(new
{
model = modelName,
prompt = prompt,
stream = false,
options = new
{
temperature = 0.7f,
top_p = 0.9f,
max_tokens = 200
}
});
UnityWebRequest request = UnityWebRequest.Post(ollamaUrl, jsonPayload, "application/json");
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
string response = request.downloadHandler.text;
// 解析JSON获取response字段
callback(response);
}
else
{
Debug.LogError("Ollama请求失败: " + request.error);
callback("抱歉,我现在无法回应。");
}
}
}
7.2 多模态扩展(未来方向)
虽然当前Ollama主要支持文本,但未来可能集成多模态模型:
# 未来可能的多模态集成
class MultimodalGameNPC:
def __init__(self):
self.text_model = "llama3:7b"
self.vision_model = "llava:7b" # 假设支持
def analyze_image(self, image_path):
"""分析游戏截图或图像"""
# 未来API可能支持
pass
def generate_with_context(self, text_prompt, image_context=None):
"""结合文本和图像生成"""
if image_context:
# 多模态提示词
prompt = f"图像内容:{image_context}\n\n{text_prompt}"
else:
prompt = text_prompt
return self._generate(prompt)
结语:从新手到专家的路径
通过本指南,你已经掌握了从安装配置到高级实战的完整Ollama游戏开发技能。记住以下关键点:
- 从简单开始:先用7B模型,确保硬件支持
- 逐步优化:先实现功能,再优化性能
- 持续测试:在不同硬件上测试游戏表现
- 关注社区:Ollama社区更新频繁,保持学习
下一步行动:
- 运行第一个示例代码
- 尝试修改参数观察效果
- 集成到你的游戏项目中
- 分享你的经验到Ollama社区
祝你在AI游戏开发的道路上取得成功!
