最近GalGame这个游戏品类成为了bilibili中讨论比较多的话题,于是初学Unity的我就决定要不做个GalGame试试看吧(绝对不是为了蹭热度🤨)
GalGame本质是一个游戏分类,源自于日本,意思是美少女游戏,"Gal"即是日语ギャル("美少女")一词的音译;
GalGame也被称为"视觉小说",其剧情内容以恋爱为主,本质就是一种剧情游戏分支,但是GalGame这一分类要求以剧情为主导,也就是说有其他非剧情主要玩法的游戏不能被归类的GalGame;
所以说,GalGame本身是一个比较正常的游戏分类,不过在bilibili由于某些特殊原因成为了一个梗
正如其名字,这是一个用来制作GalGame的引擎,我搭建了一个GalGame的基本框架,通过规范格式编写记录剧情内容的JSON文件,即可在GalEngine中播放这段剧情;
你可以将制作好的剧情包放置在特定的目录({Application.persistentDataPath}/Packs),GalEngine会扫描那个目录并列出其中所有包,用户可以点击列出的包以进入剧情;
这是我的第一个Unity且是第一个C#项目,最早的代码(剧情播放部分,即DisplayTalkingInformation类)甚至是在我接触C#仅2周、Unity仅4天后写出来的,直至撰写此文本时(2025.12.27)我也才接触Unity约一个多月,所以可能有很多逻辑不甚清晰、解决方案并不算完美,请各位谅解,我还有很多要学
该项目的所有代码脚本使用MIT LICENSE开源,这意味着你可以:
- 自由使用、复制、修改、合并、发布、分发、再许可和/或销售本软件的副本 但是你应当需要:
- 署名: 你应当在项目中署以我的名并携带此许可证的副本
该项目的所有UI以CC0 1.0协议开源,这以为这你可以:
- 随意以任何形式使用资源,并且无需署名等
该协议仅作用于UI,即
/Resources/Image/Illustration下的所有.ai文件
首先,在未来我会开发GalCraft项目,届时将可以使用图形化界面制作剧情包而无需手动操作JSON文件;不过当前仍需要手动编写JSON文件,接下来讲解的是JSON文件的格式以及一个标准剧情包的规范
配置文件:
首先,你的包应该需要一个config.json配置文件,并将其放在包的根目录,格式应该像这样:
{
"title": "Your Pack Title", // 包的标题
"author": "Your_name", // 你的名字
"link": "https://your.social.link", // 你的链接,可选
"id": "your_pack_id", // 包的唯一标识码
"version": "1.0.0", // 包的版本,可选
"description": "Your pack description", // 对于包的描述,可选
"license": "MIT", // 包的协议,可选
"cover": "cover.png", // 封面图,可选,1556*1182或778:591的比例(这比例很诡异,请原谅我搞出了如此怪异的比例),否则会被拉伸
"index": "plot/index.json" // 开始的文件(剧情JSON文件)
}剧情文件: 这是你的包的核心,它包含了整个剧情的内容,目前它有着node(普通节点)和branch(选择分支)两种节点类型
[ //你的整个JSON文件应当包裹在一个Array里
// 简单节点示例
{
"node": 0, // 节点的编号,从0开始,与父级Array索引相同
"type": "node", // 节点类型(node或branch)
"character": "character_name", // 角色名字,留空则无
"description": "the character description", // 对于角色的描述(如“陌生的女孩”、“咖啡店店员”等描述性词汇),以小字体显示在角色名字旁边
"value": "character talk", // 说话的内容,显示在对话框
"background": "image/background/background.png", // 画面背景,没有则沿用上一节点的(测试中)
"voice": "sounds/vocals/voice.ogg", // 配音(开发中)
"sound": "sounds/effects/sound.ogg", // 音效(开发中)
"character_illustration": "image/char/character.png", // 留空则无(开发中)
"facial_differential": "image/diff/character_name.feel.png" // 角色面部差分,留空则沿用上一个,如果没有则使用默认差分(开发中)
},
// 分支节点示例
{
"node": 1,
"type": "branch",
"choice": [
{
"ordinal": 0, // 选项ID,从0开始,与Array索引对应
"value": "Choice1", // 选项文本
"branch": [
// 内部放置其他节点,相当于开了第二个顶层Array
]
},
{
"ordinal": 1,
"value": "Choice2",
"branch": [
]
}
]
},
]注意,以上所有涉及路径的字段都使用相对路径(相对于包的根目录)
目录结构: 建议的目录结构应该为:
.
├─config.json # 配置文件
├─cover.png # 封面
├─LICENSE.txt # 许可证
├─image
│ ├─background # 背景图
│ ├─char # 角色立绘
│ └─diff # 面部差分
├─plot
│ └─index.json # 入口JSON文件
└─sounds
├─effects # 音效
├─music # 音乐
└─vocals # 配音目前仅开放了对于页面背景的自定义,后续可能会开放如UI等的自定义
页面背景:
当前的页面背景是使用Stable Diffusion生成的,你可以选择自己喜欢的图画替换掉它;
你应该在Application.persistentDataPath下操作这些内容,这个目录的位置视情况而定,如在Windows下直接编译好的这个游戏的这个目录就应该在C:\Users\Your_name\AppData\LocalLow\MillenTec\GalEngine;
你可以新建一个UI文件夹,并在其下建立pageBackground子目录,其中应该包含config.json以及你的背景图片
{
"image": "background.png" // 背景图的相对路径
}- Unity: Unity 2022.3.62f1c1 LTS
- IDE: JetBrains Rider 2025.3.1 非商业用途授权
- .NET框架: .NETFramework v4.7.1
- 语言版本: C# 9.0
- 操作系统: Windows 11 Pro 25H2
- UI设计: Adobe Illustrator 2024
- 克隆仓库
git clone https://github.com/MillenTec/GalEngine.git- 在Unity Hub使用对应版本的Unity Engine打开文件夹
- 点击播放以在Unity编辑器内运行
- 或者点击
文件->生成设置->选择目标平台->生成->选择目录以构建为.exe可执行文件
Newtonsoft.Json:
- LICENSE: MIT LICENSE
- GitHub: https://github.com/JamesNK/Newtonsoft.Json
HarmonyOS Sans:
你好,我是来自中国的MillenTec,一个还在学习中的C#新手,一个二次元技术宅; 你可以叫我“Millen”或者“米伦”,不过当然这不是我的真实名字
联系我:
- GitHub: MillenTec
- bilibili: MillenTec
- Email: MillenTec@outlook.com
- 社区: Microsoft Teams