在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>數值算法/人工智能>

實例分析使用Unity3D開發VR游戲

大小:0.16 MB 人氣: 2017-10-10 需要積分:1
使用Unity3D開發一款VR彈球游戲2016-07-05 17:06
  開發VR游戲首先要選擇一個合適的平臺。目前可供選擇的平臺不多, Google的Cardboard和Oculus Rift等頭戴式顯示設備都是可供選擇的對象。但Cardboard的價格低廉,市場占有率更高,用它來作為移動端進行開發更為劃算一些。當然,選擇其一并不代表我們舍棄了其它開發平臺的優點,同時Unity3D游戲引擎擁有跨平臺的特性,對項目經過簡單的修改便可將VR項目移植到PC或者其他平臺中。
  使用Unity3D開發VR游戲十分便捷:
  首先在于如場景、模型等豐富的素材資源,開發者們無需再為美工建模這些相對耗時間的工作而困擾。
  其次在于便捷的引擎支持,Oculus Rift、Google Cardboard和HTC Vive等產品均提供了對于Unity3D引擎的支持,只需將官方提供的插件包導入到目標項目中,便可使用相應的VR產品了。
  隨著Unity5.3版本的發布,Unity增強了對VR開發的兼容性,在項目設置中我們可以直接選擇使用Oculus或是Open VR進行開發。
  下面就以一款簡單的VR彈球游戲為例子,談談使用Unity3D游戲引擎開發VR游戲的流程。
  先說說VR彈球游戲的規則。和傳統的彈球游戲一樣,在VR彈球游戲中有兩個玩家,一個是用戶,另一個則是AI。玩家分別控制己方的一塊彈球板,當彈球碰到彈球板的時候,球則會反彈回去。如果一方沒有成功反彈彈球的話則該方失敗。
  那么對于這款VR彈球游戲,具體應該怎樣開發呢?
  在確定了開發平臺之后,我們需要在Unity中導入相關的SDK。如選用Oculus Rift則導入Oculus Rift的SDK,選用Google Cardboard則導入Cardboard的SDK。這些SDK的使用方法大同小異,每個SDK中均包含著一個角色控制器,而對角色控制器的使用也近乎相同。我們將相應的SDK導入Unity,隨后將SDK中的角色控制器拖放到游戲場景中,進行測試。在使用Oculus Rift等設備進行調試的時候,往往需要將Oculus Rift配置好,連接電腦才能調試。而Cardboard的調試,可以使用Alt鍵+拖動鼠標來模擬用戶頭部的晃動。
  在正式開發游戲之前,采用一個良好的目錄結構是項目管理的有效方式。這個項目中,在根目錄下有如下的目錄:Model(存放OBJ或是FBX格式的模型)、Texture(存放模型的貼圖,PNG等格式的圖片)、Material(存放通過貼圖制作的Unity中的PBR貼圖)、Prefab(存放Unity預設物體)、Scene(存放游戲的場景文件)。在這種目錄結構下,我們還可以對Model、Texture、Prefab和Material等目錄進行細分,在一些大的項目中擁有大量的模型的時候,通過建立Environment、Building和Player等目錄以細化Model目錄結構,以方便對于模型的尋找,加快開發速度。在對目錄中的文件命名的時候,模型文件以M_模型名稱進行命名,Material以Mat_貼圖名稱進行命名也不失為一種良好的習慣。
  開發游戲的第一步便是搭建場景。在該VR游戲中,我們選用的風格是對程序員友好的像素3D風格。像素3D建模較為簡單,所有的模型都是我們團隊中的程序員制作的。在像素建模的軟件選用方面,我們使用了Magica Voxel這款免費的軟件。Magica Voxel的界面和操作十分簡單,即使沒有基礎,跟著網上的教程半個小時左右就能入門,并做出自己心儀的3D模型。在建模階段完成之后,將模型和材質等資源按照約定的目錄結構導入Unity3D中。
  在搭建場景時,先將FBX或是OBJ格式的模型拖動到Scene(場景)面板中,如果在建模的時候使用的單位和Unity默認單位(米)不同的話,便需要進行相應的縮放。通常如果是場景類的模型如Terrain(地形),我們選擇將模型的Position屬性設為(0,0,0),這樣將會對后面的腳本編寫和場景的搭建工作剩下時間。在簡單地對模型進行拖動之后,得到了如下效果的游戲場景。
  
  此時搭建好的場景是靜態的,無法進行互動,我們需要進行相應腳本的編寫,以實現游戲的可操控性。如下圖所示,我們需要編寫腳本的地方有3個,一個是藍色的擊球平臺,一個是粉色的擊球平臺,一個是藍色的球。
  
  在這里,我們選擇使用簡單的AI來控制粉色的擊球平臺,玩家控制藍色的擊球平臺。從這些物體我們可以引申出以下三個問題:
  如何移動玩家控制一方的擊球平臺;
  如何控制電腦一方的擊球平臺;
  如何對彈球進行反彈。
  首先是如何移動玩家的擊球平臺。要解決這個問題,就需要確定一個輸入方式。在VR游戲中有傳統游戲中的使用手柄、鍵鼠輸入,同時還有HTC Vive和Oculus Rift的動作捕捉。但我們決定使用的輸入方式是Gaze Input(凝視輸入)。凝視輸入的原理是通過在角色控制器的攝像頭射出一條射線,該射線代表玩家的視線,射線碰撞到的位置便是玩家目前凝視的位置。
  在實現方面,需要在場景中新建一個Quad物體,與場景中的地面垂直,其寬度為玩家擊球平臺可以移動的范圍,其高度可以設置為1000甚至更大。最后將該Quad的Mesh Renderer關閉,并調整其位置到玩家的擊球平臺的位置。然后,我們需要對VR中的SDK中的角色控制器進行相應的修改,由于該彈球游戲中采用的是固定視角,因此我們需要刪除SDK中的角色控制器的RigidBody等組件,僅需要能跟隨玩家頭部運動的Camera即可。找到角色控制器中的Camera,在其上添加如下腳本RayCaster.cs:
  float hitPos;
  void FixedUpdate()
  {
  Ray ray = new Ray(transform.position, transform.forward);
  RaycastHit hit;
  if (Physics.Raycast(transform.position, transform.forward, out hit))
  {
  if (hit.collider.gameObject.tag == “Quad”)
  {
  hitPos = hit.point.x;
  }
  }
  }
  public float getHisPos()
  {
  return hitPos;
  }
  在上述腳本中,定義了一個射線和射線投影碰撞。當射線投影碰撞的對象是Quad的平面的時候獲取碰撞點的x坐標(因只需移動彈球平臺的X坐標,所以只獲取碰撞點的X坐標),并保存到hitPos變量中,以便其他腳本調用。
  接著在Hierarchy(階層面板中)找到玩家控制的彈球平臺,在其上編寫腳本playerMovement.cs。
  GameObject mainCamera;
  RayCaster rc;
  float thisX;
  void Start()
  {
  mainCamera = GameObject.FindGameObjectWithTag(“MainCamera”);
  rc = mainCamera.GetComponent《RayCaster》();
  thisX = this.transform.position.x;
  }
  void FixedUpdate()
  {
  this.transform.position=new Vector3(rc.getHisPos()+thisX,this.transform.position.y,this.transform.position.z);
  }
  在上述腳本中,實現了通過獲取MainCamera的RayCaster組件的碰撞點坐標來相應的移動彈球平臺。
  至此,通過視線來控制玩家擊球平臺的功能已經完成。對于電腦控制的擊球平臺,可以通過設定其平臺的移動速度來決定難度,通過預測彈球到達電腦方的位置來決定電腦移動平臺的目標點。在如何反彈彈球的問題上,我們使用Unity3D自帶的物理引擎,在彈球物體上增加RigidBody組件,將RigidBody的Use Gravity選項取消選擇,同時將Drag和Angular Drag設為0和Constraint中的Freeze Position的Y選項勾選上。這樣,在游戲開始的時候,通過給彈球一個力來發球,當彈球碰到場景和擊球平臺的Collider的時候便會進行相應的反彈。至此,上面提出的三個問題解決完畢。
  但以上三個問題都是顯性的問題,解決完這三個問題后便可以對游戲進行簡單的操作,并不能完成真正意義上的游戲。因為在游戲設計中,還有一些對象是隱性的,沒有實際的物體形態。這些對象有 Game Manager(游戲管理器)、 State Machine(狀態機)和 User Interface(用戶界面即UI)等。
  在游戲管理方面,Game Manager下面有如下子Manager:Audio Manager(負責游戲中音效的管理)、Game Status Manager(負責游戲的階段狀態管理)、Score Manager(負責游戲計分的管理)和UI Manager(負責游戲UI的管理)等。以Game Status Manager為例,在不同的游戲階段中,可以進行的動作將會不同。如在游戲開始之前的準備階段和游戲結束階段,彈球平臺和彈球不可以移動。在游戲開始之前的準備階段,需要對彈球和擊球平臺進行復位操作。
  通過Game Manager進行游戲管理來編寫游戲,可以使程序更具有面向對象的特性,對于程序的修改、調試更為直觀和方便,從而減少BUG出現的幾率。
  關于VR游戲中的UI,大部分Unity開發者在Unity4.6之后會傾向于選擇官方的UGUI。在UGUI中,UI的TEXT、Button和Image等組件均是Canvas的子物體時才能正常工作。Canvas的默認渲染模式是以屏幕空間為基準的,然而在VR模式下,左右眼的視角均在一塊屏幕中渲染,由此會造成UI在整塊屏幕上只渲染一次而非分別在左右眼的視角分別渲染。因此,我們需要將Canvas的Render Mode(渲染模式)調整為World Space。這樣,整塊UI畫布便成為了游戲3D世界中的物體,由此可縮放,拖動以放置到游戲中相應的位置。
  

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 四虎免费永久观看| 久久男人精品| 成人亚洲综合| 国产免费的野战视频| 自拍中文字幕| 奇米99| 午夜视频h| 午夜免费影院| 国产va精品免费观看| 天天碰视频| 西西人体大胆高清啪啪欧洲| 一区二区三区电影| 色天使网| 国产欧美久久久精品影院| 久久99操| 乱妇伦小说| 美女一级毛片毛片在线播放| 天天干天天综合| 免费观看做网站爱| 日本黄色视| free欧美| 又黄又免费的网站| 四虎a456tncom| 天天做日日爱| 狠狠色噜噜狠狠狠狠2018| 久久全国免费久久青青小草| 国产资源视频在线观看| 禁h粗大太大好爽好涨受不了了| 久青草国产手机在线观| 久久v| 天堂在线观看视频观看www| 亚洲久久在线| 99久久99久久精品国产| 国产精品久久永久免费| 一区二区视频| 色97色| 小泽玛利亚在线观看123| 男女午夜剧场| 多男一女一级淫片免费播放口| 成人免费国产gav视频在线| 五月天婷婷电影|