摘 要: Unity3d是一種基于開源.net即Mono.net的組件化的游戲引擎,它能夠實現一次開發,跨平臺發布的效果,其內置的API函數與開發工具Visual Studio結合能夠高效地開發出游戲、視景仿真系統。以中北大學虛擬校園開發為例,在此研究了如何利用Unity3D引擎實現場景實時驅動、用戶界面、多媒體信息與模型交互、一鍵部署桌面、網絡功能。發布后達到了足不出戶即可通過單機、網絡流暢游覽校園的目的。系統具有良好的運行效果、維護方法,說明了Unity3D引擎對構建三維校園及進行相關視景仿真方向的研究具有實用與參考價值。
關鍵詞: 計算機應用; 多平臺開發; 虛擬校園漫游; 游戲引擎
中圖分類號: TN964?34 文獻標識碼: A 文章編號: 1004?373X(2013)04?0019?04
0 引 言
虛擬現實技術是當今計算機科學研究的一個熱點,將虛擬現實技術引入“數字校園”的研究中,為校園宣傳和游覽提供一種全新的手段。如文獻[1]中的VRML虛擬校園漫游,文獻[2]中的基于Virtools的虛擬校園,文獻[3]中的山東農業大學三維校園虛擬漫游系統,以及文獻[4?7]的虛擬校園系統。中北大學總面積3 000 多畝,面積較大,目前仍在建設之中。虛擬校園的建設,有利于校園形象的展示,并對校園的進一步建設和遠景規劃提供逼真的可視化平臺。
Unity3D是新推出的一款針對游戲開發、視景仿真、多平臺開發需求用戶的三維引擎,它基于開源的.net即Mono.net,能夠真正實現一次開發、跨平臺發布的功能。它內置的游戲元素、腳本語言、豐富的類庫、物理引擎能夠幫助開發者快速構建自己的游戲、視景仿真系統[8]。
1 場景實時驅動與用戶界面
Unity3D對當前主流的三維模型格式提供了良好的支持,文章采用3DSMAX進行建模,PS進行紋理處理,相關模型與貼圖技術可參考文獻[9]和文獻[10],在此不再復述。
1.1 模型的導入
模型創建后,利用3DSMAX的導出功能將模型導出成FBX格式,勾選嵌入的媒體,使貼圖能夠一同導出。將FBX文件放入Unity3D工程文件的Assets目錄下,也可以在此目錄自創文件夾,Unity將自動識別,在Project視圖中就可以找到相關的資源文件,包括模型與材質。接下來為該模型創建Prefabs(預置體),所謂預置就是一個游戲對象及其組件的集合,它可以在場景中重復使用。幾個相同的對象可以通過一個單一的預置來創建,叫作實例化。拿樹來舉例,創建一個樹的預置就可以實例化幾個相同的樹木將它們放置到場景里,由于這些樹都是和預置聯系在一起的,在預置上所做的任何更改將自動應用于所有的樹。
1.2 場景的實時驅動
1.2.1 實時顯示
在3DSMAX中,需要通過渲染才能產生想要的畫面,而在Unity引擎中,它內置了渲染引擎,生成具有LOD層次細節的畫面,優化顯示效果,能夠構建一個所見即所得的開發環境。只需要在場景中放置攝像機和燈光,就可以在游戲視圖中正確地將場景顯示出來,也不需要對物體進行烘焙,如圖1所示。
1.2.2 場景漫游
在Unity3D引擎中內置了第一人稱角色控制器,能夠模擬第一人稱在場景中進行漫游,只需要把控制器的預置體拖放至場景中高于地面的位置就能實現第一人稱的效果,但是這種方法不能實現任意視角的效果,只能模擬地面步行。在此通過檢測輸入來控制攝像機的方式驅動場景,實現任意視角的場景漫游。這里采用Unity3D與Visual Studio 2010結合的方式進行開發,實現場景驅動。通過Edit→Preferences→External Tools→External Script Editor選擇Visual Studio 2010即可完成Unity與Visual Studio的同步,在Visual Studio中自動添加UnityEngine和UnityEditor兩個DLL。接下來就可以使用C#語言調用Unity的API函數進行開發了。在場景驅動中應用API函數中的Input類來檢測鍵盤或者鼠標輸入,通過Transform類來控制攝像機移動。相關核心代碼如下:
//檢測輸入W鍵
if(Input.GetKey(KeyCode.W))
//向前平移物體transform.Translate(Vector3.forward*Time.deltaTime*2);
else if(Input.GetKey(KeyCode.S))
transform.Translate(Vector3.forward*Time.deltaTime*?2);
else if(Input.GetKey(KeyCode.A))
transform.Rotate(Vector3.up*Time.deltaTime*?10);
else if(Input.GetKey(KeyCode.D))
transform.Rotate(Vector3.up*Time.deltaTime*10);
把寫好的代碼存放在Assets文件夾內然后拖放給攝像機就可以實現場景驅動了。
1.2.3 碰撞檢測
在場景驅動中需要注意的就是碰撞檢測,不管是行走模式還是自由視角模式,都必須設置物體的物理屬性以致不會“穿墻而過”,在這里給每個物體都添加能夠執行碰撞檢測的組件,Component?Physics?Mesh Collider,這樣他們就具有了碰撞檢測的功能又不至于影響性能。需要注意的是復雜的物體比如飛車,直接添加組件的話會因為網格太多影響執行效率,這里給它添加一個不可渲染的長方體父物體,再給父物體添加組件。
1.3 用戶界面
用戶圖形界面事關軟件的友好度,是用戶直接接觸到的部分。在Unity3D里,這種界面被稱作GUI,GUI的編寫也是采用腳本的方式,通過VS調用API函數進行編寫,編寫完成后將代碼拖放給攝像機對象。Unity3D提供了界面設計的高級控件,如Label,Button,TextField,ToolBar等,它們都包含在GUI這個類里,系統提供了控件的默認效果,也可以通過GUI Skin自定義風格。中北大學虛擬校園系統的主界面如圖2所示。
主界面運用C#編寫,包含一張校園三維鳥瞰圖、各個功能模塊菜單,點擊鳥瞰圖中的標注文字能夠進入相關場景,點擊功能模塊菜單能夠進入相關模塊。主界面核心代碼如下:
Texture2D MainPic; //定義一張二維鳥瞰圖
GUISkin MenuGUIskins; //自定義皮膚
Void OnGUI () {
GUI.skin=MenuGUIskins; //應用自定義皮膚
//畫出自定義皮膚
GUI.DrawTexture(new Rect(0,0,1280,800),MainPic);
//點擊自動模式的文字時
if(GUI.Button(new Rect(252,774,79,26),\"\",\"btn_zidong\"))
Application.LoadLevel(2); } //跳轉至場景2
2 多媒體信息與交互實現
虛擬校園中,多媒體信息如圖片、音頻、視頻能夠產生單純的三維模型所不能提供的效果,而交互則是模擬現實世界的運動規律為使用者提供良好的用戶體驗。Unity3D作為一款游戲引擎,其全腳本式的開發能夠使開發者創造各種想要的交互效果。
2.1 添加音頻與視頻
在Unity3D里,音頻是一個游戲組件,因此需要將其綁定在游戲中才能發揮作用。添加音頻組件的方法如下,首先在Unity菜單欄中選擇GameObject→CreateEmpty菜單項,創建一個空游戲對象,然后在Hierarchy視圖中選擇該對象,接著在導航菜單欄中選擇Component→Audio→Audio Source菜單項,此時音頻組件將被綁定在該對象上。接下來需要對Audio Clip進行賦值,把資源文件中的音頻拖放進來就完成了賦值,在系統中就可以通過AudioSource中的Play,Stop,Pause等方法控制音頻的播放。
視頻元素能夠豐富游戲、視景仿真系統的效果,一般情況下,可以選擇精彩視頻作為三維游戲的開場動畫,在虛擬校園系統里可以加入視頻作為了解校園的一種實景形式,Unity支持的視頻格式種類包括.mov,.mpg,.mpeg,.mp4,.avi和.asf。視頻元素和音頻一樣,需要綁定至某個游戲對象才能產生作用,視頻一般以平面的形式展現,所以可以在游戲場景中創建一個“Plane”對象,然后通過編寫腳本的方式控制視頻播放,在腳本中主要用到MovieTexture類。
2.2 鏈接交互的實現
鏈接交互主要包括2種情況,在單機系統中,點擊界面或者游戲對象進入一個新的場景,網絡系統與單機系統實現鏈接的方式一樣,因為網絡帶寬的限制,不能把場景建的很大,需要分割成不同的文件,通過Application.OpenURL( )方法實現打開一個新的網頁,實現場景的跳轉。這里主要介紹單機系統中鏈接交互的實現。
2.2.1 通過點擊物體實現鏈接交互
這里的物體包括界面元素和場景中模型實體,界面實現鏈接主要通過GUI實現,在第1.3節已經進行了介紹,通過點擊個性化的按鈕進入一個新的場景。模型實體的鏈接交互通過檢測鼠標點擊事件進行。創建一個新的腳本,或者在已經存在的腳本中添加OnMouseDown()事件,在該事件中編寫相應的函數即可實現效果,同樣,完成的腳本需要拖放給場景中的游戲對象。如行走至某個建筑物周圍,用戶需要了解更多的關于該建筑物的信息,可以通過點擊該建筑物彈出一個圖片或者一段聲音及視頻文件。如圖3以用戶行走至德懷像為例,只需要點擊德懷像,就能夠彈出一個對話框,可以查看實景照片,視頻介紹。
2.2.2 通過碰撞檢測實現鏈接交互
當第一人稱視角或者攝像機進入相關區域時,產生碰撞檢測,彈出相應的對話框或者鏈接至新的地點,進入一棟樓房等,這里通過OnTriggerEnter()事件實現。可以在場景中創建一個球體或者長方體,將其顯示關閉,勾選Is Trigger,假設第一人稱控制器的名稱為“nuc”,那么在腳本中這樣編寫即可獲得碰撞檢測進入新場景的效果:
void OnTriggerEnter(Collider myTrig)
{if (myTrig.gameObject.name == \"nuc\")
Application.LoadLevel(3);}
2.3 虛擬校園中模型交互的實現
模型交互有很多種,如自動開關門,升旗儀式等,這里以升旗儀式為例。當第一人稱控制器進入國旗臺周圍區域時,執行碰撞檢測,當檢測到是第一人稱控制器時,彈出對話框,用戶可以選擇升旗按鈕,點擊則開始升旗,同時播放國歌。除上述的碰撞檢測外,這里主要還用到國旗的位置檢測,當升到最高點時,停止升旗,國歌播放結束,需要根據國歌播放的時間長度控制整個升旗的時間進程。國旗位置的檢測用到Transform.position屬性,當position到達預定位置后升旗結束,國歌的時間是已知的,國旗需要移動的長度也是可以通過Unity得到,所以使用Tansform.Translate(0,speed* Time.deltaTime,0)來控制國旗移動,國旗具有y軸向上的速度,Time.deltaTime為增量時間,speed* Time.deltaTime表示每秒鐘移動的速度,speed等于距離除以國歌播放的時間,這樣就可以精準地通過腳本控制升旗儀式的進程,如圖4所示為升旗儀式示意。
升旗腳本的核心代碼如下:
Void Update()
{
if(shengqiTansform.position.y<4)
transform.Translate(0,speed*Time.deltaTime,0); }
Update每幀都執行一次,這是最常用的事件函數。
3 多平臺部署與使用
3.1 單機部署與使用
默認情況下點擊Unity的執行文件會彈出一個設置分辨率和渲染質量的對話框,可以在Editor→Project Setting→Player中設置Display Resolution Dialog的值為Disable,這樣就能去掉該對話框,然后需要設置默認分辨率以及在QualitySetting中設置默認渲染質量。當然,還可以設置Icon,選擇一張合適的PNG圖片作為可執行文件的圖標。設置完成后,通過File→Build Settings進行發布,并且把場景按照順序拖放至Current中,以實現鏈接跳轉。最后生成一個EXE格式的可執行文件與一個數據文件夾,文件夾與可執行文件的名稱要保持一致,并且保持目錄一致,不然會無法正常運行。如圖5所示為發布設置與生成的文件。
3.2 網絡部署與使用
網絡發布不需要設置分辨率對話框,它最后生成的是一個網頁文件和一個.unity3D文件,通過服務器上的IIS配置就能輕松實現網絡發布,需要注意的是http頭要改成.unity3D。系統網絡架構為B/S,服務器端將網頁和.unity3D文件配置好后,用戶通過瀏覽器進行訪問。網絡文件與單機文件不同點在于為提高運行速度,減小用戶等待的時間,將場景分割成了多個文件,通過上述的Application.OpenURL()方法實現網頁間的跳轉。
3.3 使用結果
由于本系統采用了多平臺的引擎Unity3D,它的發布運行不需要額外的安裝程序,單機時直接點擊EXE文件即可運行,網頁版的只需要安裝一個大小為約500 KB的控件,其中360安全瀏覽器內置了Unity控件。引擎采用了優秀的文件管理系統,升級修改時候只需要改動文件夾下相應的文件,即可快速修改發布。
經運行得出,該三維校園系統的開發與使用具有以下特點:
(1)開發簡潔高效,能夠通過編程實現對時間,距離,方向等的精準控制,易于熟悉C#編程和具有一定美工基礎的開發人員上手。
(2)交互功能和體驗感強,通過API的GUI高級控件直接實現圖形化的用戶界面,有接近真實的碰撞檢測和圖音并茂的交互系統。
(3)發布迅速運行流暢,由于采用了內部動態加載功能,單機版實現了直接點擊即可流暢運行,無需加載等待時間。網絡版的通過場景分割,大大提高了加載速度。
4 結 語
將虛擬現實技術運用在校園建設中,利用3DS Max創建了中北大學校園的虛擬三維模型。采用虛擬物體和實景拍攝影音結合的手法,借助一種新的三維引擎Unity3D生成三維虛擬校園漫游系統,實現了場景驅動、交互、多媒體信息、多平臺部署功能,使用戶能夠通過單機、網絡運行該系統,在漫游中游覽整個校園的風貌,從反饋信息看,該系統具有良好的用戶體驗。Unity3D引擎可以和高生產力的開發工具Visual Studio2010相結合,內置了可以精準控制時間、距離的函數以及隨機數和數學運算等函數,為相應的數字化與視景仿真領域的開發者提供了一種新的模式。
參考文獻
[1] 馮桂珍,池建斌.VRML虛擬校園漫游與交互技術[J].工程圖學學報,2011(5):40?45.
[2] 任宏萍,周犇.基于Virtools的虛擬校園在線交互設計與實現[J].計算機工程與科學,2011,33(11):117?122.
[3] 原發杰,路立偉,邱健壯.校園三維虛擬漫游系統的建設研究[J].山東農業大學學報:自然科學版,2011,42(4):586?590.
[4] 余莉,王乘.基于虛擬現實技術的數字校園三維仿真系統[J].計算機仿真,2004,21(4):98?101.
[5] 符強.基于VRML的虛擬校園的設計與實現[J].網絡通訊與安全,2007(1):671?672.
[6] 陳阿林,胡朝暉,祈相志.校園虛擬現實三維場景建模技術及實現方法研究[J].重慶師范大學學報:自然科學版,2007,24(4):37?40.
[7] 趙紅領,曹明亮.虛擬校園三維漫游系統中的關鍵技術[J].河南教育學院學報:自然科學版,2006,15(4):27?29.
[8] 宣雨松.Unity3D游戲開發[M].北京:人民郵電出版社,2012.
[9] 陳濤,田海晏.三維校園虛擬現實研究[J].北京石油化工學院學報,2010,18(2):45?49.
[10] 火星時代.Autodesk 3DSMAX 2010標準培訓教材[M].北京:人民郵電出版社,2010.