Unity 室內設計教學 - 貼圖轉換效果

 

波紋效果 ForceFieldEffects

1. 開啟 [ SineVFX > ForceFieldEffects > Prefabs > CompleteEffects ] 資料夾 …

將 ForceFieldBasic01 預製物件拖曳到 Hierarchy 視窗,重新命名為 Effect …

使用 Unpack 斷開與原始預製物件的連結,再將 ForceFieldMeshes 子物件刪除 …

將複製出來的 Apartment_Effect 模型拖曳到 Effect 物件下成為子物件 …

再將 ControlParticles 拖曳到 Apartment_Effect 底下成為子物件。

 

2. 選取 Effect 物件並使用 Inspector 的 ForceFieldController (Script) 設定,點擊 Material Layers 下的 ForceFieldDistortion01 材質球將直接開啟材質球的位置,在 Project 視窗中將ForceFieldDistortion01 複製出一個並重新命名為 floor_Effect,修改渲染方式為 SineVFX / ForceFieldAndShieldEffects / ForceFieldBasicTriplanarMultipleLWRP。

3. 再次選取 Effect 物件並看到 Inspector 屬性編輯器下的 ForceFieldController (Script),將修改好的 floor_Effect 拖曳到 Material Layers 下的 Element 1 欄位中,將 Apartment_Effect 物件拖曳到 Get Renderers In Children 欄位中。

4. 將 Apartment_Effect 下的 天花板、牆壁、地板命名為適當的名稱並修改標籤為對應的 WallEffect、floorEffect、CeilingEffect ,再加上 Mash Collider 網格碰撞器。

5. 將各 Effect 用模型的 Mesh Renderer 關閉,並修改底下的 Materials 數量改為 0,完成模型的設置。

6.建立 ControlParticlesSpawner.cs 腳本,程式碼如下:

7. 將此腳本套用到 Apartment_Effect 下的子物件(例如:Wall_Living_Effect 物件,注意 ControlParticles 不需要套用),接著將 Apartment_Effect 下的 ControlParticles 粒子物件拖曳到 ControlParticlesSpawner (Script) 元件下的 Cps 欄位中,最後再將 Bullet Tag 欄位中輸入 SineBullet,再將設置好的 ControlParticlesSpawner 複製並貼上到其他模型物件上。

8. 建立 EffectMeshOff.cs 腳本,程式碼如下:

 

9. 將此腳本套用到 Apartment_Effect 下的 模型物件上即可完成(注意 ControlParticles 不需要套用)。

 

製作 VR 材質球

建立組合

1. 開啟 [ HurricaneVR > TechDemo > Scenes ] 資料夾的 scene_examples 場景,將 SocketExamples 物件展開 SocketExamples > table (1) 將 Small Sockets 物件 CTRL+C 複製並回到自己的場景後按下 CTRL+V 貼上。

2. 展開 Small Sockets 並將 Small Sockets 下不需要的 Readme 與 GameObject 刪除,可將父物件重新命名為 BallSpawnerCreator_Ceiling ( 設置給天花板用的組合 ) 將子物件也重新命名為 BallSpawner ( 生成樣式球用 ),並依需求設置數量與排列(這裡以一行三列示範)。

3. 將調整完成的 BallSpawnerCreator_Ceiling 複製兩個並各自命名為 BallSpawnerCreator_Wall (牆壁用) 與 BallSpawnerCreator_Floor (地板用),完成。

建立樣式球

1. 建立一個 Sphere 並重新命名為 Ceiling_Materials_1 (這裡先以天花板材質球為例),並套用上適當的材質球(例如:apartment_ceiling01_1),可將材質球複製一個病重新命名為 VR ceiling 01 作為替換用。

2.建立 MaterialBall.cs 腳本,程式碼如下:

 

3. 將此腳本套用到 Ceiling_Materials_1 物件,接著將 MaterialBall (Script) 下的 Tag Name 欄位輸入 Ceiling;Effetc Tag Name 欄位輸入 CeilingEffetc(此為天花板用),Ceiling_Materials_1 物件的標籤修改為 SineBullet。

4. 在 Ceiling_Materials_1 物件上加上 HVR Grabbable (Script) 與 HVR Tag Socketable (Script) 腳本元件,接著看到 HVR Tag Socketable (Script) 腳本元件下的 Tags 欄位點選並選擇 HVR Example Socketables,最後點開在下方的下拉選單並勾選 Small Item 即可。

5. 將 Ceiling_Materials_1 複製出兩個並重新命名為 Wall_Materials_1 與 Floor_Materials_1,再將物件各自的 MaterialBall (Script) 下的 標籤名稱修改為以下名稱:

Wall_Materials_1,Tag Name 欄位輸入 Wall;Effetc Tag Name 欄位輸入 WallEffect。

