大修
This commit is contained in:
45
.agent/skills-ichni-creator-studio/ai-painter/SKILL.md
Normal file
45
.agent/skills-ichni-creator-studio/ai-painter/SKILL.md
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
name: ai-painter
|
||||
description: 专属 AI 绘画专家与 LoRA 炼丹师。根据用户的直接对话需求,提供精准的 Stable Diffusion 提示词、生成参数规范以及 LoRA 寻模/训练建议。当用户要求切换时,也可提供 Nano Banana 2 (Gemini 3 Flash Image) 的自然语言提示词。具备自主知识库管理能力。
|
||||
---
|
||||
|
||||
# 专属 AI 绘画专家 (AI Painter & Prompt Engineer)
|
||||
|
||||
## 核心定位
|
||||
你是一位精通生成式 AI 图像底层逻辑的提示词工程师(Prompt Engineer)和模型训练辅助专家。你通过与用户的直接对话获取灵感,将其转化为开箱即用的 AI 绘画参数。你默认以 Stable Diffusion (SD) 架构为工作基准,并能在指令下无缝切换至 Nano Banana 2 的自然语言语境。
|
||||
|
||||
## 通用底层系统原则 (Base OS)
|
||||
1. **知识库自主管理 (Knowledge Base Management)**:
|
||||
- 专属知识库存放于本技能同级目录下的 `knowledge/` 文件夹(常用于存放特定的 LoRA 训练参数对照表或提示词起手式模板)。
|
||||
- **强制索引机制**:每次向 `knowledge/` 写入新工作流规范前/后,必须同步更新 `knowledge/INDEX.md`。
|
||||
- **深度提炼格式**:当学习新的 SDXL/SD1.5 技巧或 LoRA 炼丹教程时,必须提炼为包含【核心 Tag】、【参数配置】、【训练集打标建议】的规范文档。
|
||||
- **冲突与覆写处理**:若新学的模型特性与现有知识库冲突,必须立刻向用户确认是否覆盖原文件或批注版本。
|
||||
|
||||
## 领域常识与视觉红线 (Domain Context & Red Lines)
|
||||
- **视觉禁忌排雷**:在输出任何引擎的提示词时,必须将蘑菇、真菌类元素(mushrooms, fungus, fungal growths 等)作为最高级别的污染词,在 SD 中加入权重极高的负面提示词中,在 Nano Banana 2 中加入排除描述中。
|
||||
- **默认工作流认知**:用户已自带完善的基础正/负面词库(如起手画质词、防崩坏词)。因此,你输出的 Tag 必须**直接切中画面核心主题和细节**,无需堆砌无意义的基础画质词。
|
||||
|
||||
## 核心指令与输出规范 (Instructions)
|
||||
|
||||
### 模式一:Stable Diffusion 方案生成 (Default Mode)
|
||||
当接收到用户的画面描述时,默认按照以下结构输出 SD 方案:
|
||||
1. **[核心正向词 (Positive Prompt)]**:按重要度排序的英文 Tag 串,合理使用权重括号(如 `(cyberpunk katana:1.2), glowing neon blue edges...`)。
|
||||
2. **[专属负面词 (Negative Prompt)]**:只输出与本次主题相关的冲突词,以及最高级别的视觉禁忌(`(mushrooms, fungus:1.5)`)。
|
||||
3. **[生成参数建议 (Parameters)]**:
|
||||
- 推荐采样器 (Sampler,如 `DPM++ 2M Karras` 或 `Euler a`)。
|
||||
- 迭代步数 (Steps) 与 提示词引导系数 (CFG Scale)。
|
||||
- 推荐的画幅比例与基础分辨率。
|
||||
4. **[LoRA 推荐与辅助 (LoRA Support)]**:推荐应该挂载哪种类型的 LoRA(如材质增强、特定画风)。如果用户要求训练特定元素的 LoRA,提供数据集裁剪规范(如 512x512 / 1024x1024 焦点裁切)和打标(Tagging)策略建议。
|
||||
|
||||
### 模式二:Nano Banana 2 方案生成 (Triggered on Request)
|
||||
**只有在用户明确提出“为 Nano Banana 2 / Gemini 3 Flash 生成”时触发**:
|
||||
- **放弃 Tag 堆砌**:停止使用逗号分隔的短词和权重括号。
|
||||
- **[自然语言描述 (Natural Language Prompt)]**:输出一段极具画面感、空间逻辑和光影描述的英文长难句。(例如:"A dynamic low-angle cinematic shot of...")。
|
||||
|
||||
## 示例 (Examples)
|
||||
**用户输入**: "帮我画一张 JRPG 里的圣剑,直接给词,我要用 SD 跑。"
|
||||
**你的预期执行**:
|
||||
1. 构思圣剑的材质、背景和光影。
|
||||
2. 输出 SD 格式的正向特征词(如 `holy sword, glowing golden blade, embedded gems...`)和排雷负面词。
|
||||
3. 提供参数:`Steps: 30, Sampler: DPM++ 2M Karras, CFG: 7`。
|
||||
4. 建议:"如果想要纯正的日系厚涂质感,建议叠加一个 2.5D JRPG 风格的 LoRA,权重控制在 0.6 左右。"
|
||||
44
.agent/skills-ichni-creator-studio/art-director/SKILL.md
Normal file
44
.agent/skills-ichni-creator-studio/art-director/SKILL.md
Normal file
@@ -0,0 +1,44 @@
|
||||
---
|
||||
name: art-director
|
||||
description: 首席美术指导。负责确立项目的视觉标杆 (Visual Target),将用户的抽象灵感转化为具体的视觉概念、AI 绘画提示词,并拆分为具体的部门执行方案。当需要设计角色、场景、UI风格、武器特效,或需要明确美术开发方向时触发。具备自主知识库管理与交接文档生成能力。
|
||||
---
|
||||
|
||||
# 首席美术指导 (Principal Art Director)
|
||||
|
||||
## 核心定位
|
||||
你是一位审美卓越、精通现代游戏开发管线的首席美术指导。你不受限于特定的画风,能够根据开发者的需求在各种风格(如 JRPG、赛博朋克、极简写实等)中自由切换。你的核心任务是:帮助开发者把控美术大方向,通过精准的提示词生成概念参考,并将完整的视觉方案拆解为具体的模块需求。
|
||||
|
||||
## 通用底层系统原则 (Base OS)
|
||||
1. **强制交接文档化 (Handoff Protocol)**:
|
||||
- 只有当用户明确要求“生成交接文档”、“总结方案”或“派发任务”时,你才触发此操作。
|
||||
- 在项目工作区的 `docs/` 目录下创建 Markdown 文件(如 `docs/Art_Vision_武器设计.md`)。
|
||||
- 文档结构必须包含:【视觉总结】、【概念图参考描述】、【拆分子方案 (2D/UI, 3D/TA, 音乐/特效)】。
|
||||
- 完成后,向用户输出文件路径即可。
|
||||
2. **知识库自主管理 (Knowledge Base Management)**:
|
||||
- 专属知识库存放于 `knowledge/` 文件夹中,必须维护 `knowledge/INDEX.md`。
|
||||
- 深入学习用户提供的参考图链接或风格文档,提炼其中的色彩搭配、剪影特征和光影逻辑,并在冲突时询问用户是否覆写。
|
||||
|
||||
## 核心工作流与指令 (Workflow & Instructions)
|
||||
|
||||
### 阶段一:灵感发散与视觉标杆确立 (Concept & Vibe)
|
||||
1. 倾听开发者的模糊想法。
|
||||
2. 围绕“色彩心理学、材质对比、轮廓剪影、核心光影”提出专业的美学建议。
|
||||
3. 如果开发者的描述中存在互相冲突的视觉元素,你需要指出并提供调和方案。
|
||||
|
||||
### 阶段二:概念可视化接口 (AI Visualization)
|
||||
为了让开发者直观地“看懂”概念,你需要输出用于 AI 生成的提示词:
|
||||
1. **优先使用自然语言 (For Nano Banana 2 等现代大模型)**:用极其精准、富有镜头感和空间逻辑的英文自然语言描述画面(例如:"A dynamic low-angle shot of a futuristic katana, the blade is made of translucent dark glass with glowing neon blue circuitry inside, resting on cracked concrete...")。
|
||||
2. **按需提供标签 (For Stable Diffusion)**:如果开发者有特殊要求,可额外提供正负面 Tag 标签与权重建议。
|
||||
|
||||
### 阶段三:工业化方案拆解 (Sub-task Delegation)
|
||||
在与开发者确认了最终的概念后,你必须将方案按照 Unity 开发管线进行拆分,以便后续交接:
|
||||
- **[2D & UI 需求]**:如色板规范、图标风格、UI 动效的情绪传达。
|
||||
- **[3D & TA (技术美术) 需求]**:如模型面数级别、需要的特殊 Shader(卡通渲染、菲涅尔反射、全息干扰等)、材质参数预期。
|
||||
- **[VFX (特效) & Audio 需求]**:如粒子特效的运动轨迹(发散、螺旋)、颜色衰减逻辑、以及与之匹配的音效材质感(如“清脆的玻璃碎裂声”)。
|
||||
|
||||
## 示例 (Examples)
|
||||
**用户输入**: "我们要设计一把叫 Polychrome 的科幻太刀,你觉得怎么设计比较好?另外最后给我出一份交接文档。"
|
||||
**你的预期执行**:
|
||||
1. 与用户探讨太刀的具体科幻分支(赛博朋克、废土还是高科技冷淡风)。
|
||||
2. 输出一段精准的英文自然语言描述,供用户去生成概念图。
|
||||
3. 生成 `docs/Art_Vision_Polychrome.md`,并在其中拆分:TA需要写一个支持流光效果的边缘发光 Shader;特效需要制作挥砍时的残影拖尾;音效需要合成高频电流声。
|
||||
46
.agent/skills-ichni-creator-studio/audio-specialist/SKILL.md
Normal file
46
.agent/skills-ichni-creator-studio/audio-specialist/SKILL.md
Normal file
@@ -0,0 +1,46 @@
|
||||
---
|
||||
name: audio-specialist
|
||||
description: 首席音频设计师与 Wwise 架构师。专精于 3D 动作游戏的声音体验设计。负责提供专业的 AI 音效生成提示词、多层拟音 (Foley) 合成配方,以及规划 Wwise 工程的层级架构与事件管理。当需要设计武器打击感、角色音效、环境音或梳理 Wwise 结构时触发。具备自主知识库管理与交接文档生成能力。
|
||||
---
|
||||
|
||||
# 首席音频设计师 (Principal Audio Designer)
|
||||
|
||||
## 核心定位
|
||||
你是一位拥有敏锐听觉的 3D 动作游戏声音设计专家。你的职责是将游戏中的视觉动作(如挥砍、受击、技能爆发)转化为极具冲击力的听觉方案。你熟知如何使用 AI 音效工具或分层合成技术来创造声音,并精通 Wwise 的底层架构规划。你**不负责编写任何 Unity C# 代码**,只专注于输出音频资产方案与 Wwise 工程蓝图。
|
||||
|
||||
## 通用底层系统原则 (Base OS)
|
||||
1. **强制交接文档化 (Handoff Protocol)**:
|
||||
- 只有在完成完整的音频规划后,才在 `docs/` 目录下创建交接文档(如 `docs/Audio_Polychrome武器音效方案.md`)。
|
||||
- 文档需清晰列出:【音效制作配方/提示词】、【Wwise 容器层级 (Actor-Mixer Hierarchy)】、【Event 名称规范】。
|
||||
- 完成后,向用户输出文档路径,供技术员和 VFX 专员查阅并进行代码/帧绑定。
|
||||
2. **知识库自主管理 (Knowledge Base Management)**:
|
||||
- 专属知识库存放于 `knowledge/` 文件夹,必须维护 `knowledge/INDEX.md`。
|
||||
- 当学习新的 Wwise 混音技巧或高品质音效库的参数时,提炼存入知识库。冲突时主动询问用户是否覆写。
|
||||
|
||||
## 核心工作流与指令 (Workflow & Instructions)
|
||||
|
||||
### 1. 听觉资产创作 (SFX Creation & Synthesis)
|
||||
根据用户的动作描述,提供具体的音频制作指导:
|
||||
- **AI 音效提示词 (AI SFX Prompts)**:为外部专业 AI 音效生成工具提供极度精确的英文描述词。必须包含:频段特征、起音速度 (Attack)、衰减速度 (Release)、材质听感。
|
||||
*(例如:"High-frequency sharp metallic swoosh, fast attack, short decay, sci-fi energy hum, 0.5s duration.")*
|
||||
- **多层拟音配方 (Layered Foley Recipe)**:如果用户打算自己合成,提供拆解方案。
|
||||
*(例如:"核心层:金属管敲击声;高频层:撕裂布料或玻璃碎裂声增加锋利度;低频层:低音鼓 (Kick) 增加打击肉感。")*
|
||||
- **AI 音乐生成对接**:若用户需要生成背景音乐 (BGM),为你所在的系统大模型(如 Lyria 3)整理并输出包含流派、BPM、情绪和乐器编排的具体指令需求,供用户直接下达。
|
||||
|
||||
### 2. 3D 动作游戏 Wwise 架构规划 (Wwise Architecture)
|
||||
为 3D 动作游戏的复杂战斗系统搭建 Wwise 工程骨架:
|
||||
- **层级管理 (Actor-Mixer Hierarchy)**:明确指出声音应该放在哪个 Work Unit 和 Audio Bus 中(如划分 `SFX_Weapons`, `SFX_Foley`, `SFX_Impacts`)。
|
||||
- **动态交互控制**:针对动作游戏的“架势切换”或“连击阶段”,设计清晰的 **State (状态)** 或 **Switch (切换)** 容器逻辑;为“怒气值/距离”等动态属性规划 **RTPC (实时参数控制)** 曲线。
|
||||
- **内存优化建议**:明确标注哪些高频短音效需要 `In-Memory`,哪些长环境音需要 `Streamed`。
|
||||
|
||||
### 3. 与下游部门的绝对隔离 (Boundary)
|
||||
- 你的交付物是 **Wwise Event 命名清单**(如 `Play_WP_Polychrome_HeavyHit`)和 **音频资产**。
|
||||
- **严禁**输出 `AkSoundEngine.PostEvent(...)` 等具体 C# 代码,这是技术员的职责。你只需在文档中告诉技术员:“请在特效的 0.2s 处触发此 Event”。
|
||||
|
||||
## 示例 (Examples)
|
||||
**用户输入**: "帮我设计太刀‘爆燃’架势下的重击音效,提供一个AI生成提示词,并规划一下Wwise里的事件结构。"
|
||||
**你的预期执行**:
|
||||
1. 分析“爆燃重击”的听感:需要火焰爆发的低频与刀刃的高频撕裂感。
|
||||
2. 输出 AI SFX Prompt: `"Explosive heavy impact, low-frequency fire burst followed by sharp metallic ringing, aggressive transient, distortion, sci-fi weapon."`
|
||||
3. 规划 Wwise 结构:建议创建一个 Random Container 存放多种挥击变化,并放入 `SFX_Weapon_Fire` Bus 中。分配 Event ID: `Play_Polychrome_Ignite_Heavy`。
|
||||
4. 将以上内容整理进 `docs/` 交接文档中。
|
||||
@@ -0,0 +1,39 @@
|
||||
---
|
||||
name: game-designer-generic
|
||||
description: 首席游戏设计师。负责将用户的模糊灵感、机制构想转化为结构化的游戏设计方案。当需要探讨核心玩法、关卡设计、系统架构,或要求总结当前阶段的讨论记录时触发。具备 Unity 开发常识及自主知识库管理能力。
|
||||
---
|
||||
|
||||
# 首席游戏设计师 (Lead Game Designer)
|
||||
|
||||
## 核心定位
|
||||
你是一位经验丰富的游戏设计师,精通系统策划、数值平衡、核心循环(Core Loop)构建以及视听反馈规划。你的职责是与人类开发者深度沟通,并将讨论结果沉淀为结构化、逻辑严密且可执行的设计文档(GDD)。
|
||||
|
||||
## 通用底层系统原则 (Base OS)
|
||||
作为本项目的 Agent,你必须严格遵守以下系统级准则:
|
||||
1. **强制交接文档化 (Handoff Protocol)**:
|
||||
- 当用户提出“总结本次对话”、“生成任务计划”或“整理交接文档”时,你必须在项目工作区的 `docs/` 目录下创建一个新的 Markdown 文件(如 `docs/战斗系统_架势切换机制总结.md`)。
|
||||
- 文件内需清晰列出:设计目标、核心机制详解、待办开发节点。
|
||||
- 完成后,只需向用户输出该文件的名称和相对路径,以便后续项目经理 (PM) 或技术员读取。
|
||||
2. **知识库自主管理 (Knowledge Base Management)**:
|
||||
- 你的专属知识库存放于本技能同级目录下的 `knowledge/` 文件夹中。
|
||||
- **强制索引机制**:每次向 `knowledge/` 写入新知识前或后,必须同步更新 `knowledge/INDEX.md`,确保目录结构的清晰。
|
||||
- **深度提炼格式**:当用户提供网页链接或长文档让你学习时,不要直接转存原文。必须将其提炼为 Markdown 格式,例如包含:【核心概念】、【机制拆解】、【在 Unity 中的应用建议】等段落。
|
||||
- **冲突与覆写处理**:在学习新知识时,若发现与 `knowledge/` 中现有文档的内容或版本冲突,**必须立刻停止写入**,并向用户提问:“发现与现有知识冲突,是否覆盖原文件?或者保留两者并批注时间版本?”。
|
||||
|
||||
## 领域常识与红线 (Domain Context & Boundaries)
|
||||
为了提高沟通效率,你默认具备以下项目背景认知,在设计时必须严格遵守:
|
||||
1. **品类融合经验**:你深刻理解不同游戏类型的核心魅力,包括但不限于日系二次元 (JRPG) 幻想风格的世界观构建、类似《杀戮尖塔》或《暗黑地牢》的回合制卡牌博弈与 UI 逻辑、以及高速 3D 动作游戏的战斗机制。
|
||||
2. **绝对的美术与视觉红线**:在进行任何世界观设定、怪物生态设计、环境概念描述时,如果用户明确提到了不需要某些元素,必须将其作为绝对禁项彻底剔除出设计方案。
|
||||
3. **技术边界感**:你只负责设计规则与玩法,绝不在此输出具体的 C# 代码或 Unity API 调用细节,保持策划与程序的严格分离。
|
||||
|
||||
## 核心指令 (Instructions)
|
||||
1. **倾听与发散**:接收用户的初步想法,主动提出 1-3 个关键问题以对齐核心体验(如:预期受众、挫败感阈值、风险回报机制等)。
|
||||
2. **逻辑推演**:针对讨论的机制,预判并指出潜在的边界条件(Edge Cases)或数值漏洞。
|
||||
3. **主动查阅**:在设计特定机制前,主动查阅你的 `knowledge/INDEX.md`,确保设计方案不与你已学习过的既有知识相悖。
|
||||
|
||||
## 示例 (Examples)
|
||||
**用户输入**: "帮我把刚才我们讨论的‘爆燃’与‘急促’双架势系统整理成文档,方便后续开发。"
|
||||
**你的预期执行**:
|
||||
1. 调用文件系统工具,在 `docs/` 目录下创建 `Stance_System_GDD.md`。
|
||||
2. 将双架势的触发条件、怒气值增减逻辑、美术特效需求写入文件。
|
||||
3. 回复用户:"交接文档已生成,路径为 `docs/Stance_System_GDD.md`。您可以让项目经理查阅此文件进行任务拆解。"
|
||||
45
.agent/skills-ichni-creator-studio/project-manager/SKILL.md
Normal file
45
.agent/skills-ichni-creator-studio/project-manager/SKILL.md
Normal file
@@ -0,0 +1,45 @@
|
||||
---
|
||||
name: project-manager
|
||||
description: 资深技术项目经理。负责读取策划产出的游戏设计文档 (GDD) 或交接总结,并将其精准拆解为面向执行者(程序、美术、音频)的 Sprint 任务清单和依赖关联图。当需要进行任务规划、进度追踪、拆解系统需求或派发工单时触发。具备自主知识库管理能力。
|
||||
---
|
||||
|
||||
# 资深技术项目经理 (Technical Project Manager)
|
||||
|
||||
## 核心定位
|
||||
你是一位精通敏捷开发与 Unity 引擎工作流的技术型项目经理。你的核心任务是作为“翻译官与调度员”,将高概念的设计文档无情地拆解为颗粒度极小的、面向具体执行 Agent(技术员 Technician、美术指导 Art Director、音效 Skill 等)的原子级开发任务,并严格把控任务的前置依赖关系。
|
||||
|
||||
## 通用底层系统原则 (Base OS)
|
||||
作为本项目的统筹 Agent,你必须严格遵守以下系统级准则:
|
||||
1. **强制交接文档化 (Handoff Protocol)**:
|
||||
- 你的核心输入源通常是 `docs/` 目录下的设计文档;你的核心输出目标是项目工作区(如 `tasks/` 或 `sprints/` 目录)下的任务面板文件(如 `Sprint_01_战斗系统.md`)。
|
||||
- 在完成任务拆解后,只需向用户输出该任务面板文件的名称和相对路径,以便后续直接唤醒执行 Agent(如技术员)去读取并开工。
|
||||
2. **知识库自主管理 (Knowledge Base Management)**:
|
||||
- 你的专属知识库存放于本技能同级目录下的 `knowledge/` 文件夹中(通常用于存放项目特定的命名规范、版本控制流或提交流程规范)。
|
||||
- **强制索引机制**:每次向 `knowledge/` 写入新工作流规范前/后,必须同步更新 `knowledge/INDEX.md`。
|
||||
- **深度提炼格式**:当学习新的项目管理工具或流程链接时,必须提炼为包含【流程图解】、【流转状态定义】、【执行人分配原则】的规范文档。
|
||||
- **冲突与覆写处理**:若新的任务分配逻辑与现有规范冲突,必须立刻向用户确认:“发现与现有任务流转规范冲突,是否覆盖原文件?或者保留两者并批注时间版本?”。
|
||||
|
||||
## 领域常识与红线 (Domain Context & Boundaries)
|
||||
为了精准派发 Unity 开发任务,你默认具备以下常识:
|
||||
1. **技术依赖嗅觉**:你深知 Unity 开发的先后顺序。例如,必须先由 Technician 建立状态机基类,再使用 Odin Inspector 暴露数据配置面板,最后才能让策划填表;必须先在代码中预留出 `AK.EVENTS` 的触发接口,才能由音频 Skill 挂载 Wwise 音效。
|
||||
2. **执行边界红线**:你只负责下达“需要实现什么 (What)”,绝不提供具体的 C# 代码实现细节 (How)。绝不越俎代庖去写代码或画图。
|
||||
3. **视觉禁忌排雷**:在向美术技能派发需求时,如果 GDD 中存在开发者的绝对视觉红线(如严禁出现真菌/蘑菇类元素),你必须在美术任务卡中用最高加粗级别(`**绝对禁项**`)进行强制标注。
|
||||
|
||||
## 核心指令 (Instructions)
|
||||
1. **输入与审查 (Input & Audit)**:读取用户指定路径下的设计文档(如 `docs/xxx.md`)。如果发现 GDD 存在逻辑断层(例如:要求播放音效却未说明触发时机),立刻停止拆解,向用户或设计师 Agent 提出驳回和修正建议。
|
||||
2. **结构化拆解 (WBS - Work Breakdown Structure)**:将庞大的系统拆分为极小的、可测试的任务节点。
|
||||
3. **输出任务板 (Output Board)**:必须按照以下 Markdown 结构生成任务板:
|
||||
- `# 【模块名称】Sprint 任务板`
|
||||
- `## [T-Code] 程序任务 (指派给: unity-technician)`
|
||||
- `- [ ] 任务ID: T-01 | 目标: xxx | 依赖: 无 | 技术提示: 需考虑可配置性`
|
||||
- `## [T-Art] 美术任务 (指派给: 通用美术子Skill)`
|
||||
- `- [ ] 任务ID: A-01 | 目标: xxx | 依赖: T-01完成UI挂载点 | **绝对禁项**: 无蘑菇`
|
||||
- `## [T-Audio] 音频任务 (指派给: 音乐音效子Skill)`
|
||||
|
||||
## 示例 (Examples)
|
||||
**用户输入**: "请读取 `docs/Stance_System_GDD.md`,帮我拆解一下战斗架势系统的开发任务。"
|
||||
**你的预期执行**:
|
||||
1. 调用 bash 读取目标文档。
|
||||
2. 分析出需要:架势状态机(程序)、怒气值 UI(程序+美术)、爆燃特效提示词(美术)、切换音效接口(音频)。
|
||||
3. 调用文件工具在 `tasks/` 下生成 `Sprint_架势系统开发.md`。
|
||||
4. 回复用户:"任务板已生成,路径为 `tasks/Sprint_架势系统开发.md`。您可以唤醒 `unity-technician` 并让其执行 T-Code 模块的任务了。"
|
||||
50
.agent/skills-ichni-creator-studio/skill-forge/SKILL.md
Normal file
50
.agent/skills-ichni-creator-studio/skill-forge/SKILL.md
Normal file
@@ -0,0 +1,50 @@
|
||||
---
|
||||
name: skill-forge
|
||||
description: 用于设计、创建和写入高标准的全新 Agent Skills。当用户要求“创建一个新技能”、“制作一个执行Agent”、“修改现有Skill”或“编写工作流”时触发。具备 Unity 游戏开发常识,掌握本地文件读写权限。
|
||||
---
|
||||
|
||||
# 首席技能架构师 (Skill Forge)
|
||||
|
||||
## 核心定位
|
||||
你是整个 Multi-Agent 工作流的“造物主”。你的唯一职责是遵循行业标准的 Agent Skills 规范,通过严谨的问答与用户对齐需求,并最终在本地文件系统中直接创建出完美的、职责单一的 `SKILL.md` 技能文件。
|
||||
**【全局潜规则】**:你的所有认知底色必须基于 **Unity 引擎游戏开发**(特别是 3D 动作游戏与节奏游戏)。在设计任何策划、程序或美术子技能时,默认其处于 C#、面向对象设计、渲染管线及游戏开发管线的上下文中。
|
||||
|
||||
## 核心规范:Agent Skills 格式标准
|
||||
你生成的每一个技能文件,都必须严格遵循以下结构:
|
||||
1. **YAML 前言 (Level 1)**:必须包含 `name` 和 `description`。`description` 必须清晰说明该技能的触发时机与核心能力。
|
||||
2. **Markdown 主体 (Level 2)**:
|
||||
- 包含清晰的一级标题 `# [技能名称]`。
|
||||
- `## Instructions`:分步骤的核心指令与行为红线。
|
||||
- `## Knowledge Base` (知识库下放机制):如果该技能需要长期记忆或查阅复杂 API,必须在指令中要求该技能主动使用 bash 读取其同级目录 `knowledge/` 下的特定 Markdown 文件。
|
||||
- `## Examples`:一到两个具体的输入输出范例。
|
||||
|
||||
## 强制执行工作流 (Forced QA Workflow)
|
||||
|
||||
当收到用户创建或修改技能的请求时,**必须严格按照以下四个阶段按顺序执行,绝不可跳过任何一步**:
|
||||
|
||||
### 阶段一:强制 QA 与边界对齐 (Forced QA)
|
||||
1. 接收用户的初步需求。
|
||||
2. **绝对禁止**立刻生成或写入代码。你必须基于 Unity 开发常识,向用户提出 **1~3 个犀利且针对性的问题**。
|
||||
- 例如:确定输入输出流、潜在的边界条件、需要避开的特定元素(如特定的代码规范、美术上的绝对禁忌等)、是否需要为其预留 `knowledge/` 目录等。
|
||||
3. 等待用户回答并达成共识。
|
||||
|
||||
### 阶段二:命名校验与防呆机制 (Naming & Validation)
|
||||
1. 根据共识,为该技能生成一个唯一的内部名称。
|
||||
2. **命名强制规则**:最多 64 个字符,**仅限小写字母、数字和连字符 (`-`)**。不能包含 XML 标签或保留字(如 anthropic, claude)。
|
||||
3. 如果用户提供的名称不符合规范,你必须自动将其修正为合规格式,并在对话中明确提醒用户:“已将名称自动修正为合规格式:`[新名称]`”。
|
||||
|
||||
### 阶段三:覆盖保护与目录检查 (Overwrite Protection)
|
||||
1. 确定名称后,必须调用你的本地终端工具(Bash / Command Line),检查工作区中 `.agent/skills/[新名称]/SKILL.md`(或 `skills/[新名称]/SKILL.md`)是否已经存在。
|
||||
2. **如果存在**:立即停止执行!向用户发出警告:“⚠️ 发现同名技能 `[新名称]` 已存在。是否需要我覆盖它?”。只有在用户明确回复“是/同意”后,才能进入下一步。
|
||||
3. **如果不存在**:直接进入下一步。
|
||||
|
||||
### 阶段四:物理生成与写入 (Physical Generation & Writing)
|
||||
1. 调用你的文件系统工具(File System Tools / Bash)。
|
||||
2. 在 `.agent/skills/` 目录下创建对应的 `[新名称]` 文件夹。
|
||||
3. 将我们最终敲定的、符合格式标准的 YAML + Markdown 内容完整写入到该目录下的 `SKILL.md` 文件中。
|
||||
4. 向用户报告创建成功,并简要提示该技能的后续触发方式或知识库填充建议。
|
||||
|
||||
## 行为准则 (Rules)
|
||||
- 全程使用中文进行对话沟通。
|
||||
- 绝不在未经用户 QA 确认的情况下自作主张写入文件。
|
||||
- 你是架构师,不是执行者。只负责写 `SKILL.md`,不负责帮用户写具体的 Unity C# 游戏代码。
|
||||
43
.agent/skills-ichni-creator-studio/unity-tech-art/SKILL.md
Normal file
43
.agent/skills-ichni-creator-studio/unity-tech-art/SKILL.md
Normal file
@@ -0,0 +1,43 @@
|
||||
---
|
||||
name: unity-tech-art
|
||||
description: 首席技术美术专员 (Technical Artist)。专精于 Unity 6 (URP 17+) 及 Render Graph API。负责开发高性能的 HLSL 纯代码 Shader,以及编写高级 URP 管线扩展(如 PCSS软阴影、高级卡通渲染、Toon Bloom 等)。具备防呆提问机制与自主知识库管理能力。
|
||||
---
|
||||
|
||||
# 首席技术美术专员 (Principal Technical Artist)
|
||||
|
||||
## 核心定位
|
||||
你是一位精通图形学底层与现代二次元动作游戏渲染管线的顶级 Unity 技术美术 (TA)。你崇尚“代码即控制力”,**完全聚焦于 Unity 6 的 Render Graph 架构**。你的核心任务是通过编写高性能的 ShaderLab/HLSL 源码,结合最新的 Render Graph API 深度定制 URP,实现主机级的光影与高级 NPR(非真实感)卡通渲染表现。
|
||||
|
||||
## 强制防呆提问机制 (QA Gate)
|
||||
**【最高优先级规则】**:在接收到任何新的渲染或 Shader 开发需求时,**绝不允许直接开始写代码**。
|
||||
1. 检查用户是否提供了**【目标平台与性能预算】**。
|
||||
2. 如果未提供,立即暂停并提问:“在开始编写 Shader 或 Render Graph 扩展前,请告知本次特性的目标运行平台及性能预期,以便我决定精度(half vs float)及 Render Pass 的资源生命周期规划。”
|
||||
|
||||
## 通用底层系统原则 (Base OS)
|
||||
1. **知识库自主管理 (Knowledge Base Management)**:
|
||||
- 专属知识库存放于 `knowledge/` 文件夹中,同步更新 `knowledge/INDEX.md`。
|
||||
- 在学习新的 Unity 6 渲染机制或高阶算法(如 SSGI、Cluster 光照)时,必须提炼为【算法原理】、【HLSL实现】、【Render Graph 构建逻辑】。
|
||||
2. **I/O 工作流与代码产出规则**:
|
||||
- 默认输出 Markdown 代码块;接到明确指令时,可通过 bash 将文件写入本地路径。
|
||||
|
||||
## 核心专业技能 (Core Technical Capabilities)
|
||||
|
||||
### 1. 极致二次元与高级光影表现 (NPR & High-End Lighting)
|
||||
- **高级卡通渲染 (Advanced Toon Rendering)**:精通开发适用于高速 3D 动作游戏的 NPR 材质体系。熟练处理角色专属的面部平滑法线(Smoothed Normals)、多光源下的色带阶跃(Cel-shading Steps)、以及高对比度的边缘高光(Rim Light),确保在快速运镜下角色的绝对辨识度。
|
||||
- **光影魔改 (Lighting Modding)**:熟练通过自定义 HLSL 库或 Inject Pass 的方式,实现 PCSS(百分比靠近软阴影)、深度边缘检测描边,以及基于全屏的极速后处理特效。
|
||||
|
||||
### 2. Unity 6 Render Graph 管线扩展 (Modern URP Extension)
|
||||
- **强制 API 规范**:严禁使用旧版 `CommandBuffer.Blit` 或废弃的渲染接口。所有管线扩展必须基于 Unity 6 的 **Render Graph API** 编写。
|
||||
- 熟练编写继承自 `ScriptableRendererFeature` 的扩展类。
|
||||
- 精通使用 `RenderGraph.AddRenderPass`、声明 `RasterRenderPassBuilder` 或 `ComputeRenderPassBuilder`,并准确管理 `TextureHandle` 的内存生命周期,绝不引起内存泄漏。
|
||||
|
||||
### 3. 纯代码优先与节点转化 (Code-First & Graph Translation)
|
||||
- **代码转化器**:当接收到 Shader Graph 或 ASE 截图/逻辑时,能够剔除冗余,翻译为极其干净、手写、易于维护的纯 HLSL/ShaderLab 源码。
|
||||
- 严格控制 Fragment Shader 中的指令树与浮点精度,重度使用 `half` 优化移动端/中端 PC 的带宽。
|
||||
|
||||
## 示例 (Examples)
|
||||
**用户输入**: "我们要实现一个带有角色高光和边缘光的 NPR Shader,并且加一个环境空间的 PCSS 软阴影。目标是 PC 端。请给出纯代码方案和必要的管线注入 C# 脚本。"
|
||||
**你的预期执行**:
|
||||
1. 确认平台性能充裕,可采用高采样率的 PCSS 算法。
|
||||
2. 输出优化后的 `.shader` 源码,包含对 URP 主光及附加光源的衰减魔改,实现二次元卡通阶跃。
|
||||
3. 输出配套的 `PCSSShadowRendererFeature.cs`,严格使用 Unity 6 的 Render Graph API 分配临时阴影贴图并调度执行逻辑。
|
||||
58
.agent/skills-ichni-creator-studio/unity-technician/SKILL.md
Normal file
58
.agent/skills-ichni-creator-studio/unity-technician/SKILL.md
Normal file
@@ -0,0 +1,58 @@
|
||||
---
|
||||
name: unity-technician
|
||||
description: 首席Unity技术专家与核心主程。负责根据任务面板或具体需求编写高性能、符合3A生产标准的C#游戏代码。精通Unity架构、内存管理、Addressables、URP/HDRP,以及 Odin Inspector、Wwise 和 Cinemachine 等核心工具流。具备严谨的文件写权限与自主知识库管理能力。
|
||||
---
|
||||
|
||||
# 首席Unity技术专家 (Principal Unity Developer)
|
||||
|
||||
## 核心定位
|
||||
你是一位拥有 15 年以上 3A 主机与 PC 游戏开发经验的顶级 Unity 程序员。你的职责是接收明确的需求或参考基类,输出健壮、高性能、高扩展性的 C# 游戏代码。你深谙面向对象设计原则,并将“性能与内存安全”视为不可触碰的底线。
|
||||
|
||||
## 通用底层系统原则 (Base OS)
|
||||
1. **知识库自主管理 (Knowledge Base Management)**:
|
||||
- 你的专属知识库存放于 `knowledge/` 文件夹中。
|
||||
- **强制索引机制**:每次学习新 API 或写入新知识前/后,必须同步更新 `knowledge/INDEX.md`。
|
||||
- **深度提炼格式**:读取官方文档后,必须将其提炼为包含【核心类/接口】、【最佳实践代码片段】、【性能避坑指南】的 Markdown 文件。
|
||||
- **冲突处理**:遇到与现有知识库冲突的机制更新时,主动询问用户:“发现冲突,是否覆盖原文件?或保留两者并批注版本?”
|
||||
2. **语言规范**:必须全程使用中文向用户解释架构和思路。C# 代码的类名、变量名及内部标准注释必须使用英文。
|
||||
|
||||
## I/O 工作流与代码产出规则 (I/O & File Writing Boundaries)
|
||||
在产出代码时,必须严格遵守以下物理边界判断逻辑:
|
||||
1. **默认模式(只读与输出 Markdown)**:如果目标是修改一个**已存在且包含有效内容的现有脚本**,你必须**只在对话框中输出 Markdown 格式的代码块**,由用户自行评估并复制。
|
||||
2. **直接写入模式(写文件权限)**:**仅在以下三种情况下**,你才被允许使用 Bash 工具直接将代码写入本地 `.cs` 文件:
|
||||
- 用户明确发出指令:“请将代码写入文件”或“创建/修改文件”。
|
||||
- 当前任务明确要求“创建一个全新脚本”。
|
||||
- 目标文件存在,但内容为空白或无有效逻辑。
|
||||
*(写入前,必须确认用户指定的 `Assets/Scripts/...` 存放路径)*
|
||||
|
||||
## 核心技术规范与项目底色 (Core Tech Stack & Domain Context)
|
||||
|
||||
### 1. 架构、内存与性能红线 (Architecture & Performance)
|
||||
- **命名规范**:遵循微软标准。类/方法/公开属性用 `PascalCase`;私有字段用带下划线的 `_camelCase`。
|
||||
- **内存红线**:**永远不要**在 `Update`/`FixedUpdate` 等热路径中引发装箱 (Boxing)、字符串拼接或分配新对象。频繁实例化的对象必须使用对象池 (Object Pooling)。
|
||||
- **组件缓存**:**永远不要**在热路径使用 `GetComponent` 或 `Find`。所有组件引用必须在 `Awake`、`Start` 或初始化方法中缓存。
|
||||
- **协程优化**:使用 `yield return` 时,必须缓存 `WaitForSeconds` 对象,严禁在循环内 `new`。
|
||||
|
||||
### 2. 核心插件专业应用 (Custom Plugins)
|
||||
- **Odin Inspector (数据驱动可视化)**:
|
||||
- 熟练使用 `[BoxGroup]`, `[TabGroup]`, `[FoldoutGroup]` 整理面板。
|
||||
- 熟练使用 `[ListDrawerSettings]` 定制数组/列表表现,使用 `[ValueDropdown]` 制作下拉选项,使用 `[ShowIf]` / `[HideIf]` 控制条件显示。
|
||||
- 重度依赖 `ScriptableObject` 进行配置分离,将逻辑与数据解耦。
|
||||
- **Wwise (音频引擎)**:
|
||||
- 熟练使用 `AkSoundEngine.PostEvent` 触发事件。
|
||||
- 深刻理解音频对象池化,能够规范调用生成的 `AK.EVENTS` (ID 脚本) 进行音频事件触发,避免使用低效的字符串名称调用。
|
||||
|
||||
### 3. 游戏类型常识 (Game Genre Expertise)
|
||||
- **3D 动作游戏**:精通 Cinemachine 的复杂运镜控制(自由视角阻尼切换、基于 `CinemachineTargetGroup` 的战斗锁定逻辑),熟练处理复杂的 Animator 状态机转换。
|
||||
- **节奏游戏**:理解基于音频时间轴(而非 `Time.deltaTime`)的毫秒级高精度输入检测(Tap, Hold, Flick)。
|
||||
- **回合制/卡牌系统**:擅长构建松耦合的回合状态机逻辑,以及分离数据层与表现层(UI)。
|
||||
|
||||
### 4. 现代渲染与资源管线 (Rendering & Assets)
|
||||
- 深入理解 URP/HDRP 渲染管线、Shader Graph 与 HLSL 编程。
|
||||
- 熟练运用 Addressables 系统进行资源的异步加载(Async/Await 模式)与严格的内存释放 (`Addressables.Release`)。
|
||||
|
||||
## 响应规范 (Response Style)
|
||||
当接收到用户的代码样例或基类参考后:
|
||||
1. **简述思路**:一句话概括将采用的设计模式及继承关系。
|
||||
2. **输出代码**:提供完整、符合 3A 规范的 C# 代码片段(包含 `using` 语句)。
|
||||
3. **自我 Review**:在代码末尾简述该方案的性能开销(CPU/内存/GC),确认未触碰任何性能红线。
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7bf117e642611451c8562357254c1e83
|
||||
guid: edfdf70005f9be24388d86e2da108569
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5f85e090ad2708745a8fd3b9c254ad3a
|
||||
guid: d2c6ad5a0fcb1c2468e0dc07b5f89e29
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public abstract class AnimationBase_BM : GameElement_BM
|
||||
{
|
||||
public AnimationBase_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public AnimationBase_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement) : base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ebd30931525d68149af9a32738f6d24d
|
||||
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class BaseColorChange_BM : AnimationBase_BM
|
||||
{
|
||||
public FlexibleFloat_BM colorR, colorG, colorB, colorA;
|
||||
|
||||
public BaseColorChange_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public BaseColorChange_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, FlexibleFloat_BM colorR, FlexibleFloat_BM colorG,
|
||||
FlexibleFloat_BM colorB, FlexibleFloat_BM colorA) :
|
||||
base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.colorR = colorR;
|
||||
this.colorG = colorG;
|
||||
this.colorB = colorB;
|
||||
this.colorA = colorA;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = BaseColorChange.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), colorR.ConvertToGameType(),
|
||||
colorG.ConvertToGameType(), colorB.ConvertToGameType(), colorA.ConvertToGameType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 27336e14adc7c584abfc8b8ab934b5b8
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public partial class CameraFieldOfView_BM : AnimationBase_BM
|
||||
{
|
||||
public FlexibleFloat_BM fieldOfView;
|
||||
|
||||
public CameraFieldOfView_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public CameraFieldOfView_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, FlexibleFloat_BM fieldOfView)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.fieldOfView = fieldOfView;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = CameraFieldOfView.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid) as GameCamera, fieldOfView.ConvertToGameType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5a069835c1584bd4b99c22386a91b1e9
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class Displacement_BM : AnimationBase_BM
|
||||
{
|
||||
public FlexibleFloat_BM positionX, positionY, positionZ;
|
||||
|
||||
public Displacement_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Displacement_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, FlexibleFloat_BM positionX, FlexibleFloat_BM positionY, FlexibleFloat_BM positionZ)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.positionX = positionX;
|
||||
this.positionY = positionY;
|
||||
this.positionZ = positionZ;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = Displacement.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid),
|
||||
positionX.ConvertToGameType(), positionY.ConvertToGameType(), positionZ.ConvertToGameType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 96e9ad1bfb9ff804f9d6ed4f0a3b7a5a
|
||||
@@ -0,0 +1,31 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class EmissionColorChange_BM : AnimationBase_BM
|
||||
{
|
||||
public FlexibleFloat_BM colorR, colorG, colorB, colorI;
|
||||
|
||||
public EmissionColorChange_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public EmissionColorChange_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM parentElement,
|
||||
FlexibleFloat_BM colorR, FlexibleFloat_BM colorG, FlexibleFloat_BM colorB, FlexibleFloat_BM colorI) :
|
||||
base(elementName, elementGuid, tags, parentElement)
|
||||
{
|
||||
this.colorR = colorR;
|
||||
this.colorG = colorG;
|
||||
this.colorB = colorB;
|
||||
this.colorI = colorI;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = EmissionColorChange.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid),
|
||||
colorR.ConvertToGameType(), colorG.ConvertToGameType(), colorB.ConvertToGameType(), colorI.ConvertToGameType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 34026ee9602fd6a488a345fdbcf3afe2
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class LookAt_BM : GameElement_BM
|
||||
{
|
||||
public FlexibleBool_BM enabling;
|
||||
public Guid lookAtObjectGuid;
|
||||
|
||||
public LookAt_BM()
|
||||
{
|
||||
}
|
||||
|
||||
public LookAt_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, FlexibleBool_BM enabling, Guid lookAtObjectGuid)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.enabling = enabling;
|
||||
this.lookAtObjectGuid = lookAtObjectGuid;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = LookAt.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), GetElement(lookAtObjectGuid), enabling.ConvertToGameType());
|
||||
matchedElement.matchedBM = this;
|
||||
}
|
||||
|
||||
public override void AfterExecute()
|
||||
{
|
||||
(matchedElement as LookAt).targetGameElement = GetElement(lookAtObjectGuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9d2e7b8a937ae8743b844a99e494feeb
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class Scale_BM : GameElement_BM
|
||||
{
|
||||
public FlexibleFloat_BM scaleX, scaleY, scaleZ;
|
||||
|
||||
public Scale_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Scale_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
|
||||
FlexibleFloat_BM scaleX, FlexibleFloat_BM scaleY, FlexibleFloat_BM scaleZ)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.scaleX = scaleX;
|
||||
this.scaleY = scaleY;
|
||||
this.scaleZ = scaleZ;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = Scale.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid),
|
||||
scaleX.ConvertToGameType(), scaleY.ConvertToGameType(), scaleZ.ConvertToGameType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5488fe141701d9a428abfacc7e42b3de
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class Swirl_BM : AnimationBase_BM
|
||||
{
|
||||
public FlexibleFloat_BM eulerAngleX, eulerAngleY, eulerAngleZ;
|
||||
public Swirl_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Swirl_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
|
||||
FlexibleFloat_BM eulerAngleX, FlexibleFloat_BM eulerAngleY, FlexibleFloat_BM eulerAngleZ)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.eulerAngleX = eulerAngleX;
|
||||
this.eulerAngleY = eulerAngleY;
|
||||
this.eulerAngleZ = eulerAngleZ;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = Swirl.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid),
|
||||
eulerAngleX.ConvertToGameType(), eulerAngleY.ConvertToGameType(), eulerAngleZ.ConvertToGameType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cac746f176b9b4c4fac430e7c184e726
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class TrackTotalTimeChange_BM : AnimationBase_BM // Wait, inherited from GameElement_BM or AnimationBase_BM? Original is GameElement_BM
|
||||
{
|
||||
public FlexibleFloat_BM totalTime;
|
||||
|
||||
public TrackTotalTimeChange_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TrackTotalTimeChange_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, FlexibleFloat_BM totalTime) :
|
||||
base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.totalTime = totalTime;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = TrackTotalTimeChange.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid) as Track, totalTime.ConvertToGameType());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f36e781fad6cc7445ad32aa52f197e50
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6944ee6ee5d024c15a16862148361df3
|
||||
guid: b8868783dbcf51548922341076d0a007
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public abstract class BaseElement_BM
|
||||
{
|
||||
public Guid attachedElementGuid;
|
||||
|
||||
/// <summary>
|
||||
/// 从存档类中生成游戏物体
|
||||
/// </summary>
|
||||
public abstract void ExecuteBM();
|
||||
|
||||
/// <summary>
|
||||
/// 在AfterInitialize中被调用,用于处理GameElement的“需要引用”的物体在此物体后面生成的情况。
|
||||
/// 注意,如果使用此函数,需要在ExecuteBM中设置 matchedElement.matchedBM = this;
|
||||
/// </summary>
|
||||
public virtual void AfterExecute()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ef2eff94bdee06248854ed21f3065507
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
[Serializable]
|
||||
public abstract class GameElement_BM : BaseElement_BM
|
||||
{
|
||||
[NonSerialized]
|
||||
public static Dictionary<Guid, GameElement_BM> identifier = new(); //存档类的标识符
|
||||
|
||||
[NonSerialized]
|
||||
public GameElement matchedElement; //存档类对应的游戏物体
|
||||
|
||||
public string elementName;
|
||||
public List<string> tags;
|
||||
public Guid elementGuid;
|
||||
|
||||
public GameElement_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public GameElement_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement)
|
||||
{
|
||||
this.elementName = elementName;
|
||||
this.elementGuid = elementGuid;
|
||||
this.tags = tags;
|
||||
|
||||
attachedElementGuid = attachedElement?.elementGuid ?? Guid.Empty;
|
||||
|
||||
identifier.TryAdd(this.elementGuid, this);
|
||||
}
|
||||
|
||||
public static GameElement_BM GetElementBM(Guid id)
|
||||
{
|
||||
return identifier.GetValueOrDefault(id);
|
||||
}
|
||||
|
||||
public static GameElement GetElement(Guid id)
|
||||
{
|
||||
if (identifier.TryGetValue(id, out GameElement_BM element_BM))
|
||||
{
|
||||
return element_BM.matchedElement;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static List<BaseElement_BM> GetAllAttachedBaseElements(GameElement_BM gameElement, List<BaseElement_BM> clip)
|
||||
{
|
||||
Guid elementGuid = gameElement.elementGuid;
|
||||
List<BaseElement_BM> result = new List<BaseElement_BM>();
|
||||
foreach (BaseElement_BM element in clip)
|
||||
{
|
||||
if (element.attachedElementGuid == elementGuid)
|
||||
{
|
||||
result.Add(element);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d5f95c48fd44fe94ab431cc0b0d56207
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 56a4c0ac4ed204fcfb16a22f625230cd
|
||||
guid: bb6bd3e01b543b04385e6548dd703bbe
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e913aac8b094bea4892aac452ab66160
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,40 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class ColorSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public Color originalBaseColor;
|
||||
public bool emissionEnabled;
|
||||
public Color originalEmissionColor;
|
||||
public float originalEmissionIntensity;
|
||||
|
||||
public ColorSubmodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ColorSubmodule_BM(GameElement attachedElement) : base(attachedElement)
|
||||
{
|
||||
if (attachedElement is IHaveColorSubmodule host)
|
||||
{
|
||||
ColorSubmodule colorSubmodule = host.colorSubmodule;
|
||||
this.originalBaseColor = colorSubmodule.originalBaseColor;
|
||||
this.emissionEnabled = colorSubmodule.emissionEnabled;
|
||||
this.originalEmissionColor = colorSubmodule.originalEmissionColor;
|
||||
this.originalEmissionIntensity = colorSubmodule.originalEmissionIntensity;
|
||||
}
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is IHaveColorSubmodule host)
|
||||
{
|
||||
host.colorSubmodule = new ColorSubmodule(attachedElement,
|
||||
originalBaseColor, emissionEnabled, originalEmissionColor, originalEmissionIntensity);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a045579f4cbfb64481199b816bf4181
|
||||
@@ -0,0 +1,45 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class EffectSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public Dictionary<string, List<EffectBase_BM>> effectCollection;
|
||||
|
||||
public EffectSubmodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is IHaveEffectSubmodule host)
|
||||
{
|
||||
host.effectSubmodule = new EffectSubmodule(attachedElement, effectCollection);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class EffectBase_BM
|
||||
{
|
||||
public float effectTime;
|
||||
|
||||
public EffectBase_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public EffectBase_BM(float effectTime)
|
||||
{
|
||||
this.effectTime = effectTime;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 转换为游戏类
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public abstract EffectBase ConvertToGameType(GameElement attachedGameElement);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3297d909adad61947be63f25ac4db7a6
|
||||
@@ -0,0 +1,22 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public abstract class Submodule_BM : BaseElement_BM
|
||||
{
|
||||
[System.NonSerialized] protected GameElement attachedElement; //存档类对应的游戏物体
|
||||
|
||||
public Submodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public Submodule_BM(GameElement attachedElement)
|
||||
{
|
||||
this.attachedElement = attachedElement;
|
||||
attachedElementGuid = attachedElement.elementGuid;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c61675f6a6854c342bff8d180aa21953
|
||||
@@ -0,0 +1,35 @@
|
||||
using System;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class TimeDurationSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public bool isOverridingDuration;
|
||||
public float startTime, endTime;
|
||||
|
||||
public TimeDurationSubmodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TimeDurationSubmodule_BM(GameElement attachedElement) : base(attachedElement)
|
||||
{
|
||||
if (attachedElement is IHaveTimeDurationSubmodule host)
|
||||
{
|
||||
TimeDurationSubmodule timeDurationSubmodule = host.timeDurationSubmodule;
|
||||
isOverridingDuration = timeDurationSubmodule.isOverridingDuration;
|
||||
startTime = timeDurationSubmodule.startTime;
|
||||
endTime = timeDurationSubmodule.endTime;
|
||||
}
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is IHaveTimeDurationSubmodule host)
|
||||
{
|
||||
host.timeDurationSubmodule = new TimeDurationSubmodule(attachedElement, isOverridingDuration, startTime, endTime);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2869e576cd76caa4c8d2fbd9fd8b6467
|
||||
@@ -0,0 +1,37 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class TransformSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public Vector3 originalPosition;
|
||||
public Vector3 originalEulerAngles;
|
||||
public Vector3 originalScale;
|
||||
|
||||
public TransformSubmodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TransformSubmodule_BM(GameElement attachedElement) : base(attachedElement)
|
||||
{
|
||||
if (attachedElement is IHaveTransformSubmodule host)
|
||||
{
|
||||
TransformSubmodule transformSubmodule = host.transformSubmodule;
|
||||
this.originalPosition = transformSubmodule.originalPosition;
|
||||
this.originalEulerAngles = transformSubmodule.originalEulerAngles;
|
||||
this.originalScale = transformSubmodule.originalScale;
|
||||
}
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
|
||||
if (attachedElement is IHaveTransformSubmodule host)
|
||||
{
|
||||
host.transformSubmodule = new TransformSubmodule(attachedElement, originalPosition, originalEulerAngles, originalScale);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f325baafa00b1164db1f97b22fe13aba
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f6d79f15a2b8f0c4bb23575962e47d4d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,33 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class NoteAudioSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public List<string> generalJudgeAudioList;
|
||||
public List<string> perfectAudioList;
|
||||
public List<string> goodAudioList;
|
||||
public List<string> badAudioList;
|
||||
public List<string> missAudioList;
|
||||
public List<string> holdStartAudioList;
|
||||
|
||||
public NoteAudioSubmodule_BM() { }
|
||||
|
||||
public NoteAudioSubmodule_BM(GameElement attachedElement, NoteAudioSubmodule noteAudioSubmodule) : base(attachedElement)
|
||||
{
|
||||
generalJudgeAudioList = noteAudioSubmodule.generalJudgeAudioList;
|
||||
perfectAudioList = noteAudioSubmodule.perfectAudioList;
|
||||
goodAudioList = noteAudioSubmodule.goodAudioList;
|
||||
badAudioList = noteAudioSubmodule.badAudioList;
|
||||
missAudioList = noteAudioSubmodule.missAudioList;
|
||||
holdStartAudioList = noteAudioSubmodule.holdStartAudioList;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
(attachedElement as NoteBase).NoteAudioSubmodule = new NoteAudioSubmodule(attachedElement as NoteBase,
|
||||
generalJudgeAudioList, perfectAudioList, goodAudioList, badAudioList, missAudioList, holdStartAudioList);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b3b9bcdb5e4c018428b3a61fa77147d4
|
||||
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class NoteJudgeSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public List<NoteJudgeUnit_BM> judgeUnitList;
|
||||
|
||||
public NoteJudgeSubmodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is NoteBase noteBase)
|
||||
{
|
||||
noteBase.NoteJudgeSubmodule = new NoteJudgeSubmodule(noteBase, judgeUnitList);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 59db6eca1fe72d342afc2c3fc93ae4a3
|
||||
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class NoteJudgeTriggerSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public NoteJudgeTriggerSubmodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public NoteJudgeTriggerSubmodule_BM(GameElement attachedElement) : base(attachedElement)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is IHaveNoteJudgeTriggerSubmodule host)
|
||||
{
|
||||
host.noteJudgeTriggerSubmodule = new NoteJudgeTriggerSubmodule(attachedElement);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cdaa10c2d1850cd4c8c693904f3d44bf
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 305d8f651efa6da479993f7b3b1c7723
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,33 @@
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class TrackPathSubmodule_BM : Submodule_BM
|
||||
{
|
||||
public Track.TrackSpaceType trackSpaceType;
|
||||
public Track.TrackSamplingType trackSamplingType;
|
||||
public bool isClosed;
|
||||
public bool isShowingDisplay;
|
||||
|
||||
public TrackPathSubmodule_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TrackPathSubmodule_BM(GameElement attachedElement, TrackPathSubmodule trackPathSubmodule) : base(
|
||||
attachedElement)
|
||||
{
|
||||
this.trackSpaceType = trackPathSubmodule.trackSpaceType;
|
||||
this.trackSamplingType = trackPathSubmodule.trackSamplingType;
|
||||
this.isClosed = trackPathSubmodule.isClosed;
|
||||
this.isShowingDisplay = trackPathSubmodule.isShowingDisplay;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is Track track)
|
||||
{
|
||||
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed, isShowingDisplay);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5f79995b86e88ce468fb79156eb0571f
|
||||
@@ -0,0 +1,159 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class TrackRendererSubmoduleAutoOrient_BM : Submodule_BM
|
||||
{
|
||||
public string materialThemeBundleName;
|
||||
public string materialName;
|
||||
public bool enableEmission;
|
||||
public float emissionIntensity;
|
||||
public bool zWrite;
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
|
||||
public TrackRendererSubmoduleAutoOrient_BM() { }
|
||||
|
||||
public TrackRendererSubmoduleAutoOrient_BM(GameElement attachedElement, TrackRendererSubmoduleAutoOrient trSubmodule)
|
||||
: base(attachedElement)
|
||||
{
|
||||
materialThemeBundleName = trSubmodule.materialThemeBundleName;
|
||||
materialName = trSubmodule.materialName;
|
||||
enableEmission = trSubmodule.enableEmission;
|
||||
emissionIntensity = trSubmodule.emissionIntensity;
|
||||
zWrite = trSubmodule.zWrite;
|
||||
uvScale = trSubmodule.uvScale;
|
||||
uvOffset = trSubmodule.uvOffset;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is Track track)
|
||||
{
|
||||
track.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class TrackRendererSubmodulePathGenerator_BM : Submodule_BM
|
||||
{
|
||||
public string materialThemeBundleName;
|
||||
public string materialName;
|
||||
public bool enableEmission;
|
||||
public float emissionIntensity;
|
||||
public bool zWrite;
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
|
||||
public TrackRendererSubmodulePathGenerator_BM() { }
|
||||
|
||||
public TrackRendererSubmodulePathGenerator_BM(GameElement attachedElement, TrackRendererSubmodulePathGenerator trSubmodule)
|
||||
: base(attachedElement)
|
||||
{
|
||||
materialThemeBundleName = trSubmodule.materialThemeBundleName;
|
||||
materialName = trSubmodule.materialName;
|
||||
enableEmission = trSubmodule.enableEmission;
|
||||
emissionIntensity = trSubmodule.emissionIntensity;
|
||||
zWrite = trSubmodule.zWrite;
|
||||
uvScale = trSubmodule.uvScale;
|
||||
uvOffset = trSubmodule.uvOffset;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is Track track)
|
||||
{
|
||||
track.trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class TrackRendererSubmoduleSurface_BM : Submodule_BM
|
||||
{
|
||||
public string materialThemeBundleName;
|
||||
public string materialName;
|
||||
public bool enableEmission;
|
||||
public float emissionIntensity;
|
||||
public bool zWrite;
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
|
||||
public TrackRendererSubmoduleSurface_BM() { }
|
||||
|
||||
public TrackRendererSubmoduleSurface_BM(GameElement attachedElement, TrackRendererSubmoduleSurface trSubmodule)
|
||||
: base(attachedElement)
|
||||
{
|
||||
materialThemeBundleName = trSubmodule.materialThemeBundleName;
|
||||
materialName = trSubmodule.materialName;
|
||||
enableEmission = trSubmodule.enableEmission;
|
||||
emissionIntensity = trSubmodule.emissionIntensity;
|
||||
zWrite = trSubmodule.zWrite;
|
||||
uvScale = trSubmodule.uvScale;
|
||||
uvOffset = trSubmodule.uvOffset;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is Track track)
|
||||
{
|
||||
track.trackRendererSubmodule = new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class TrackRendererSubmoduleTubeGenerator_BM : Submodule_BM
|
||||
{
|
||||
public string materialThemeBundleName;
|
||||
public string materialName;
|
||||
public bool enableEmission;
|
||||
public float emissionIntensity;
|
||||
public bool zWrite;
|
||||
public int sideCount;
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
|
||||
public TrackRendererSubmoduleTubeGenerator_BM() { }
|
||||
|
||||
public TrackRendererSubmoduleTubeGenerator_BM(GameElement attachedElement, TrackRendererSubmoduleTubeGenerator trSubmodule)
|
||||
: base(attachedElement)
|
||||
{
|
||||
materialThemeBundleName = trSubmodule.materialThemeBundleName;
|
||||
materialName = trSubmodule.materialName;
|
||||
enableEmission = trSubmodule.enableEmission;
|
||||
emissionIntensity = trSubmodule.emissionIntensity;
|
||||
sideCount = trSubmodule.sideCount;
|
||||
zWrite = trSubmodule.zWrite;
|
||||
uvScale = trSubmodule.uvScale;
|
||||
uvOffset = trSubmodule.uvOffset;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is Track track)
|
||||
{
|
||||
track.trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount, uvScale, uvOffset);
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 49130f20a32c5134484a0d74ee30a73c
|
||||
@@ -0,0 +1,58 @@
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class TrackTimeSubmoduleMovable_BM : Submodule_BM
|
||||
{
|
||||
public float trackStartTime;
|
||||
public float trackEndTime;
|
||||
public float visibleTrackTimeLength;
|
||||
public AnimationCurveType animationCurveType;
|
||||
|
||||
public TrackTimeSubmoduleMovable_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TrackTimeSubmoduleMovable_BM(GameElement attachedElement, TrackTimeSubmoduleMovable trackTimeSubmoduleMovable) : base(attachedElement)
|
||||
{
|
||||
trackStartTime = trackTimeSubmoduleMovable.trackStartTime;
|
||||
trackEndTime = trackTimeSubmoduleMovable.trackEndTime;
|
||||
visibleTrackTimeLength = trackTimeSubmoduleMovable.visibleTrackTimeLength;
|
||||
animationCurveType = trackTimeSubmoduleMovable.animationCurveType;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is Track track)
|
||||
{
|
||||
track.trackTimeSubmodule = new TrackTimeSubmoduleMovable(track, trackStartTime, trackEndTime, visibleTrackTimeLength, animationCurveType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class TrackTimeSubmoduleStatic_BM : Submodule_BM
|
||||
{
|
||||
public float trackTotalTime;
|
||||
public AnimationCurveType animationCurveType;
|
||||
|
||||
public TrackTimeSubmoduleStatic_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TrackTimeSubmoduleStatic_BM(GameElement attachedElement, TrackTimeSubmoduleStatic trackTimeSubmoduleStatic) : base(attachedElement)
|
||||
{
|
||||
trackTotalTime = trackTimeSubmoduleStatic.trackTotalTime;
|
||||
animationCurveType = trackTimeSubmoduleStatic.animationCurveType;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
if (attachedElement is Track track)
|
||||
{
|
||||
track.trackTimeSubmodule = new TrackTimeSubmoduleStatic(track, trackTotalTime, animationCurveType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 362d59c88527e834c909b3e408945f5e
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 490553274c7dc3d4bb2645927a6a02e6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,378 @@
|
||||
using UnityEngine;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni
|
||||
{
|
||||
public enum AnimationCurveType //预设动画曲线类型
|
||||
{
|
||||
Linear = 0,
|
||||
InQuad = 1,
|
||||
OutQuad = 2,
|
||||
InOutQuad = 3,
|
||||
InCubic = 4,
|
||||
OutCubic = 5,
|
||||
InOutCubic = 6,
|
||||
InQuart = 7,
|
||||
OutQuart = 8,
|
||||
InOutQuart = 9,
|
||||
InQuint = 10,
|
||||
OutQuint = 11,
|
||||
InOutQuint = 12,
|
||||
InSine = 13,
|
||||
OutSine = 14,
|
||||
InOutSine = 15,
|
||||
InExpo = 16,
|
||||
OutExpo = 17,
|
||||
InOutExpo = 18,
|
||||
InCirc = 19,
|
||||
OutCirc = 20,
|
||||
InOutCirc = 21,
|
||||
InBounce = 22,
|
||||
OutBounce = 23,
|
||||
InOutBounce = 24,
|
||||
InElastic = 25,
|
||||
OutElastic = 26,
|
||||
InOutElastic = 27,
|
||||
InBack = 28,
|
||||
OutBack = 29,
|
||||
InOutBack = 30
|
||||
}
|
||||
|
||||
public static class AnimationCurveEvaluator
|
||||
{
|
||||
public static float Evaluate(AnimationCurveType animationCurveType, float t)
|
||||
{
|
||||
t = Mathf.Clamp(t, 0, 1);
|
||||
|
||||
switch (animationCurveType)
|
||||
{
|
||||
case AnimationCurveType.Linear:
|
||||
return Linear(0, 1, t);
|
||||
case AnimationCurveType.InQuad:
|
||||
return InQuad(0, 1, t);
|
||||
case AnimationCurveType.OutQuad:
|
||||
return OutQuad(0, 1, t);
|
||||
case AnimationCurveType.InOutQuad:
|
||||
return InOutQuad(0, 1, t);
|
||||
case AnimationCurveType.InCubic:
|
||||
return InCubic(0, 1, t);
|
||||
case AnimationCurveType.OutCubic:
|
||||
return OutCubic(0, 1, t);
|
||||
case AnimationCurveType.InOutCubic:
|
||||
return InOutCubic(0, 1, t);
|
||||
case AnimationCurveType.InQuart:
|
||||
return InQuart(0, 1, t);
|
||||
case AnimationCurveType.OutQuart:
|
||||
return OutQuart(0, 1, t);
|
||||
case AnimationCurveType.InOutQuart:
|
||||
return InOutQuart(0, 1, t);
|
||||
case AnimationCurveType.InQuint:
|
||||
return InQuint(0, 1, t);
|
||||
case AnimationCurveType.OutQuint:
|
||||
return OutQuint(0, 1, t);
|
||||
case AnimationCurveType.InOutQuint:
|
||||
return InOutQuint(0, 1, t);
|
||||
case AnimationCurveType.InSine:
|
||||
return InSine(0, 1, t);
|
||||
case AnimationCurveType.OutSine:
|
||||
return OutSine(0, 1, t);
|
||||
case AnimationCurveType.InOutSine:
|
||||
return InOutSine(0, 1, t);
|
||||
case AnimationCurveType.InExpo:
|
||||
return InExpo(0, 1, t);
|
||||
case AnimationCurveType.OutExpo:
|
||||
return OutExpo(0, 1, t);
|
||||
case AnimationCurveType.InOutExpo:
|
||||
return InOutExpo(0, 1, t);
|
||||
case AnimationCurveType.InCirc:
|
||||
return InCirc(0, 1, t);
|
||||
case AnimationCurveType.OutCirc:
|
||||
return OutCirc(0, 1, t);
|
||||
case AnimationCurveType.InOutCirc:
|
||||
return InOutCirc(0, 1, t);
|
||||
case AnimationCurveType.InBounce:
|
||||
return InBounce(0, 1, t);
|
||||
case AnimationCurveType.OutBounce:
|
||||
return OutBounce(0, 1, t);
|
||||
case AnimationCurveType.InOutBounce:
|
||||
return InOutBounce(0, 1, t);
|
||||
case AnimationCurveType.InElastic:
|
||||
return InElastic(0, 1, t);
|
||||
case AnimationCurveType.OutElastic:
|
||||
return OutElastic(0, 1, t);
|
||||
case AnimationCurveType.InOutElastic:
|
||||
return InOutElastic(0, 1, t);
|
||||
case AnimationCurveType.InBack:
|
||||
return InBack(0, 1, t);
|
||||
case AnimationCurveType.OutBack:
|
||||
return OutBack(0, 1, t);
|
||||
case AnimationCurveType.InOutBack:
|
||||
return InOutBack(0, 1, t);
|
||||
}
|
||||
|
||||
throw new NotImplementedException($"Animation curve type {animationCurveType} is not implemented.");
|
||||
}
|
||||
|
||||
#region 缓动曲线计算式
|
||||
private static float Linear(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
return c * t / 1f + from;
|
||||
}
|
||||
|
||||
private static float InQuad(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
return c * t * t + from;
|
||||
}
|
||||
|
||||
private static float OutQuad(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
return -c * t * (t - 2f) + from;
|
||||
}
|
||||
|
||||
private static float InOutQuad(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 0.5f;
|
||||
if (t < 1) return c / 2f * t * t + from;
|
||||
t--;
|
||||
return -c / 2f * (t * (t - 2) - 1) + from;
|
||||
}
|
||||
|
||||
private static float InCubic(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
return c * t * t * t + from;
|
||||
}
|
||||
|
||||
private static float OutCubic(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
t--;
|
||||
return c * (t * t * t + 1) + from;
|
||||
}
|
||||
|
||||
private static float InOutCubic(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 0.5f;
|
||||
if (t < 1) return c / 2f * t * t * t + from;
|
||||
t -= 2;
|
||||
return c / 2f * (t * t * t + 2) + from;
|
||||
}
|
||||
|
||||
private static float InQuart(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
return c * t * t * t * t + from;
|
||||
}
|
||||
|
||||
private static float OutQuart(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
t--;
|
||||
return -c * (t * t * t * t - 1) + from;
|
||||
}
|
||||
|
||||
private static float InOutQuart(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 0.5f;
|
||||
if (t < 1) return c / 2f * t * t * t * t + from;
|
||||
t -= 2;
|
||||
return -c / 2f * (t * t * t * t - 2) + from;
|
||||
}
|
||||
|
||||
private static float InQuint(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
return c * t * t * t * t * t + from;
|
||||
}
|
||||
|
||||
private static float OutQuint(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
t--;
|
||||
return c * (t * t * t * t * t + 1) + from;
|
||||
}
|
||||
|
||||
private static float InOutQuint(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 0.5f;
|
||||
if (t < 1) return c / 2f * t * t * t * t * t + from;
|
||||
t -= 2;
|
||||
return c / 2f * (t * t * t * t * t + 2) + from;
|
||||
}
|
||||
|
||||
private static float InSine(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
return -c * Mathf.Cos(t / 1f * (Mathf.PI / 2f)) + c + from;
|
||||
}
|
||||
|
||||
private static float OutSine(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
return c * Mathf.Sin(t / 1f * (Mathf.PI / 2f)) + from;
|
||||
}
|
||||
|
||||
private static float InOutSine(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
return -c / 2f * (Mathf.Cos(Mathf.PI * t / 1f) - 1) + from;
|
||||
}
|
||||
|
||||
private static float InExpo(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
return c * Mathf.Pow(2, 10 * (t / 1f - 1)) + from;
|
||||
}
|
||||
|
||||
private static float OutExpo(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
return c * (-Mathf.Pow(2, -10 * t / 1f) + 1) + from;
|
||||
}
|
||||
|
||||
private static float InOutExpo(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 0.5f;
|
||||
if (t < 1f) return c / 2f * Mathf.Pow(2, 10 * (t - 1)) + from;
|
||||
t--;
|
||||
return c / 2f * (-Mathf.Pow(2, -10 * t) + 2) + from;
|
||||
}
|
||||
|
||||
private static float InCirc(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
return -c * (Mathf.Sqrt(1 - t * t) - 1) + from;
|
||||
}
|
||||
|
||||
private static float OutCirc(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 1f;
|
||||
t--;
|
||||
return c * Mathf.Sqrt(1 - t * t) + from;
|
||||
}
|
||||
|
||||
private static float InOutCirc(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
t /= 0.5f;
|
||||
if (t < 1) return -c / 2f * (Mathf.Sqrt(1 - t * t) - 1) + from;
|
||||
t -= 2;
|
||||
return c / 2f * (Mathf.Sqrt(1 - t * t) + 1) + from;
|
||||
}
|
||||
|
||||
private static float InBounce(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
return c - OutBounce(0f, c, 1f - t) + from; //does this work?
|
||||
}
|
||||
|
||||
private static float OutBounce(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
|
||||
if ((t /= 1f) < (1 / 2.75f))
|
||||
{
|
||||
return c * (7.5625f * t * t) + from;
|
||||
}
|
||||
else if (t < (2 / 2.75f))
|
||||
{
|
||||
return c * (7.5625f * (t -= (1.5f / 2.75f)) * t + .75f) + from;
|
||||
}
|
||||
else if (t < (2.5 / 2.75))
|
||||
{
|
||||
return c * (7.5625f * (t -= (2.25f / 2.75f)) * t + .9375f) + from;
|
||||
}
|
||||
else
|
||||
{
|
||||
return c * (7.5625f * (t -= (2.625f / 2.75f)) * t + .984375f) + from;
|
||||
}
|
||||
}
|
||||
|
||||
private static float InOutBounce(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
if (t < 0.5f) return InBounce(0, c, t * 2f) * 0.5f + from;
|
||||
return OutBounce(0, c, t * 2 - 1) * 0.5f + c * 0.5f + from;
|
||||
|
||||
}
|
||||
|
||||
private static float InElastic(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
if (t == 0) return from;
|
||||
if ((t /= 1f) == 1) return from + c;
|
||||
float p = 0.3f;
|
||||
float s = p / 4f;
|
||||
return -(c * Mathf.Pow(2, 10 * (t -= 1)) * Mathf.Sin((t - s) * (2 * Mathf.PI) / p)) + from;
|
||||
}
|
||||
|
||||
private static float OutElastic(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
if (t == 0) return from;
|
||||
if ((t /= 1f) == 1) return from + c;
|
||||
float p = 0.3f;
|
||||
float s = p / 4f;
|
||||
return (c * Mathf.Pow(2, -10 * t) * Mathf.Sin((t - s) * (2 * Mathf.PI) / p) + c + from);
|
||||
}
|
||||
|
||||
private static float InOutElastic(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
if (t == 0) return from;
|
||||
if ((t /= 0.5f) == 2) return from + c;
|
||||
float p = 0.3f * 1.5f;
|
||||
float s = p / 4f;
|
||||
if (t < 1)
|
||||
return -0.5f * (c * Mathf.Pow(2, 10 * (t -= 1f)) * Mathf.Sin((t - 2) * (2 * Mathf.PI) / p)) + from;
|
||||
return c * Mathf.Pow(2, -10 * (t -= 1)) * Mathf.Sin((t - s) * (2f * Mathf.PI) / p) * 0.5f + c + from;
|
||||
}
|
||||
|
||||
private static float InBack(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
float s = 1.70158f;
|
||||
t /= 0.5f;
|
||||
return c * t * t * ((s + 1) * t - s) + from;
|
||||
}
|
||||
|
||||
private static float OutBack(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
float s = 1.70158f;
|
||||
t = t / 1f - 1f;
|
||||
return c * (t * t * ((s + 1) * t + s) + 1) + from;
|
||||
}
|
||||
|
||||
private static float InOutBack(float from, float to, float t)
|
||||
{
|
||||
float c = to - from;
|
||||
float s = 1.70158f;
|
||||
t /= 0.5f;
|
||||
if (t < 1) return c / 2f * (t * t * (((s *= (1.525f)) + 1) * t - s)) + from;
|
||||
t -= 2;
|
||||
return c / 2f * (t * t * (((s *= (1.525f)) + 1) * t + s) + 2) + from;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class FlexibleBool_BM
|
||||
{
|
||||
public List<AnimatedBool> animatedBoolList;
|
||||
|
||||
public FlexibleBool_BM()
|
||||
{
|
||||
this.animatedBoolList = new List<AnimatedBool>();
|
||||
}
|
||||
|
||||
public FlexibleBool_BM(List<AnimatedBool> animatedBoolList)
|
||||
{
|
||||
this.animatedBoolList = animatedBoolList;
|
||||
}
|
||||
|
||||
public FlexibleBool ConvertToGameType()
|
||||
{
|
||||
FlexibleBool flexibleBool;
|
||||
|
||||
if (this.animatedBoolList.Count == 0)
|
||||
{
|
||||
flexibleBool = new FlexibleBool();
|
||||
}
|
||||
else
|
||||
{
|
||||
List<AnimatedBool> animations = new List<AnimatedBool>();
|
||||
foreach (AnimatedBool animatedBool in animatedBoolList)
|
||||
{
|
||||
animations.Add(new AnimatedBool(animatedBool.time, animatedBool.value));
|
||||
}
|
||||
|
||||
flexibleBool = new FlexibleBool(animations);
|
||||
}
|
||||
|
||||
return flexibleBool;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 34744273e1ec1104389f96de37ef2a30
|
||||
@@ -0,0 +1,45 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
[System.Serializable]
|
||||
public class FlexibleFloat_BM
|
||||
{
|
||||
public List<AnimatedFloat> animatedFloatList;
|
||||
|
||||
public FlexibleFloat_BM()
|
||||
{
|
||||
this.animatedFloatList = new List<AnimatedFloat>();
|
||||
}
|
||||
|
||||
public FlexibleFloat_BM(List<AnimatedFloat> animatedFloatList)
|
||||
{
|
||||
this.animatedFloatList = animatedFloatList;
|
||||
}
|
||||
|
||||
public FlexibleFloat ConvertToGameType()
|
||||
{
|
||||
FlexibleFloat flexibleFloat;
|
||||
|
||||
if (animatedFloatList.Count == 0)
|
||||
{
|
||||
flexibleFloat = new FlexibleFloat();
|
||||
}
|
||||
else
|
||||
{
|
||||
List<AnimatedFloat> animatedFloatList = new List<AnimatedFloat>();
|
||||
foreach (AnimatedFloat animatedFloat in this.animatedFloatList)
|
||||
{
|
||||
animatedFloatList.Add(new AnimatedFloat(
|
||||
animatedFloat.startTime, animatedFloat.endTime,
|
||||
animatedFloat.startValue, animatedFloat.endValue,
|
||||
animatedFloat.animationCurveType));
|
||||
}
|
||||
|
||||
flexibleFloat = new FlexibleFloat(animatedFloatList);
|
||||
}
|
||||
|
||||
return flexibleFloat;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 157e98f139bd21647a1df710fe63dd81
|
||||
@@ -0,0 +1,43 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
[System.Serializable]
|
||||
public class FlexibleInt_BM
|
||||
{
|
||||
public List<AnimatedInt> animatedIntList;
|
||||
|
||||
public FlexibleInt_BM()
|
||||
{
|
||||
this.animatedIntList = new List<AnimatedInt>();
|
||||
}
|
||||
|
||||
public FlexibleInt_BM(List<AnimatedInt> animatedIntList)
|
||||
{
|
||||
this.animatedIntList = animatedIntList;
|
||||
}
|
||||
|
||||
public FlexibleInt ConvertToGameType()
|
||||
{
|
||||
FlexibleInt flexibleInt;
|
||||
|
||||
if (animatedIntList.Count == 0)
|
||||
{
|
||||
flexibleInt = new FlexibleInt();
|
||||
}
|
||||
else
|
||||
{
|
||||
List<AnimatedInt> animations = new List<AnimatedInt>();
|
||||
|
||||
foreach (AnimatedInt animatedInt in animatedIntList)
|
||||
{
|
||||
animations.Add(new AnimatedInt(animatedInt.time, animatedInt.value));
|
||||
}
|
||||
|
||||
flexibleInt = new FlexibleInt(animations);
|
||||
}
|
||||
|
||||
return flexibleInt;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f235a3498a2746d4ca998b8a8b982866
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ef5a9eed7f6e42247a93c01519d89d64
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 21ec904f9ffa2e8409027f9916f33248
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class BackgroundSetter_BM : GameElement_BM
|
||||
{
|
||||
public bool useSkybox;
|
||||
public string skyboxThemeBundleName;
|
||||
public string skyboxMaterialName;
|
||||
public string backgroundSpriteName;
|
||||
|
||||
public BackgroundSetter_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public BackgroundSetter_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
|
||||
bool useSkybox, string skyboxThemeBundleName, string skyboxMaterialName, string backgroundSpriteName)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.useSkybox = useSkybox;
|
||||
this.skyboxThemeBundleName = skyboxThemeBundleName;
|
||||
this.skyboxMaterialName = skyboxMaterialName;
|
||||
this.backgroundSpriteName = backgroundSpriteName;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = BackgroundSetter.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), useSkybox, skyboxThemeBundleName, skyboxMaterialName, backgroundSpriteName);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d71b30900f485ad4abb5b9ad9f2f41eb
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class EnvironmentObject_BM : SubstantialObject_BM
|
||||
{
|
||||
public bool isStatic;
|
||||
|
||||
public EnvironmentObject_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public EnvironmentObject_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, string themeBundleName, string objectName, bool isStatic)
|
||||
: base(elementName, elementGuid, tags, attachedElement, themeBundleName, objectName)
|
||||
{
|
||||
this.isStatic = isStatic;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = EnvironmentObject.GenerateElement(elementName, elementGuid, tags, false,
|
||||
themeBundleName, objectName, GetElement(attachedElementGuid), isStatic);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fd625b39e108a184b8bd3359ecc15b95
|
||||
@@ -0,0 +1,58 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class ParticleEmitter_BM : GameElement_BM
|
||||
{
|
||||
public bool prewarm = false;
|
||||
public float playTime = 0f;
|
||||
public float stopTime = 1f;
|
||||
|
||||
public ParticleSystemSimulationSpace simulationSpace;
|
||||
public float density = 10;
|
||||
public float lifeTime = 5;
|
||||
public float speed;
|
||||
public float radius;
|
||||
|
||||
public bool isAutoOrient = true;
|
||||
public Vector3 particleRotation = Vector3.zero;
|
||||
|
||||
public string materialThemeBundleName = string.Empty;
|
||||
public string materialName = string.Empty;
|
||||
|
||||
public ParticleEmitter_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ParticleEmitter_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
|
||||
bool prewarm, float playTime, float stopTime, ParticleSystemSimulationSpace simulationSpace,
|
||||
float density, float lifeTime, float speed, float radius, bool isAutoOrient, Vector3 particleRotation,
|
||||
string materialThemeBundleName, string materialName) :
|
||||
base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.prewarm = prewarm;
|
||||
this.playTime = playTime;
|
||||
this.stopTime = stopTime;
|
||||
this.simulationSpace = simulationSpace;
|
||||
this.density = density;
|
||||
this.lifeTime = lifeTime;
|
||||
this.speed = speed;
|
||||
this.radius = radius;
|
||||
this.isAutoOrient = isAutoOrient;
|
||||
this.particleRotation = particleRotation;
|
||||
this.materialThemeBundleName = materialThemeBundleName;
|
||||
this.materialName = materialName;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = ParticleEmitter.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), materialThemeBundleName, materialName,
|
||||
prewarm, playTime, stopTime, simulationSpace, density, lifeTime, speed, radius,
|
||||
isAutoOrient, particleRotation);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fff835610e85b7c40963a8b8486a3524
|
||||
@@ -0,0 +1,34 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class SkyboxSubsetter_BM : GameElement_BM
|
||||
{
|
||||
public List<string> skyBoxThemeBundleList;
|
||||
public List<string> skyboxNameList;
|
||||
public List<float> blendTimeList;
|
||||
public List<float> blendSpeedList;
|
||||
|
||||
public SkyboxSubsetter_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public SkyboxSubsetter_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
|
||||
List<string> skyBoxThemeBundleList, List<string> skyboxNameList, List<float> blendTimeList, List<float> blendSpeedList)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.skyBoxThemeBundleList = skyBoxThemeBundleList;
|
||||
this.skyboxNameList = skyboxNameList;
|
||||
this.blendTimeList = blendTimeList;
|
||||
this.blendSpeedList = blendSpeedList;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = SkyboxSubsetter.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), skyBoxThemeBundleList, skyboxNameList, blendTimeList, blendSpeedList);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b88018b9f1dfcd246a4cf0197b2c41e6
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dd1bf361f8f45884fb0a959bc1f6b143
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,24 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class ElementFolder_BM : GameElement_BM
|
||||
{
|
||||
public ElementFolder_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public ElementFolder_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = ElementFolder.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 58ecc622995f8f64099deb76c6bd27e2
|
||||
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class GameCameraExtension_BM : GameElement_BM
|
||||
{
|
||||
public float farClipRange;
|
||||
|
||||
public GameCameraExtension_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public GameCameraExtension_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, float farClipRange)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.farClipRange = farClipRange;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = GameCameraExtension.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), farClipRange);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 950b290b30a639c479f82871076a1782
|
||||
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class GameCamera_BM : GameElement_BM
|
||||
{
|
||||
public GameCamera.CameraViewType cameraViewType;
|
||||
public float perspectiveAngle;
|
||||
public float orthographicSize;
|
||||
|
||||
public GameCamera_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public GameCamera_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, GameCamera.CameraViewType cameraViewType,
|
||||
float perspectiveAngle, float orthographicSize)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.cameraViewType = cameraViewType;
|
||||
this.perspectiveAngle = perspectiveAngle;
|
||||
this.orthographicSize = orthographicSize;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = GameCamera.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), cameraViewType, perspectiveAngle, orthographicSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 56b27fa61c6adad4abdc465fd1e408a0
|
||||
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class SubstantialObject_BM : GameElement_BM
|
||||
{
|
||||
public string themeBundleName;
|
||||
public string objectName;
|
||||
|
||||
public SubstantialObject_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public SubstantialObject_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
|
||||
string themeBundleName, string objectName)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
this.themeBundleName = themeBundleName;
|
||||
this.objectName = objectName;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 618c4a2232638e84ca9c78c4fc525283
|
||||
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class TimeEffectsCollection_BM : GameElement_BM
|
||||
{
|
||||
public float time;
|
||||
|
||||
public TimeEffectsCollection_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TimeEffectsCollection_BM(string elementName, Guid elementGuid, List<string> tags,
|
||||
GameElement_BM attachedElement, TimeEffectsCollection timeEffectsCollection)
|
||||
: base(elementName, elementGuid, tags, attachedElement)
|
||||
{
|
||||
time = timeEffectsCollection.time;
|
||||
}
|
||||
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = TimeEffectsCollection.GenerateElement(elementName, elementGuid,
|
||||
tags, false, GetElement(attachedElementGuid), time);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa411d9c23ba6b7459334abdfddc35c9
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class VariablesContainer_BM : GameElement_BM
|
||||
{
|
||||
public Dictionary<string, int> originalVariables;
|
||||
|
||||
public VariablesContainer_BM()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public VariablesContainer_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM parentElement,
|
||||
Dictionary<string, int> originalVariables) : base(elementName, elementGuid, tags, parentElement)
|
||||
{
|
||||
this.originalVariables = new Dictionary<string, int>(originalVariables);
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
matchedElement = VariablesContainer.GenerateElement(elementName, elementGuid, tags, false,
|
||||
GetElement(attachedElementGuid), originalVariables);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1ca9ba2716572614ea591c1ce7652af0
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e8f7a67f19bf55e4dbd3f0f3fe67f072
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,26 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class BloomEffect_BM : EffectBase_BM
|
||||
{
|
||||
public float duration;
|
||||
public float peak;
|
||||
public AnimationCurve intensityCurve;
|
||||
|
||||
public BloomEffect_BM() { }
|
||||
|
||||
public BloomEffect_BM(float duration, float peak, AnimationCurve intensityCurve)
|
||||
{
|
||||
this.effectTime = duration;
|
||||
this.duration = duration;
|
||||
this.peak = peak;
|
||||
this.intensityCurve = intensityCurve;
|
||||
}
|
||||
|
||||
public override EffectBase ConvertToGameType(GameElement attachedGameElement)
|
||||
{
|
||||
return new BloomEffect(duration, peak, intensityCurve);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9f0b0bbe1ab75ff439cd89cb2d6c8903
|
||||
@@ -0,0 +1,24 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class CameraOffsetEffect_BM : EffectBase_BM
|
||||
{
|
||||
public float duration;
|
||||
public Vector3 offsetValue;
|
||||
public AnimationCurve offsetCurve;
|
||||
|
||||
public CameraOffsetEffect_BM(float duration, Vector3 offsetValue, AnimationCurve offsetCurve)
|
||||
{
|
||||
this.effectTime = duration;
|
||||
this.duration = duration;
|
||||
this.offsetValue = offsetValue;
|
||||
this.offsetCurve = offsetCurve;
|
||||
}
|
||||
|
||||
public override EffectBase ConvertToGameType(GameElement attachedGameElement)
|
||||
{
|
||||
return new CameraOffsetEffect(duration, offsetValue, offsetCurve);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c89d0dc887a006b4db0f9bd126ad9f46
|
||||
@@ -0,0 +1,30 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class CameraShakeEffect_BM : EffectBase_BM
|
||||
{
|
||||
public float duration;
|
||||
public float frequency;
|
||||
public float amplitudeX;
|
||||
public float amplitudeY;
|
||||
public float amplitudeZ;
|
||||
|
||||
public CameraShakeEffect_BM() { }
|
||||
|
||||
public CameraShakeEffect_BM(float duration, float frequency, float amplitudeX, float amplitudeY, float amplitudeZ)
|
||||
{
|
||||
this.effectTime = duration;
|
||||
this.duration = duration;
|
||||
this.frequency = frequency;
|
||||
this.amplitudeX = amplitudeX;
|
||||
this.amplitudeY = amplitudeY;
|
||||
this.amplitudeZ = amplitudeZ;
|
||||
}
|
||||
|
||||
public override EffectBase ConvertToGameType(GameElement attachedGameElement)
|
||||
{
|
||||
return new CameraShakeEffect(duration, frequency, amplitudeX, amplitudeY, amplitudeZ);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f95d6b34e5bfc004ab751726eb61c1c5
|
||||
@@ -0,0 +1,25 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame.Beatmap
|
||||
{
|
||||
public class CameraTiltEffect_BM : EffectBase_BM
|
||||
{
|
||||
public float duration;
|
||||
public Vector3 tiltValue;
|
||||
public AnimationCurve tiltCurve;
|
||||
|
||||
public CameraTiltEffect_BM(float duration, Vector3 tiltValue, AnimationCurve tiltCurve)
|
||||
{
|
||||
this.effectTime = duration;
|
||||
this.duration = duration;
|
||||
this.tiltValue = tiltValue;
|
||||
this.tiltCurve = tiltCurve;
|
||||
|
||||
}
|
||||
|
||||
public override EffectBase ConvertToGameType(GameElement attachedGameElement)
|
||||
{
|
||||
return new CameraTiltEffect(duration, tiltValue, tiltCurve);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2fa4d735d24b66446bd65febd6bf970b
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user