文章目录
Product Design / Interaction Design / Native Development
iPet 是一个基于开源桌宠 VPet 的 Apple 平台再设计项目。
它最初来自一个很简单的愿望:
如果我想在 Mac 上养一只这样的桌宠,它应该是什么样子?
原版 VPet 建立在 Windows 的桌面环境、交互习惯和技术体系之上。把它带到 macOS,并不只是让程序“能够运行”。
真正的问题是:
当一个属于 Windows 的桌宠进入 Apple 的设备生态后,哪些体验应该被保留,哪些需要重新设计?
因此,我没有把 iPet 看成一次单纯的软件移植,而是把它当成一次关于数字陪伴、桌面空间与跨平台体验转译的设计练习。
01 / 从一个“不存在的 Mac 版本”开始
我喜欢桌宠这种很特殊的软件形态。
它不像普通 App 那样等待用户主动打开。
相反,它长期存在于桌面边缘:
偶尔移动、偶尔说话、偶尔被注意到。
它和用户的关系,更接近一个数字空间中的“小生物”。
这也是我觉得 VPet 有趣的地方。
但原版主要面向 Windows。
于是最初的问题非常直接:
我能不能在 macOS 上拥有同样的体验?
真正开始后,我很快意识到,“做一个 Mac 版”其实包含两个完全不同的目标。
一个是:
让功能存在。
另一个是:
让它像一个 Mac 上本来就应该存在的产品。
我更关心后者。
02 / 桌宠不是一个窗口,而是一种空间关系
普通软件的交互关系通常很清晰:
用户
↓
打开 App
↓
完成任务
↓
关闭 App
但桌宠并不是这样。
它长期停留在:
桌面
工作窗口
浏览器
聊天软件
文件
之间。
因此,第一个需要解决的问题并不是“画一个角色”,而是:
这个角色应该怎样存在于用户的桌面里?
如果它像普通窗口一样:
- 有矩形点击区域
- 抢占键盘焦点
- 遮挡下面的软件
- 每次点击都激活应用
那么它虽然“运行了”,却并不像桌宠。
所以 iPet 最初的设计目标其实只有一句话:
让角色存在,但尽量不打扰。
03 / Presence without interruption
我逐渐把这种体验总结成:
Presence without interruption
有存在感,但不造成打断。
这成为后来很多交互决策的基础。
例如角色虽然视觉上只有一个小动物,但系统里的窗口实际上仍然是一个矩形。
如果直接使用普通窗口:
┌────────────────────┐
│ │
│ Pet │
│ │
└────────────────────┘
整个区域都会挡住鼠标。
最终我选择让交互区域跟随角色本身的透明度:
可见角色
→ 可以点击 / 抚摸 / 拖动
透明区域
→ 鼠标继续操作后面的应用
这样用户可以在角色旁边正常操作网页、Figma 或其他软件。
角色“在那里”,但不会因为自己的存在破坏原本的工作流。
这也是 iPet 中我最喜欢的一类设计:
用户不一定能明确看到设计,但能够感觉到它没有妨碍自己。
04 / 从“窗口”变成“角色”
第二个问题是:
用户到底是在拖动一个窗口,还是在抓住一个角色?
这两者的感受完全不同。
如果按照传统桌面软件的逻辑,拖动对象应该是窗口标题栏。
但桌宠没有标题栏。
因此交互对象必须从:
Window
转变成:
Character
我逐渐建立了一套更接近“触碰生物”的交互:
轻触
→ 抚摸
长按
→ 捏住
拖动
→ 提起 / 移动
松开
→ 回到桌面行为
角色因此不再只是一个播放动画的 Sprite。
用户是在直接和它的“身体”发生交互。
这其实很接近实体产品设计里的一个问题:
用户操作的是“界面”,还是“物”本身?
在 iPet 中,我希望尽量减少这两者之间的距离。
05 / 不把所有功能都塞进角色
桌宠很容易出现一个问题:
功能越来越多以后,角色周围会不断增加按钮、状态条、菜单和信息。
最后它会从:
陪伴对象
变成:
桌面控制面板。
所以在功能增加的过程中,我开始刻意区分两种体验:
Ambient Interaction
与角色直接相关、低打扰的操作。
例如:
- 抚摸
- 拖动
- 喂食
- 简短对话
- 状态反馈
Focused Interaction
需要用户明确进入操作状态的内容。
例如:
- 商店
- 背包
- 统计
- 设置
- 日程
- 详细活动管理
因此 iPet 最终形成了两个层级:
桌面上的角色
↓
轻量即时互动
功能面板
↓
复杂管理任务
这种分离让我避免把所有 UI 都贴到桌宠旁边。
角色首先还是一个角色。
只有当用户主动需要管理时,它才变成一个完整 App。
06 / 随宠工具栏:介于两者之间
但仅有角色和完整面板,中间仍然缺少一个层级。
例如:
用户只是想:
- 看一下当前状态
- 开始一个活动
- 暂停工作
- 看剩余时间
为了这些操作打开完整功能页又显得过重。
于是后来增加了一个 Pet Toolbar。
它更像一个依附于角色的小型控制器:
角色
│
├ 状态
├ 活动
├ 时间
└ 快捷操作
但这里又出现新的问题:
工具栏本身会不会开始打扰用户?
于是后来增加了自动隐藏机制。
当用户离开一段时间后:
Toolbar
→ fade / hide
鼠标重新回到角色附近:
Pet Hover
→ Toolbar returns
因此界面可以在:
需要时出现,不需要时消失。
这和我希望的桌宠整体体验是一致的。
07 / “活着”的感觉从哪里来?
动画数量并不等于生命感。
如果一个角色拥有几百个动作,但只是随机播放,它仍然很容易让人觉得像一个屏保。
因此我开始思考:
什么让一个数字角色看起来像是在“生活”?
最后我发现真正重要的是三个层次:
① Motion
它会动。
② State
它的行为受到当前状态影响。
③ Continuity
过去发生的事情会影响之后。
于是 iPet 的行为逐渐从简单动画发展成:
饱腹
口渴
体力
心情
健康
好感
↓
当前状态
↓
动作 / 消息 / 活动
↓
新的状态
例如:
它并不是简单播放“吃东西”动画。
而是:
用户选择食物
→ 角色进食
→ 属性变化
→ 产生反馈
→ 保存结果
这时角色才开始产生一种连续性。
08 / 时间成为产品的一部分
桌宠和普通工具软件还有一个非常不同的地方:
它是一个和时间共同存在的产品。
用户不会连续操作它几十分钟。
更多时候是:
工作
↓
偶尔瞥一眼
↓
摸一下
↓
继续工作
因此很多设计问题其实都围绕时间展开:
- 多久自主移动一次?
- 多久说一次话?
- 工具栏多久隐藏?
- 活动怎样显示剩余时间?
- 睡眠期间状态如何变化?
- 用户离开电脑以后发生什么?
这让我第一次非常明确地意识到:
Interaction Design 不只是 Button → Result。
它也包含:
Time → Behavior。
桌宠本身就是一种基于时间的交互媒介。
09 / 把 Windows 体验“翻译”成 macOS
在项目后期,我越来越少问:
原版这个按钮在哪里?
而更多会问:
原版为什么需要这个按钮?
这是整个项目里最重要的变化之一。
例如原版的一些功能依赖:
- Windows 窗口机制
- WPF
- Steam
- 系统托盘
- Windows 特有输入模型
如果只是照搬界面,很容易得到一个:
长得像 Windows 软件的 Mac 应用。
因此我的原则逐渐变成:
保留意图
而不是保留形式
也就是:
Preserve the intent, redesign the interaction.
保留:
- 功能目的
- 行为逻辑
- 角色反馈
- 用户心智模型
但重新思考:
- 界面
- 输入方式
- 页面结构
- 生命周期
- 平台反馈
这也是为什么 iPet 最终并不是一个视觉上一比一复制的 VPet。
10 / iPhone 上,桌宠还应该是桌宠吗?
当 iPet 后来扩展到 iPhone 和 iPad 时,我遇到了一个更明显的问题。
macOS 上可以让角色:
漂浮在桌面
但 iOS 不允许一个 App 的角色一直悬浮在其他 App 上。
如果追求“完全一致”,这个产品甚至没有办法成立。
于是问题变成了:
如果不能拥有“桌面”,桌宠最核心的体验是什么?
我最后保留的是:
陪伴和养成。
而不是:
悬浮窗口。
所以 iOS 版本变成了一种:
In-app Pet
用户进入 App 后和角色互动。
保留:
- 养成状态
- 活动
- 商店
- 背包
- 对话
- 本地进度
重新设计:
- 触摸
- 页面结构
- 导航
- 移动端布局
而 macOS 独有的:
- 桌面漂浮
- 全局拖动
- 鼠标穿透
- 多屏移动
则不强行迁移。
这让我更加确定:
跨平台设计不是让两个平台完全一样。
真正需要统一的是产品核心,而不是所有交互形式。
11 / 从产品到系统
随着项目继续推进,我发现设计工作本身也发生了变化。
最开始我关注:
这个按钮应该在哪里?
这个角色应该怎么动?
后来开始关注:
这个状态应该由谁控制?
两个动画冲突怎么办?
用户隐藏角色后系统应该如何处理?
应用重新打开后应该恢复什么?
什么属于角色状态?
什么属于设备偏好?
问题逐渐从:
Screen Design
进入:
System Design
例如:
字体大小、工具栏自动隐藏属于设备偏好。
而:
金币
等级
库存
心情
属于角色本身。
这两类数据不应该被混在一起。
类似的区分越来越多。
这让我开始意识到:
产品设计不仅是在设计用户看得见的界面,也是在设计系统内部的边界。
12 / AI 成为了项目中的一种设计工具
iPet 还有一个对我很特别的部分:
它是我第一次真正长期使用 AI 参与完整项目。
AI 并不是单独替我“生成一个 App”。
我的工作方式更接近:
观察
↓
提出问题
↓
定义目标
↓
拆分阶段
↓
让 AI 分析与实现
↓
真实体验
↓
发现问题
↓
重新设计
例如某个功能:
活动菜单
第一版在逻辑上可能是成立的。
但真正放到桌面上使用以后,我会发现:
- 层级太深
- 展开方式不自然
- 与角色关系太弱
于是再重新调整。
因此 AI 更像是一个非常快速的:
engineering collaborator
而我仍然需要不断完成:
判断
选择
体验
取舍
这个过程也让我重新理解了设计师在 AI 工具中的位置:
AI 可以极大缩短“从想法到可运行原型”的距离,但它不会替代设计决策本身。
13 / 设计结果
现在的 iPet 已经形成了一个相对完整的 Apple 平台桌宠体验。
macOS
一个存在于桌面的数字角色:
- 透明背景
- 按角色轮廓交互
- 抚摸与拖动
- 自主行动
- 状态反馈
- 对话
- 工作 / 学习 / 娱乐
- 商店与背包
- 随宠工具栏
- 完整管理界面
iPhone / iPad
一个以养成体验为核心的移动端版本:
- 固定角色
- 触摸互动
- 活动
- 商店
- 背包
- 设置
- 独立本地进度
两个平台共享同一个产品核心,但拥有不同的交互方式。
14 / 我从 iPet 得到的东西
iPet 最初只是一次:
“我想让这个桌宠出现在我的 Mac 上。”
但最后它变成了我第一次真正经历的完整数字产品设计过程。
我开始接触:
Product Thinking
Interaction Design
System Design
Platform Design
State Design
Motion
Software Architecture
Testing
Open-source Collaboration
AI-assisted Development
更重要的是,我逐渐开始理解:
设计并不只发生在 Figma 里。
一个角色是否抢占焦点,
一个按钮什么时候应该出现,
应用关闭以后什么应该保留,
iPhone 和 Mac 是否真的应该拥有相同界面,
这些其实全部都是设计。
Reflection
如果让我重新定义 iPet,我不会把它称为:
“VPet 的 Mac 移植版”。
我更愿意把它描述成:
一次将 Windows 桌宠重新翻译到 Apple 生态中的体验设计实验。
我做的并不是把一个软件从一个系统搬到另一个系统。
而是在不断回答:
一个数字角色,应该怎样自然地生活在用户的设备里?
iPet
Digital Companion for Apple Platforms
Role
Product Design
Interaction Design
System Design
Development
Platform
macOS · iOS · iPadOS
Based on
VPet by LorisYounger