资讯动态

用AI打造恐怖游戏:Godot 4开发全流程实录

发布时间:2026/8/30 17:53:42 来源:尧图企业网站定制
先交代一下这次实验的起因。之前一直想做一个氛围向的恐怖游戏但美术资产、程序脚本、叙事文案三座大山堆在一起进度始终卡在“空房间打转”的阶段。后来决定换一条路让AI来写核心玩法、生成剧情台词、甚至输出可用的语音素材。结果流程跑通之后最意外的不是Demo能跑而是AI生成的剧情和音频在深夜测试时真的把自己吓到了。这篇文章会把整套流程完整拆开包括工具选型、Prompt设计、Godot 4 代码实现、中英双语叙事生成、音效合成以及AI辅助开发中的避坑经验适合想用AI加速独立游戏原型开发、又怕被“幻觉代码”带偏的开发者参考。1. 为什么恐怖游戏是最适合AI辅助的实验场1.1 恐怖游戏开发的核心难点恐怖游戏和普通休闲游戏最大的区别在于它的核心体验是“情绪”。玩家需要的不是爽快的反馈而是持续的紧张感、未知感和压迫感。这种体验对资产质量、节奏控制、叙事氛围要求非常高直接导致恐怖游戏是独立开发者最难完成的一种类型。具体来说难点集中在几块场景氛围黑暗走廊不是简单地把灯光调暗而是要控制明暗对比、镜头晃动、音效层次。剧情文本恐怖游戏需要有日记、纸条、录音、怪物低语等碎片化叙事文本量大且需要风格统一。玩法脚本保险丝、密码锁、钥匙、追逐战、隐藏区域交互逻辑又多又碎。音频资产脚步声、心跳、低频嗡鸣、贴脸jump scare普通开发者很难独立制作。这些环节恰恰是AI大语言模型、AI绘画、AI音频工具目前最擅长的领域。AI不一定能直接给你一个完整上架的恐怖游戏但能把一个Demo的产出效率提升好几倍。1.2 AI能在哪些环节介入游戏开发很多人对AI辅助游戏开发的认知还停留在“让AI写一段代码”。但从这次实验来看AI在恐怖游戏开发中的参与度可以覆盖整个production pipeline环节AI介入方式输出物玩法设计让AI生成GDD游戏设计文档、拆解玩法循环设计文档、任务列表程序开发生成GDScript/C#脚本、解释报错原因可运行代码剧情叙事生成多语言文本、控制叙事节奏日记、纸条、对话文本音频设计用TTS合成低语、生成音频提示词语音文件、混音建议美术参考用AI绘画生成概念图、纹理参考概念图、氛围参考测试反馈让AI扮演玩家视角列出体验漏洞Bug清单、优化建议所以这次的实验选了恐怖游戏不是因为它最简单而是因为它最能展示AI辅助开发的价值——一个内容量极大的品类正好需要AI来“填内容”。1.3 本次实验的目标文章里的实战部分目标是制作一个可运行的3D第一人称恐怖游戏Demo名字叫 The Corridor。玩家在一条废弃研究走廊里醒来需要找到三份日记碎片每找到一份就会解锁一段AI生成的恐怖文本。与此同时走廊深处有一个会主动追踪玩家的怪物玩家被追上就会触发游戏结束。为了让“中英双语”这个特性不只是一个标题噱头整个项目的叙事文本会刻意做成英文原始文本 中文翻译对照的形式最后还会用TTS把关键台词合成为音频直接放进游戏里。这样就能完整验证 AI从文本、到代码、再到音频的全链路能力。2. 环境准备与工具选型2.1 为什么选择Godot 4AI辅助开发游戏引擎选型非常重要。Unity和Unreal是行业主流但如果在AI生成代码的场景下比较Godot 4 有很明显的优势对比项Godot 4UnityUnreal安装包体积小下载快较大需要Hub非常庞大初学成本低GDScript语法简单中C#需要一定基础高C蓝图复杂AI生成代码准确率高节点API简洁中版本差异大较低涉及C更复杂打开项目速度快慢慢3D能力够用适合中小型Demo全面顶级对AI辅助开发来说最关键的是“AI生成代码的准确率”。Godot 4的GDScript语法简洁节点树组织清晰大语言模型训练数据中包含大量Godot代码示例因此生成的脚本通常能接近可运行状态。如果选择UnityAI生成的C#脚本经常因为Render Pipeline、Input System新老版本差异而报错。版本说明本文的实战案例使用 Godot 4.x。不同小版本的API略有差异但本文使用的 PlayerController、CharacterBody3D、Area3D、RayCast3D 都是4.x通用API没有绑定某个特定的次级版本。如果你使用的是 Godot 3.x请注意对应API会有明显不同。2.2 AI工具链组合这次实验用到的AI工具并不多关键是搭配合理对话式大模型用于生成代码、剧情、设计文档例如 ChatGPT、Claude、通义千问、文心一言等只要支持长上下文都可以。AI绘画工具用于生成参考概念图例如 Midjourney、Stable Diffusion WebUI用来为场景氛围和怪物外观定调。TTS工具使用 edge-tts 或云端TTS把AI文本转成音频这是低成本生成恐怖语音的最佳方式。代码编辑器VS Code 或 Godot 内置编辑器配置好 GDScript 语法高亮即可。在实际项目中也可以接入“AI编程助手”插件比如在VS Code中安装Continue、通义灵码、CodeGeeX等让代码补全直接在编辑器里完成。2.3 安装Godot并创建项目首先到 Godot 官网下载对应系统的标准版解压后直接运行。不需要额外安装依赖。打开后新建项目选择3D场景模板项目名字可以写成TheCorridor。项目创建完成后整个项目文件夹结构如下TheCorridor/ ├── project.godot ├── assets/ │ ├── audio/ │ ├── models/ │ └── textures/ ├── scenes/ │ ├── main.tscn │ └── player.tscn └── scripts/ ├── player.gd ├── enemy.gd ├── interactable.gd └── game_manager.gd后续所有代码和资产都会按这个结构组织。3. 用AI做需求设计与Prompt工程3.1 先拆需求再让AI写代码很多开发者让AI写游戏脚本得到一堆跑不起来的代码核心原因不是AI能力不行而是没有把需求拆到位。恐怖游戏这类复杂项目需求描述越模糊AI输出的代码越容易偏离目标。正确的做法是先把整个项目拆成最小可玩单元。对 The Corridor 来说我把它拆成了五个部分玩家控制第一人称视角、WASD移动、鼠标视角、与物体交互。地图场景一条封闭走廊有若干房间门、灯光、可拾取物品。敌人AI怪物在走廊里巡逻发现玩家后追向玩家碰到玩家造成游戏结束。拾取与日记系统玩家靠近日记按E键拾取屏幕显示日记内容。音频与氛围背景低频音、脚步声、怪物低语、拾取日记时播放语音。每个部分再继续拆分直到可以形成一条清晰的Prompt指令。3.2 让AI生成设计文档需求拆解后可以让AI输出一份结构化的游戏设计文档。下面是一段实际使用的Prompt示例你是一名资深恐怖游戏策划。请为以下需求撰写一份游戏设计文档GDD 要求结构清晰、可直接用于开发 游戏名The Corridor 类型第一人称心理恐怖 平台PC 核心玩法玩家在废弃研究走廊中寻找3份日记碎片每次拾取会触发 一段恐怖叙事文本同时怪物会逐渐逼近玩家。 怪物机制怪物初始在地图远端待机当玩家拾取日记后怪物会向玩家 当前位置移动玩家可以通过跑动拉开距离。 胜利条件收集全部3份日记并到达出口。 失败条件怪物接触玩家。 胜利/失败都要播放结局画面。 请输出核心循环、场景结构、怪物行为列表、玩家能力列表、UI界面列表。AI输出的GDD不需要完全照做但可以作为项目开发的需求列表后续所有Prompt都可以引用这份文档避免会话上下文丢失。这种方式比每次从零描述要高效得多。3.3 Prompt技巧给AI设定角色与输出约束在让AI生成代码时最常见的失败原因是输出格式混乱、没有上下文、代码与引擎版本不匹配。有效的Prompt应该包含四个要素角色设定让AI以“资深Godot开发者”的身份回答。技术栈明确引擎版本和语言。输出约束要求给出完整代码、注释和挂载位置。上下文贴入项目结构和已有代码片段。例如你是一名资深Godot 4开发者请用GDScript编写一个第一人称玩家控制器脚本。 要求 1. 使用CharacterBody3D作为根节点。 2. 相机挂在玩家节点下负责鼠标视角旋转。 3. 支持WASD移动、空格跳跃、Shift加速跑。 4. 实现射线交互按E键与Interactable对象交互。 5. 每个关键步骤都要有中文注释。 6. 输出完整脚本并说明节点树应该如何搭建。用这种方式生成的脚本质量明显高于“帮我写一个玩家控制器”这种模糊请求。4. 实战用AI搭建可运行的恐怖游戏Demo4.1 搭建Player场景在Godot中新建一个场景根节点类型选择CharacterBody3D命名为Player然后保存为scenes/player.tscn。节点树结构如下Player (CharacterBody3D) ├── Camera3D ├── RayCast3D ├── CollisionShape3D └── AudioStreamPlayer3D其中Camera3D是玩家的眼睛RayCast3D用于交互检测CollisionShape3D负责碰撞体积AudioStreamPlayer3D用于播放脚步等3D音效。4.2 AI生成玩家控制脚本玩家控制脚本是整个项目最基础、也最重要的代码。把上面那条Prompt交给AI生成后再人工调整完善得到的核心代码类似下面这样# 文件路径scripts/player.gd extends CharacterBody3D ## 基础移动参数 export var move_speed: float 4.0 export var sprint_speed: float 6.5 export var jump_velocity: float 4.5 export var mouse_sensitivity: float 0.002 export var interact_distance: float 3.0 ## 重力与加速度参数 var gravity: float 9.8 var current_speed: float 0.0 ## 节点引用 onready var camera: Camera3D $Camera3D onready var raycast: RayCast3D $RayCast3D onready var audio_player: AudioStreamPlayer3D $AudioStreamPlayer3D func _ready() - void: # 隐藏鼠标指针进入第一人称视角 Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) # 设置交互射线检测距离 raycast.target_position Vector3(0, 0, -interact_distance) func _unhandled_input(event: InputEvent) - void: # 鼠标控制视角旋转 if event is InputEventMouseMotion and Input.get_mouse_mode() Input.MOUSE_MODE_CAPTURED: rotate_y(-event.relative.x * mouse_sensitivity) camera.rotate_x(-event.relative.y * mouse_sensitivity) # 限制相机俯仰角防止视角翻转 camera.rotation.x clamp(camera.rotation.x, -1.4, 1.4) # 按ESC释放鼠标便于调试 if event.is_action_pressed(ui_cancel): Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) func _physics_process(delta: float) - void: # 处理重力 if not is_on_floor(): velocity.y - gravity * delta # 跳跃 if Input.is_action_just_pressed(ui_accept) and is_on_floor(): velocity.y jump_velocity # 根据Shift状态选择移动速度 current_speed sprint_speed if Input.is_action_pressed(sprint) else move_speed # 获取WASD输入并转换到世界空间方向 var input_dir : Input.get_vector(move_left, move_right, move_forward, move_back) var direction : (transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized() if direction: velocity.x direction.x * current_speed velocity.z direction.z * current_speed else: # 没有输入时水平减速让移动手感更顺滑 velocity.x move_toward(velocity.x, 0, current_speed * 4.0 * delta) velocity.z move_toward(velocity.z, 0, current_speed * 4.0 * delta) move_and_slide() # 每帧执行一次交互检测 _check_interaction() func _check_interaction() - void: if Input.is_action_just_pressed(interact): if raycast.is_colliding(): var hit_obj raycast.get_collider() if hit_obj and hit_obj.has_method(on_interact): hit_obj.on_interact()这段脚本的关键点在于Input.get_vector把 WASD 输入转换为一个二维向量避免手写多个if判断。transform.basis * Vector3(...)把输入方向从本地坐标转换到世界坐标确保方向跟随相机朝向。mouse_sensitivity使用export暴露到编辑器方便后续调参。交互检测使用RayCast3D比Area3D更精准适合玩家正前方交互的场景。4.3 设置输入映射在项目设置 - 输入映射中添加以下动作动作名默认按键move_forwardW / 上箭头move_backS / 下箭头move_leftA / 左箭头move_rightD / 右箭头sprintShiftinteractEui_accept空格ui_cancelESC这些动作名称必须和 player.gd 中的Input.get_vector参数保持一致否则输入无效。4.4 AI生成敌人追逐AI敌人AI的核心要求是初始待机玩家拾取日记后开始向玩家移动接触玩家触发游戏结束。用AI生成时Prompt可以这样写使用GDScript编写一个3D敌人脚本 1. 敌人使用CharacterBody3D。 2. 初始状态为 idle不移动。 3. 当游戏全局变量 diary_count 大于0时进入 chase 状态。 4. chase状态下向玩家方向移动速度比玩家慢一点。 5. 与玩家距离小于0.8米时调用game_over()函数。 6. 需要给移动留一点延迟和随机扰动让怪物看起来不是精准锁定。生成的脚本经过整理后如下# 文件路径scripts/enemy.gd extends CharacterBody3D export var move_speed: float 3.2 export var player_path: NodePath var player: Node3D var state: String idle var rng RandomNumberGenerator.new() onready var detection_area: Area3D $DetectionArea func _ready() - void: rng.randomize() if player_path: player get_node(player_path) func _physics_process(delta: float) - void: # 状态切换根据游戏进度逐渐唤醒怪物 if GameManager.diary_count 0: state chase if state idle: # 待机时轻微飘动增加恐怖感 velocity Vector3.ZERO position.y 0.5 sin(Time.get_ticks_msec() * 0.003) * 0.02 elif state chase and player: # 朝玩家移动加入随机扰动避免AI行为太机械 var to_player: Vector3 (player.global_position - global_position).normalized() var noise: Vector3 Vector3(rng.randf_range(-0.2, 0.2), 0, rng.randf_range(-0.2, 0.2)) velocity (to_player noise) * move_speed # 面向玩家 look_at(Vector3(player.global_position.x, global_position.y, player.global_position.z)) # 接触检测 if global_position.distance_to(player.global_position) 0.8: GameManager.game_over() move_and_slide()这里特别说明一下look_at那一行。为了避免怪物在下蹲或高低差情况下出现奇怪倾斜这里强制让怪物的y坐标与自身保持一致只旋转水平朝向。4.5 创建全局游戏管理脚本追逐AI脚本里调用了GameManager.game_over()和GameManager.diary_count因此需要创建一个全局单例脚本来管理游戏状态。# 文件路径scripts/game_manager.gd extends Node signal game_over_signal signal diary_collected(new_count: int) var diary_count: int 0 var total_diaries: int 3 var is_game_over: bool false func collect_diary() - void: if is_game_over: return diary_count 1 diary_collected.emit(diary_count) if diary_count total_diaries: # 全部收集完成进入胜利状态可以扩展为切换场景 _win_game() func game_over() - void: if is_game_over: return is_game_over true game_over_signal.emit() print(Game Over) func _win_game() - void: print(You escaped the corridor.) # 这里可以显示胜利UI或切换场景在项目设置中把game_manager.gd注册为全局单例名字叫GameManager。这样enemy.gd和interactable.gd才能直接使用GameManager.diary_count。4.6 AI生成拾取与日记系统日记系统的核心是当玩家靠近日记模型并按E键时显示日记文本并增加diary_count。为了让这类交互对象可以大量复用我让AI生成一个通用的interactable.gd脚本# 文件路径scripts/interactable.gd extends Area3D export var diary_id: int 1 export var title: String 日记碎片 export_multiline var content_en: String export_multiline var content_zh: String func on_interact() - void: # 防止重复拾取 if not visible: return # 把日记内容发送到UI层显示 var diary_ui get_tree().get_first_node_in_group(diary_ui) if diary_ui: diary_ui.show_diary(title, content_en, content_zh) # 更新全局日记计数 GameManager.collect_diary() # 隐藏日记模型表示已被拾取 visible false在场景中为每个日记模型创建Area3D节点挂载这个脚本并把日记内容填到content_en和content_zh属性中。这里需要提醒的是不要用queue_free()隐藏日记因为后续可能还想做“已拾取日记清单”功能隐藏加标记的方式更适合扩展。4.7 组装场景并测试在主场景中创建地面、走廊墙壁、灯光、敌人、日记模型。玩家节点添加方式有两种菜单选择“当前场景”运行把player.tscn实例拖入主场景。或者设置主场景为main.tscn后直接运行。在main.tscn中把敌人节点的player_path指向玩家节点。此时运行项目应该可以完成WASD移动鼠标视角观察。按E拾取日记。拾取后屏幕显示日记内容。怪物开始追逐。到这里一个不包含任何AI的“普通恐怖游戏”已经能跑了但内容还比较空。接下来的关键一步是用AI产出真正吓人的叙事文本和音频。5. AI驱动的中英双语恐怖叙事实验5.1 用AI生成带有“递进恐怖感”的日记文本恐怖叙事最忌讳的是“一次性把恐怖全说出来”。好的恐怖文本应该层层递进第一份日记是困惑第二份是恐惧第三份是绝望。这个结构可以用Prompt来约束AI。你是恐怖小说作家。请创作三份日记碎片主题是“废弃研究走廊里的实验体苏醒”。 要求 1. 第一份日记表达困惑与不安篇幅100词以内。 2. 第二份日记表达恐惧与身体异常篇幅120词以内。 3. 第三份日记表达绝望与自我认知崩塌篇幅150词以内。 4. 每份日记都输出英文原文和中文翻译。 5. 不要直接写“怪物”用暗示和细节让读者自己感受到异常。AI输出的结果经过筛选后我使用了下面这份英文版作为游戏内文案Diary #1 They told me the corridor was sealed for safety. But tonight I heard footsteps on the other side of the wall. Slow. Heavy. Almost like it was learning how to walk again. 翻译 他们告诉我这条走廊因为安全原因被封锁了。但今晚我听到墙的另一边有脚步声。很慢、很重像是它正在重新学习如何走路。Diary #2 It knows my name now. It whispered it through the door when I was trying to sleep. I checked the security camera and saw nothing in the hallway. But the door handle moved. Just a little. Just enough to let me know it can open the door anytime. 翻译 它现在知道我的名字了。我准备睡觉时它隔着门低语了我的名字。我查看监控摄像头走廊里什么都没有。但门把手动了只是动了一点点。刚好足够让我知道它随时都能打开这扇门。这种文本风格很适合AI生成因为它的判定标准不在于“对不对”而在于“氛围足不足”。AI在氛围描写上的平均水平和合格写手差距已经不大。5.2 用AI绘画生成场景概念参考恐怖游戏的美术资产门槛很高但Demo阶段不需要实际模型可以先让AI绘画生成场景概念图用来贴在CanvasLayer里作为加载画面或过场CG。可以使用类似下面的PromptA dark abandoned research corridor, flickering fluorescent lights, wet concrete walls, a distant silhouette at the end of the hall, first-person horror game concept art, cinematic lighting, highly detailed, Unreal Engine style, wide angle, misty atmosphere.得到的图不需要精确到像素可以作为灯光设计和氛围调色的参考。在Godot中可以把概念图直接作为TextureRect显示在CanvasLayer上也能当作用户界面背景。5.3 用TTS把恐怖台词变成音频纯文字展示只是“阅读恐怖”如果日记内容能在拾取瞬间以低语形式播放出来恐怖指数会明显提升。这里使用了 edge-tts它可以通过命令行直接把文本转为MP3支持多种中文和英文语音。安装命令pip install edge-tts生成中文低语语音使用 zh-CN-XiaoxiaoNeural 女声适合走廊环境的柔和低语感edge-tts --voice zh-CN-XiaoxiaoNeural --rate-20% --pitch-5Hz --text 它知道我的名字了。它隔着门低语了我的名字。 --write-media diary02_zh.mp3生成英文语音edge-tts --voice en-US-AriaNeural --rate-10% --pitch-3Hz --text It knows my name now. It whispered it through the door. --write-media diary02_en.mp3生成后把MP3文件放入assets/audio/目录然后在日记拾取脚本中播放# 在 interactable.gd 中增加音频播放 export var diary_audio_en: AudioStream export var diary_audio_zh: AudioStream var audio_player: AudioStreamPlayer func _ready() - void: audio_player AudioStreamPlayer.new() add_child(audio_player) # 如果游戏语言为中文播放中文语音否则播放英文语音 if GameManager.language zh: audio_player.stream diary_audio_zh else: audio_player.stream diary_audio_en func on_interact() - void: # ... 原有拾取逻辑 ... audio_player.play()这里有一个实用技巧把TTS参数中的--rate-20%和--pitch-5Hz结合可以让合成语音的语速变慢、音调降低比默认TTS发音更有“低语感”。如果你想要更明显的恐怖效果还可以在音频播放时再加一个AudioEffectReverb混响效果模拟走廊环境。5.4 在Godot中实现日记显示UI为了让日记显示不打断游戏节奏我在main.tscn中新建了一个CanvasLayer并添加一个Panel内部放两个标签TitleLabel和ContentLabel。脚本如下# 文件路径scripts/diary_ui.gd extends Panel onready var title_label: Label $MarginContainer/VBoxContainer/TitleLabel onready var content_label: Label $MarginContainer/VBoxContainer/ContentLabel var is_visible: bool false func _ready() - void: hide() add_to_group(diary_ui) func show_diary(title_text: String, content_en: String, content_zh: String) - void: title_label.text title_text # 根据全局语言设置选择显示语言 if GameManager.language zh: content_label.text content_zh else: content_label.text content_en show() is_visible true # 自动隐藏也可以改为按任意键关闭 get_tree().create_timer(6.0).timeout.connect(hide)这里add_to_group(diary_ui)对应interactable.gd中的get_tree().get_first_node_in_group(diary_ui)这是Godot中一种轻量级的跨脚本通信方式适合Demo阶段使用。5.5 一个不算意外的“惊吓瞬间”这部分的体验是整个项目最有趣的地方。在测试第三份日记时AI生成的英文文本是“The facility was never sealed to keep me out. It was sealed to keep itself from remembering.” 配合减速后的TTS女低音在空旷走廊里播放再加上敌人刚好在背后出现那一瞬间确实被吓到了。这提醒我一件事当AI生成的内容足够贴合场景氛围时恐怖游戏的“吓人效果”是会上涨的这也意味着开发者在测试时最好避免在深夜反复调试。6. 常见问题排查与AI翻车场景AI生成内容不是次次都好用这个项目里也踩了不少坑。下面把高频问题整理成一张速查表方便之后项目复用。问题现象常见原因解决思路生成的GDScript用到了不存在的API大模型知识库版本与新版本不一致报错时直接复制错误信息让AI修正并明确要求“给出Godot 4.x兼容写法”角色一直往下掉或穿模CollisionShape3D没有配置或CharacterBody3D没有move_and_slide()检查场景树中CollisionShape确认代码中调用了move_and_slide()按WASD没反应输入映射没有配置或动作名不一致打开项目设置检查输入映射核对动作名拼写E键无法拾取日记RayCast3D方向错误或距离太短调整target_position确认射线终点在日记的碰撞体上怪物不动没把玩家节点赋值给player_path在主场景选中敌人检查player_path属性是否指向PlayerAI绘画输出不可商用部分模型的训练数据有版权风险仅用于个人Demo和灵参考商业项目应替换自绘资产或使用明确可商用素材edge-tts合成语音不自然没有调整速率、音调参数增加--rate-10%到-20%--pitch-3Hz到-5Hz尝试游戏运行卡顿场景灯光数量过多、阴影质量过高减少实时灯光或把阴影质量调低先用烘焙光照替代6.1 典型AI“幻觉代码”案例分析在一次测试中AI给出一段看起来合理的Node初始化代码使用了get_tree().get_root().get_node(Player)来获取玩家节点。问题在于实际运行的场景中玩家节点在main.tscn下的路径层次不同最终导致空引用错误。正确的做法是根据实际场景树路径配置节点引用或者在export中拖拽赋值。这个案例说明AI生成的代码如果涉及场景树路径必须人工核对不能直接信任。6.2 排查流程建议遇到AI生成代码报错我的排查顺序固定为先复制完整报错信息送给同一个AI会话让它解释错误原因。如果AI给出的修正方案涉及多个文件要求它明确说明每个文件路径。在Godot中逐步验证先确认单例注册再确认场景树节点再确认输入映射。运行时不直接看画面先看Output面板的print日志确认状态机切换是否符合预期。这套流程帮助我缩短了至少一半的调试时间。7. 把AI融入游戏开发的工程建议7.1 AI生成代码但要建立“代码审查”清单AI生成的代码可以当初稿但不能直接当最终代码。建议为团队或个人建立一份审查清单是否包含与引擎版本不兼容的API是否有未定义的单例、节点路径或信号export的路径引用是否在编辑器里正确赋值是否处理了空引用和边界条件性能是否合理在循环中是否每帧创建了对象这条清单在AI辅助开发中尤为重要因为AI生成代码时的“自信”并不等于“正确”。7.2 用“AI会话存档”维护项目上下文游戏项目是长周期的AI会话很容易丢失上下文。我的做法是为每个子系统单独建立一个文档比如docs/prompts/player_prompt.md、docs/prompts/enemy_prompt.md记录每次对话中效果好的Prompt版本。下次继续开发时直接复制存档中的Prompt再补充新需求。这比每次从零描述需求高效得多。7.3 资产版权与合规AI生成内容在商业项目中的版权问题还在不断演变所以这篇文章的重点是个人学习和原型验证。如果项目准备发布或商用需要做到美术模型和贴图必须确认授权状态AI绘画生成物并不能天然保证商用无忧。TTS合成语音确认服务条款是否允许商用发布。字体、音效、背景音乐建议全部使用明确可商用的资源。7.4 适合AI辅助的游戏类型从实验来看AI辅助开发最适合的是“内容量大于系统复杂度”的游戏类型比如视觉小说、恐怖探索、解谜叙事。这类游戏的核心代码逻辑相对固定AI能高效生成而内容生成正是AI最擅长的长文本、多分支剧情。反过来如果游戏核心是复杂的物理模拟、多人网络同步、策略平衡AI可以帮忙写脚手架但核心系统仍然需要人工深度参与。7.5 用AI做“体验测试员”这个项目里我还让AI扮演“第一次玩恐怖游戏的新手玩家”请它列出游戏中最容易被卡住的时刻以及可以加jump scare的节奏点。AI给出的建议虽然不能替代真实玩家测试但能提前发现很多设计层面的盲区比如“日记拾取时没有强制暂停玩家可能没来得及看文本就被怪物追上”这条建议直接促成了自动隐藏UI前短暂暂停游戏时间的改动。8. 下一步可以怎么继续这次实验验证了一件事AI参与开发可以把一个“至少需要两三周”的恐怖游戏原型压缩到几天内跑通。The Corridor 目前还只是一个最简Demo距离完整的游戏还差不少环节但核心机制已经成立。如果打算在这个项目基础上继续做可以考虑的方向大致有三条一是完善怪物行为。现在的敌人AI只是直线追踪可以扩展为巡逻状态、攻击状态、消失重现机制让玩家需要研究怪物行为规律才能通过这会明显提升恐怖感和玩法深度。二是加入更完整的叙事线。AI生成的日记已经能给玩家带来情绪压力后续可以扩展成录音机、电话、监控录像回放等更多叙事载体让玩家通过非线性的方式拼凑出研究机构的事件全貌。三是优化美术和音频的配合。当前只是用一个简单位移的胶囊体代表怪物如果后续把AI绘画生成的怪物形象骨骼化并配合动态音量、心跳声、低频氛围音恐怖体验还能再上一个台阶。如果你想用AI做自己的恐怖游戏建议不要一上来就做大而全的复杂项目而是先选择一个“单一吓人时刻”做原型——比如一条没有出口的走廊、一只无法击败的怪物、一份逐渐疯癫的日记。把单个情绪点做透比堆一堆没做完的系统更有价值。好在这一轮实验里AI连“吓人”这件事都愿意帮忙剩下的就看你怎么把它缝进自己的世界里了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价