From 3c9039d08bbb45ceb460c8997251e1cde1baa7b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Wed, 5 Aug 2026 20:27:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=9B=BE=E6=A0=87=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E6=8F=90=E7=A4=BA=E8=AF=8D=E7=94=9F=E6=88=90=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 支持参考图解析 优化提示词结构 --- .../src/editor_project_icon_specs.rs | 8 +- .../crates/api-server/src/prompt/icon_spec.rs | 109 ++++-------------- 2 files changed, 27 insertions(+), 90 deletions(-) diff --git a/server-rs/crates/api-server/src/editor_project_icon_specs.rs b/server-rs/crates/api-server/src/editor_project_icon_specs.rs index eafff07d1..66abc797c 100644 --- a/server-rs/crates/api-server/src/editor_project_icon_specs.rs +++ b/server-rs/crates/api-server/src/editor_project_icon_specs.rs @@ -212,7 +212,13 @@ pub(crate) async fn generate_icon_spec( let extra_prompt = build_extra_param_prompt(&payload.request_param); let extra_param = run_icon_spec_extra_param_llm(&state, extra_prompt).await?; - let final_prompt = get_gen_icon_spec_prompt(&payload.request_param, &extra_param); + let has_reference_image = payload + .reference_image_srcs + .as_ref() + .map(|r| !r.is_empty()) + .unwrap_or(false); + let final_prompt = + get_gen_icon_spec_prompt(&payload.request_param, &extra_param, has_reference_image); let generation_inputs = build_icon_spec_generation_inputs( &payload.request_param, extra_param.genre, diff --git a/server-rs/crates/api-server/src/prompt/icon_spec.rs b/server-rs/crates/api-server/src/prompt/icon_spec.rs index e2cec9489..3bc267b3c 100644 --- a/server-rs/crates/api-server/src/prompt/icon_spec.rs +++ b/server-rs/crates/api-server/src/prompt/icon_spec.rs @@ -143,103 +143,34 @@ pub(crate) fn build_extra_param_prompt(param: &RequestParam) -> String { ) } -pub(crate) fn get_gen_icon_spec_prompt(param: &RequestParam, extra_param: &ExtraParam) -> String { +pub(crate) fn get_gen_icon_spec_prompt( + param: &RequestParam, + extra_param: &ExtraParam, + has_reference_image: bool, +) -> String { let genre_name = extra_param.genre.as_slug(); + let reference_image_prompt = if has_reference_image { + "参考图生成规范:严格参考参考图的构图、风格、材质、色彩、形状语言和视觉层级生成本次规范图;参考图只作为美术方向和规范语义依据,不要直接复制参考图中的文字、水印或无关背景。\n" + } else { + "" + }; format!( - r#"角色设定和任务目标 -你是一名经验丰富的游戏视觉设计师与游戏图标设计师(Game Icon Designer),擅长从零设计高质量、商业化、游戏开发就绪(Game Development-Ready)、可以导入游戏引擎或应用商店直接使用的游戏图标。 -你的核心任务是根据用户选择的游戏风格、题材、类型、核心玩法和目标用户等,设计一款主体明确、辨识度高、视觉冲击力强的游戏图标。图标需要在缩小尺寸后依然清晰,并让用户一眼识别游戏类型与核心玩法。 - -核心提示词 -设计一款风格为【{art_style}】,题材为【{theme}】的核心玩法。 - -美术风格 -采用【{art_style}】的游戏图标,画面必须保持统一的造型语言、线条、材质、光影和配色方案。 - -核心玩法 -画面重点表现【{play_setting}】的核心玩法。 - -使用场景 -使用场景为【{use_case}】。默认app;如果用户明确了使用端则按用户填写。 - -适用目标用户 -图标需要一眼看出是【{genre}】游戏,适合目标用户【{target_user}】玩家。 - + r#" +生成一张游戏图标素材视觉规范展板,纯白色干净背景,展示按钮图标的统一视角、线条粗细、填充风格、描边、阴影、圆角、材质、状态层级和色彩规范,图标样例需要成组排列且风格高度统一。 输入内容 -玩法设定:{play_setting} -美术风格:{art_style} - -带参考图(上传参考图) -参考图生成规范:严格参考图1的构图、风格、材质、色彩、形状语言和视觉层级生成本次规范图;参考图只作为美术方向和规范语义依据,不要直接复制参考图中的文字、水印或无关背景。 - -画面设计要求 -1. 主体明确 -图标必须拥有一个清晰的核心视觉主体,例如英雄、武器、载具、卡牌、建筑、农作物或代表核心玩法的标志性道具。主体应当具有强烈的轮廓辨识度,避免多个元素争夺视觉焦点。 -2. 核心玩法可视化 -使用角色动作、道具状态、特效方向或场景关系表现核心玩法,不能只展示普通角色头像。画面应让用户快速理解战斗、射击、竞速、经营、消除、建造或召唤等玩法特征。 -3. 游戏类型辨识 -图标中的角色、武器、道具、特效和氛围必须与所选游戏类型一致。例如: -- FPS突出枪械、准星或瞄准开火。 -- MOBA突出英雄对抗、技能释放或阵营冲突。 -- RPG突出英雄形象、武器、成长感或冒险氛围。 -- 卡牌游戏突出卡牌、角色立绘或召唤效果。 -- 塔防突出防御塔、敌人路线或攻击范围。 -- 模拟经营突出建筑、资源、建设或升级成果。 -- 三消突出色彩鲜明的消除物与连锁反馈。 -- 竞速游戏突出车辆、速度感、漂移和赛道元素。 -4. 缩略图适配 -图标在小尺寸显示时仍需保持主体清楚、轮廓鲜明、颜色关系明确。避免依赖只有放大后才能看到的微小细节。 -5. 色彩与光影 -使用与游戏风格和题材匹配的主色调。主体与背景必须形成明确的明度、色相或冷暖对比。光影应强化视觉焦点和空间层次,但不得遮挡主体关键特征。 -6. 动势与冲击力 -根据玩法加入合理的动作方向、速度线、能量轨迹、爆发光效、粒子或环境反馈。特效只能用于突出主体,不得覆盖角色面部、武器或核心道具。 -7. 角色一致性 -如果用户提供角色参考图,必须保持角色的脸型、发型、服装、配饰、武器、标志性颜色和整体气质一致。不得擅自更换服装、增加肢体或移除关键配饰。 -8. 商业化品质 -最终效果应接近成熟商业游戏的应用商店图标,具有精致完成度、明确卖点和良好的点击吸引力,避免廉价素材拼贴感、简单截图感或未完成草稿感。 -9. 文字限制 -默认不添加文字、字母、数字、游戏名称、角标、商店徽章、公司标志、签名或水印。仅在用户明确要求时,才可加入简短且易读的文字。 -10. 不出现布局规范部分。 -11. 画面必须保持统一的造型语言、线条、材质、光影和配色方案。角色、道具与特效应属于同一套视觉体系,不得出现画风混杂、材质冲突或渲染风格漂移。避免信息过多、复杂细节、过度杂乱、文字过多、过暗压抑、主体不清晰。 - -操作流程 -1. 分析游戏风格、题材、类型和目标用户。 -2. 从游戏核心玩法中提取最具辨识度的视觉动作或标志性元素。 -3. 确定唯一的核心主体和次要辅助元素。 -4. 根据游戏类型设计角色动作、道具状态和视觉特效。 -5. 根据目标用户调整角色造型、色彩强度、细节密度和整体氛围。 -6. 使用明确的色彩对比与光影关系强化视觉焦点。 -7. 检查图标缩小后能否快速识别主体、游戏类型和核心玩法。 -8. 检查是否存在文字、水印、多余角色、无关道具或过度复杂的信息。 -9. 按照指定画面比例和清晰度输出最终游戏图标。 - -最终检查 -- 图标具有明确且唯一的核心主体。 -- 能够快速识别游戏类型和核心玩法。 -- 美术风格符合用户选择。 -- 主体与背景具有清晰对比。 -- 缩小显示后仍然具有较高辨识度。 -- 画面没有过多或相互冲突的信息。 -- 没有风格漂移、结构变形或配饰消失。 -- 没有错误肢体、错误武器或不合理姿势。 -- 没有未经要求的文字、数字、标志或水印。 -- 符合移动端游戏图标、应用商店或社交传播的展示需求。 - -负面提示词 -text, letters, numbers, labels, logo, signature, watermark, inconsistent style, -inconsistent perspective, inconsistent line width, inconsistent rounded corners, -mixed materials, color shift, incorrect lighting, incorrect shadow direction, -green outline, green base plate, green shadow, green glow, green reflection, -textured background, gradient background, background shadow, ground, environment, -props, disconnected fragments, floating particles, overlapping icons, touching icons, -cropped icon, off-center icon, inconsistent scale, blurry edges, color bleeding, -green spill, visible grid lines, borders,"#, +玩法设定: {play_setting} +美术风格: {art_style} +游戏类型: {genre_name} +题材: {theme}】 +{reference_image_prompt} +使用场景为【{use_case}】。图标设计需适配该平台的展示规范和缩略图尺寸。适合目标用户【{target_user}】玩家。 +"#, play_setting = escape_xml_prompt_data(¶m.play_setting), art_style = escape_xml_prompt_data(¶m.art_style), theme = escape_xml_prompt_data(&extra_param.theme), use_case = escape_xml_prompt_data(&extra_param.use_case), - genre = genre_name, + genre_name = genre_name, target_user = escape_xml_prompt_data(&extra_param.target_user), ) }