本系列上一篇已經講到如何做出環景的幾個方法,那經常會看到類似GoogleMap的街景導覽移動又是怎麼達成的呢?現在就來看看吧。
環景球集合
首先,我們使用了前一篇(UNITY VR應用(一){360°環景製作-CardboardGVR}),最後提到的做法製作數個要切換的場景,球型3D物件+Cubemap的材質球。
GVR準心&互動
接下來,找到GVR套件提供的準心GvrReticlePointer預制物件,並放入攝影機中,這樣我們的畫面上就有一個可供瞄準的參考。(而且該物件的材質球上可以調整顏色)
以及,場景上放置GVR專屬的事件偵測預制物件GvrEventSystem,配合GvrPointerPhysicsRaycaster使用,同時在球型背景上想產生互動的位置放上一個3DObject(必須擁有碰撞器),掛上EventTrigger就能產生觸碰反應。
按下PLAY執行後把準心放到球上,應該會看到準心放大成圓圈狀態,這樣我們的觸發條件就已經達成了
流程控制
創建一個ViewSystem.cs腳本於攝影機上,內容如下
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ViewSystem : MonoBehaviour { public List<GameObject> room;//裝載環景球的清單 private GameObject tmpObj,targetObj;//暫存的環景球,目標的環景球 float exposure = 1f;//材質球上淡入淡出用數值 void Start () { tmpObj = room[0];//預設啟動的環景指定 } // Update is called once per frame void Update () { } public void ChangView(int I) {//可以帶入索引號碼的功能 targetObj = room[I];//指定目標環景球 targetObj.SetActive(true);//打開目標 exposure = 1f;//初始化顯示數值 InvokeRepeating("Run", 0f, 0.01f);//每隔0.01秒平滑執行Run方法 } void Run() { exposure -= Time.deltaTime*3f;//隨時間遞減當前顯示的數值(漸漸轉黑) tmpObj.GetComponent<MeshRenderer>().material.SetFloat("_Exposure", exposure);//將數值設到材質球上 targetObj.GetComponent<MeshRenderer>().material.SetFloat("_Exposure", 1f - exposure);//反向設定到目標材質上(顯示交換) if (exposure < 0f)//當值歸0實執行完成的動作 { exposure = 0; tmpObj.SetActive(false);//關閉來源還景球 tmpObj = targetObj;//目標球置換暫存球 CancelInvoke("Run");//清除反覆執行程序 } } }
設定2個Room清單,並將它們裝入對應位置,並且關閉第一個場景以外的Room
在預計當作開關的兩個物件(Cube、Sphere)裝上EventTrigger,並設定PointerEnter事件執行上面寫的腳本中的ChangView(int I)功能,帶入要去的對象在清單中的序列號。