Floor_Materials_1,Tag Name 欄位輸入 floor;Effetc Tag Name 欄位輸入 floorEffect。

基礎樣式球完成。

 

6. 後續新增樣式球只需要將 Material 材質套用到三種類型的樣式球上並設置為獨立的預製物件即可。

 

材質球組合

1. 將樣式球依照需求建立出數個預製物件,這裡建立3個為範例,將 BallSpawnerCreator_Ceiling 組合展開並點選 BallSpawner 子物件,接著看到 Inspector 屬性編輯器下 HVRSocket (Script) 的 Aoto Spawn Prefab 欄位,並將 Ceiling_Materials_1 預製物件拖曳到此欄位中,完成。

2. 依照上述方式將預製的樣式球各自放入生成欄位即可完成。


玩家設定

1 .新增空物件並命名為 HVRGlobal 接著再套用 HVR Manager、HVR Input Manager、HVR Dont Destroy 三個腳本元件。

接著看到 HVR Input Manager (Script) 下的 Oculus - Requires Oculus Asset + Integration 下的 Force OVR Input Update 勾選。

 

2. 將對應的設定檔套用到對應的欄位中。如下圖:

3.開啟資料夾 [ Assets > HurricaneVR > Framework > Integrations > Oculus > Prefabs ] 將 Oculus XRRig Variant 玩家預製物件拖曳到 Hierarchy 視窗中。

4.將 Oculus XRRig Variant 展開並點選 PlayerController 子物件,接著在 Inspector 看到 HVR Player Controller (Script) 下的 Can Crouch 並取消勾選。

5.建立 HandObjectManager.cs 腳本,程式碼如下:★

using HurricaneVR.Framework.ControllerInput;

public HVRPlayerInputs hVR_Player;
public GameObject rightHand,leftHandUIPos,UIObject,UIObject2,UIObject3;

void Update()
{
rightHand.GetComponent<SphereCollider>().enabled = rightIndex();

if (leftFist() && OVRInput.Get(OVRInput.Button.Three)&&!OVRInput.Get(OVRInput.Button.Four))
{
UIObject.transform.position = leftHandUIPos.transform.position;
}
else UIObject.transform.position = new Vector3(0, -1, 0);

if (leftFist() && OVRInput.Get(OVRInput.Button.Four)&&!OVRInput.Get(OVRInput.Button.Three))
{
UIObject2.transform.position = leftHandUIPos.transform.position;
}
else UIObject2.transform.position = new Vector3(0, -1, 0);

if (leftFist() && OVRInput.Get(OVRInput.Button.Four)&& OVRInput.Get(OVRInput.Button.Three))
{
UIObject3.transform.position = leftHandUIPos.transform.position;
}
else UIObject3.transform.position = new Vector3(0, -1, 0);
}

bool rightIndex()
{
if(hVR_Player.IsRightGripHoldActive && !hVR_Player.IsRightTriggerHoldActive)
{
return true;
}
return false;
}
bool leftFist()
{
if (hVR_Player.IsLeftGripHoldActive && hVR_Player.IsLeftTriggerHoldActive)
{
return true;
}
return false;
}

6. 將此腳本套用到 PlayerController 物件,並將 PlayerController 物件再拖曳到 Hand Object Manager (Script) 元件下的 HVR_Player 欄位中,接著將 Oculus XRRig Variant 底下的 RightHand 子物件拖曳到 Hand Object Manager (Script) 元件下的 Right Hand 欄位中。

7. 選取 RightHand 物件並在物件上新增一個 Sphere Collider 並調整位置與大小 (位置約 X : 0.03 , Y : 0 , Z : 0.1,大小約 0.01),再將 Is Tirgger 勾選,碰觸區設置完成。

使用 Inspector 的 Tag 下拉選單展開並點選 Add Tag 新增一個 Hand 標籤,將 RightHand 物件的標籤修改為 Hand。★

 

8. 點選 LeftHand 物件並在底下新增一個空物件並命名為 UIPos 作為樣式球組合呼叫時的吸附點,調整到適當的位置 ( 約為 X : 0.2 ,Y : 0 ,Z : 0 ) ,接著點選 PlayerController 物件並看到 Hand Object Manager (Script) 底下的 Left Hand UI Pos 欄位並將 UIPos 物件拖曳到欄位中。

9. 看到 Hand Object Manager (Script) 底下的 UI Object、UI Object 2、UI Object 3 欄位,並將先前製作好的 BallSpawnerCreator_Ceiling、BallSpawnerCreator_Wall、BallSpawnerCreator_Floor 三個組合拖曳到欄位中。如下圖:

 

電視開關設定

設定電視

1.展開 Apartment 物件並將 tv01 與 remote-control03 物件拖曳出來成為獨立物件,接著在 tv01 底下新增一個 Quad 物件並命名為適當名稱,例如:TV Scene。

