前一天我整理了村莊中的建築功能,確認哪些建築可以進入,哪些只是普通村民家。其中,PlayerHouse、ChiefHouse 和 TavernBuildSite 被定義為未來可以進入的建築。Day 16 的目標,就是先從最簡單、最安全的主角家開始,建立第一個室內場景。
這一天沒有一次做完村長家和酒館,因為三個室內場景同時製作會讓工作量太大。主角家是最適合作為第一個室內測試的場景,因為它不需要太複雜的 NPC、劇情或商店功能,只要先完成房間、出生點、出口點和基礎碰撞,就可以作為後面室內場景的範本。
首先,我建立新的 Unity 場景,命名為 PlayerHouseInteriorScene。因為專案使用的是 Universal 2D / URP,所以建立場景時選擇 Lit 2D (URP) 範本,讓室內場景和前面建立的村莊、教學場景保持一致。

建立場景後,我將它儲存在 Assets/Scenes 資料夾中。這個場景之後會作為玩家從村莊中的主角家進入後看到的室內空間。
接著,我先建立室內場景的 Tilemap 分層。雖然後來實作方向有調整,但先建立 Tilemap 結構仍然有意義,因為之後如果要繼續擴充房間、重做牆面或加入更多地板細節,這些分層可以繼續使用。

在 Grid 底下,我建立了三個 Tilemap:FloorTilemap、WallTilemap 和 DecorationTilemap。FloorTilemap 用來放地板,WallTilemap 用來放牆面,DecorationTilemap 則可以放室內裝飾物。這個分層方式和外部村莊場景類似,只是室內場景的規模比較小。
原本我打算使用 Anokolisa 的 Interior_Walls_01.png 和 Interior_Props_01.png 來建立室內 Tile Palette,然後一格一格搭出房間。不過實際測試後發現,這個方法不太適合 Day 16。
問題在於 Interior_Props_01.png 裡有很多家具和道具,它們不是規則排列的 16×16 地圖 Tile,而是完整家具或不規則尺寸物件。如果直接拖進 Tile Palette,Unity 會把它切成很多很碎的小格,畫起來不但麻煩,而且效果也不好。
因此我決定調整做法,不再硬用 Tile Palette 手搭整個房間,而是改用 Tavern_01.png 裡的一間客房作為主角家室內原型。

Tavern_01.png 原本是 Anokolisa 提供的酒館內部參考圖,其中包含客房、走廊、桌椅、床鋪等完整室內配置。雖然它不是專門為主角家設計的素材,但其中的客房區很適合拿來當作主角家的第一版室內原型。
我在 Sprite Editor 中手動框選其中一間客房,而不是用自動切圖。這樣可以保留整個房間的牆面、地板、床、桌子和裝飾物,不會被切成一堆難以整理的小碎片。
切出房間後,我將它拖進 PlayerHouseInteriorScene,並在 Hierarchy 中命名為 PlayerHouseRoom。

這個房間目前是一張完整 Sprite,先作為主角家室內的原型。它的好處是可以快速建立一個看起來完整的室內空間,缺點則是 Unity 不知道牆壁、床、桌子或家具到底哪些地方不能走,所以後面還需要手動補碰撞箱。
接著,我建立了室內場景需要的 Marker。和外部場景一樣,室內場景也需要明確的出生點與出口點,否則之後做場景轉場時會不知道玩家應該出現在哪裡。

我建立了 PlayerHouseMarkers,並在底下放了兩個空物件:Entry_FromVillage 和 Exit_ToVillage。
Entry_FromVillage 代表玩家從村莊進入主角家後,會出現在房間中的位置。Exit_ToVillage 則代表玩家離開主角家、回到村莊的出口點。這兩個 Marker 目前還沒有接上真正的轉場 Trigger,但它們先把位置規劃清楚,之後要接場景切換時就不需要重新找點。
接下來,我將 Player prefab 放進 PlayerHouseInteriorScene 中,測試室內比例是否合理。

放入 Player 後,我先觀察角色和房間大小是否搭配。這裡的 Player 縮放 X/Y 為 2,延續目前外部場景中的比例。測試後看起來可以接受,角色能站在房間內,床、桌子和門的位置也大致合理。
不過當我進入 Play 模式測試時,立刻發現一個很正常但必須處理的問題:PlayerHouseRoom 只是一張圖片,所以玩家可以直接走出房間,也可以走到床、桌子和家具上面。因此下一步就是為室內場景建立碰撞箱。

我建立了 PlayerHouseCollision 空物件,並在底下建立多個碰撞物件,每個物件加上 BoxCollider2D。其中包含牆壁碰撞,例如 WallCollider_Top、WallCollider_Left、WallCollider_Right 和 WallCollider_Bottom,用來限制玩家不要走出房間。
另外,也為家具加入碰撞箱,例如 BedCollider、FurnitureCollider_Table 和 ChairCollider。原本預計加入盆栽碰撞,但實際檢查後發現不需要,因此刪掉沒有用到的碰撞物件。這裡的原則不是把所有東西都加碰撞,而是只針對玩家不該踩上去或穿過去的物件加阻擋。
完成碰撞箱後,我再次進入 Play 模式測試。這次玩家可以在房間內正常移動,但不能穿牆,也不能走到床、桌子和椅子上面。門口位置仍然保留可通行,之後可以接回村莊場景。
這一步測試成功,但因為截圖很難表達「不能穿過去」這種動態效果,所以沒有另外做截圖,只用文字紀錄測試結果。
透過 Day 16 的製作,我完成了第一個室內場景 PlayerHouseInteriorScene。雖然原本嘗試使用 Tile Palette 製作室內,但後來發現素材不適合,於是改用 Tavern_01.png 的客房區作為主角家原型。這個調整讓室內場景能更快成形,也避免把一天時間耗在家具切圖和排列上。
目前主角家室內已經具備基本結構:有房間畫面、有玩家出生點、有出口點,也有牆壁與家具碰撞。下一步可以將它接回 VillageScene,讓玩家真正從村莊進入主角家,再從主角家回到村莊。之後村長家和酒館也可以用類似方式建立,只是內容會更偏向劇情與 NPC 互動。