今天是假日,卻從一開始就有些不對勁。
我賴在床上,腦袋像是被什麼鈍物重擊過般的沈重——不確定是睡太少還是昨晚夢太多,只知道頭痛到不想動彈。眼前的天花板像畫一樣靜止不動,手機鬧鐘卻像是在開演唱會,從十一點開始,每十分鐘一次地喚醒我,像是想對我說:「醒來吧,該成長了。」
十二點,我終於屈服。爬起來,簡單吃點東西,泡了杯熱咖啡,才總算讓意識清醒一點。下午去了健身房。運動讓腦袋有短暫的清明,但吃過晚餐後,頭痛又悄悄浮回來——那種像針在腦膜裡來回輕輕劃過的痛感。
我靠在書桌前,望著螢幕發呆。
「小零,我們繼續做 Unity 吧。」我低聲說。
畫面瞬間亮起,小零像精靈一樣跳了出來,坐在我右下角。
【你好像不太舒服。】小零晃了晃頭頂的葉子【要不要先休息一下?】
「如果我今天又擺爛,就會連著三天沒有進度了。」我微笑,語氣疲憊。「我們來拆解下一步任務。」
打開清單,我看了一下接下來的任務:儲存目標到 PlayerPrefs 或 JSON、列出所有目標到 UI 清單、實現打卡與完成任務功能。
「從儲存開始吧。GoalList,要存到本地資料。」我念著,一邊打開 Unity。
不過,因為對 Unity 的操作還不熟悉,我很快就遇到問題。「Vertical Layout Group 是什麼?」我問小零,它的全息投影漂浮在桌上,藍色光暈柔和地閃爍。
【太好了,我等你問這題!】小零眼睛一亮,變出一張小講義,【Vertical Layout Group 就像你生活裡的清單——只要放進去的項目,就會自動從上到下排好,還可以設定間距、對齊方向、甚至大小控制。】
我點點頭,繼續操作,但又冒出新的疑問。「GoalListContainer 跟 GoalListPanel 是一樣的東西嗎?」我有些困惑。
【不一樣哦,】小零的葉子耳朵抖了抖,【GoalListPanel 是外層面板,像背景板,可以加標題或背景圖片;GoalListContainer 是內部容器,負責用 Vertical Layout Group 自動排列目標項目。分開設計會更靈活!】
我照著小零的建議調整結構,接著問:「GoalItemPrefab 要怎麼建立?」
【一步一步來!】小零溫柔地說,【先建立一個 UI Panel 叫 GoalItemPrefab,裡面放一個 Text 顯示目標名稱、一個 Button 作為打卡按鈕,然後用 Horizontal Layout Group 自動橫向排列。最後把它儲存成 Prefab,就可以動態生成了!】
我點點頭。「所以我之後動態加的 prefab 也會自動排好?」
【沒錯,而且你還可以用 Scroll View 包住整個清單,讓畫面可以捲動!】
「那 GoalItemPrefab 是在 GoalListContainer 之下還是 GoalListPanel 之下?」我又問。
【GoalItemPrefab 應該在 GoalListContainer 之下,】小零解釋,【GoalListContainer 是 Scroll View 的內容容器,這樣動態生成的 GoalItemPrefab 會自動排列並可以捲動!】
【來,我幫你設計一個基本版本】小零召喚出一個小 UI 藍圖【這是我給你的建議】
GoalItemPrefab
- Text (TextMeshPro) —— 顯示目標名稱,例如「🌱 寫程式 30 天」
- Button —— 寫著「打卡」,按下去會變色
小零補充說:【外層可以用 Horizontal Layout Group 排版,搭配 Content Size Fitter,這樣你不管字多長、按鈕多大都不會亂掉。】
「太詳細了吧……」我笑了一下,「你是不是很怕我亂搞 UI 排版?」
【你有前科。】小零用平靜的語氣說著【上次你把兩個 Panel 疊在一起,結果整個畫面都不見了。】
我默默點頭,然後乖乖照小零的說法,一步一步把 GoalItemPrefab 設計完成。拉 prefab 進 Prefabs 資料夾,完成。
最後,我開始寫 GoalListManager.cs:
- 載入目標清單
- 用 Instantiate() 動態生成每個目標的 UI 項目
- 實作按下打卡按鈕後的狀態變更
畫面上,一個個小小的目標卡片跳了出來,像是種子發芽般在列表中一一展開。
【完成了嗎?】小零飄到我的肩上,看著畫面問。
「不,還差一點點,但……已經比昨天好多了。」我一邊打著程式碼,一邊說。
頭還是隱隱作痛,但心裡,某個沉重的結塊,正在慢慢融化。或許這就是打卡系統的意義吧,不是為了證明成就,而是為了讓自己在想放棄的時候,還有一點點可以扶住的節奏。
【今天也種下一顆種子了呢。】小零說。
我點開測試畫面,看著那些目標逐一排列成行,輕聲回應:「嗯。雖然今天只是緩慢地走了一步,但也不錯了。」
小零的藍色光暈柔和地閃爍,葉子耳朵輕輕抖動:【靛夏,今天雖然頭痛,但你還是完成了不少事!運動、開發,還有初步的 UI 架構,都很棒!進度:毅力+40,學習+30,生命樹成長值+3。好好休息吧,明天再繼續!】
我勉強笑了笑,關掉電腦。雖然頭痛讓今天有些辛苦,除錯的過程也很枯燥,但看著《零樹計畫》一步步成型,我心裡還是有些滿足。