2. 建立一個新材質球並命名為 TV Scene 並套用給 TV Scene 物件,接著將材質球的 Scene 變更為 Unlit / Texture。

3. 將準備好的 MP4 影片檔拖曳到 TV Scene 物件上並看到 Inspector 下的 Video Player 元件,將 Loop 勾選並將 Render Mode 修改為 Material Override,接著按下 Play 測試畫面是否正常顯示,最後調整位置與大小並將物件預設為關閉即可完成。

設定遙控器

1. 選取 remote-control03 物件並在物件上新增 Rigidbody、Mesh Collider、Sphere Collider、HVR Grabbable(Script) 元件,接著將 Mesh Collider 下的 Convex 勾選;將 Sphere Collider 下的 Is Trigger 勾選並調整 Radius 為 0.2。

注意!物件不可設為 Static 狀態,否則將會無法用手拿取。

2.建立VR_TV_Controller.cs 腳本,程式碼如下:★ ((( TVController.cs )))

public GameObject TV;
public bool Touch;
public bool TvOpen;

void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Hand")
{
Touch = true;
}
}

void Update()
{
if (Touch)
{
if (OVRInput.GetDown(OVRInput.Button.Two))
{
if (!TvOpen)
{
TV.SetActive(true);
}
if (TvOpen)
{
TV.SetActive(false);
}
TvOpen = !TvOpen;
}
}
}

3.將此腳本套用到 remote-control03 物件,並將 TV Scene 物件拖曳到 TV 欄位中,按下 Play 測試拿起遙控器後按下手把的 B 鍵是否能夠正常開關。此階段會發現放開遙控器時按下 B 鍵時依然能夠開啟關閉畫面

4.開啟 HandObjectManager 腳本元件並在 Update 下加入以下程式碼。
if(!rightIndex())
{
FindObjectOfType<VR_TVController>().Touch = false;
}
此為控制放開遙控器時將無法控制 TV 畫面的開啟關閉,按下 Play 測試是否正常,完成。

 

整理基本模型

1. 展開 Apartment 物件將底下的門都拖曳搬出成為獨立物件,可建立 Doors 空物件來放門的物件,以方便管理。

2.開始建立開門/關門的動畫這裡使用 door03 物件來示範後續將依照此製作方式的概念來製作其他種類的門,將 door03 物件 Unpack 段開連結並在 door03 下新增兩個空物件當作門板 (A) 與門把 (B) 的轉軸中心(如果模型的軸向中心正確則不需要此步驟),並將結構調整為如下圖方式。★

 

建立觸發區

1. 開啟 [ HurricaneVR > Framework > Models ] 資料夾,將 SocketOval 物件拖曳到 A 軸物件底下成為子物件並且調整位置與大小,接著新增一個 Box Collider 並調整位置與大小再將 Is Trigger 勾選起來。

2.將 SocketOval 物件複製並移動Z軸到約-0.05,再將Y軸旋轉 180 度,如下圖:

3.將兩個SocketOval 重新命名為 SocketOval_Out (外側) 與 SocketOval_In (裡側),完成。

建立動畫

1. 在選擇 door03 物件的狀態下打開 Animation 視窗並按下 Create 建立動畫檔命名為 door03_Open 並按下存檔。

按下錄製並開始 "拖曳時間軸" 與 "旋轉或開啟關閉物件" 來製作開門動畫。

2. 將製作完成的 door03_Open 複製產生第二個動畫,重新命名為 door03_Open_Idle 與 door03_Close ,接著看到 Inspector 屬性編輯器 (還在選取 door03 物件的狀態下) 在 Controller 欄位開啟 door03 動畫控制器即可打開 Animator 視窗。

3. 將 door03_Open_Idle 與 door03_Close 動畫拖曳到 Animator 視窗並且連結起來,接著將左側分頁切換到 Parameters 新增一個 Play (Trigger) 參數,如下圖所示:


4. 點選各動畫之間連結的線並修改為以下圖示設定,三條連結皆相同。


5. 回到 Animation 視窗並將動畫切換到 door03_Open_Idle 在將第一格以外的動畫影格都刪除,再將時間軸調整到 0:01 然後點擊兩次上方的深灰色影格條即可複製出一格。

切換到 door03_Close 並將影格全選接著將 0:00 格左側的拖曳條拖曳到 6:00 (變成右側) 如下圖:

 

接著再拖曳第一個影格回到 0:00 如下圖:

完成。


建立控制腳本

1. 建立 VR_Animator.cs 腳本,程式碼如下:★


public Animator m_Animator;

void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Hand")
{
m_Animator.SetTrigger("Play");
}
}

2. 將編輯好的 VR_Animator 腳本元件套用到 SocketOval_Out 與 SocketOval_In 物件上並將 door03 物件拖曳到 Animator 欄位中,按下 Play 測試是否正常執行。完成!