版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
基于unity的VR場景交互系統(tǒng)設計摘要網(wǎng)絡社交已經(jīng)是人們?nèi)粘I畋夭豢缮俚囊徊糠?。以騰訊公司開發(fā)騰訊QQ為起始,隨著技術的發(fā)展,VR虛擬社交也開始嶄露頭角。為了國內(nèi)虛擬社交的發(fā)展與革新,開發(fā)了基于unity的VR虛擬社交社區(qū),用于滿足國內(nèi)用戶不斷膨脹的虛擬社交需求。主要使用Unity3d、Mirror框架、C#等技術。本次設計圍繞著Unity3d提供的攝像機、燈光、地形等各種組件,以及物理、網(wǎng)格、圖形等多種引擎,展開對VR虛擬社交社區(qū)基本交互系統(tǒng)的開發(fā)。此項目將針對VR虛擬社交社區(qū)的場景交互系統(tǒng),完成場景、人物、攝像機、網(wǎng)絡等相關模塊與腳本的開發(fā)。關鍵詞:Unity3dMirrorC#虛擬社區(qū)交互系統(tǒng)VR目錄TOC\o"1-3"\h\u19932一、緒論 217817(一)研究背景 222114(二)研究目的與意義 23964(三)國內(nèi)外研究現(xiàn)狀 326493二、可行性研究 317534(一)技術可行性 329088(二)經(jīng)濟可行性 31079(三)操作可行性 42864三、需求分析 421498(一)系統(tǒng)功能需求分析 421159(二)市場需求分析 413550(三)相關技術介紹 430435四、詳細設計 511161(一)項目環(huán)境設計 516101(二)腳本開發(fā) 619755五、局域網(wǎng)聯(lián)機相關調(diào)試 1329832(一)調(diào)試的目的 1318386(二)測試檔案 1329182結論 1518128致謝 1620492參考文獻 16一、緒論(一)研究背景在馬斯洛需求層次理論中,社交需求是連接低級需求與高級需求的橋梁。當人們滿足了基礎的生存需求與安全需求后,就會開始渴求社交需求,進一步步入尊重需求與自我實現(xiàn)需求的高級需求中。顯然連接著低級需求與高級需求的社交需求是必不可少的。俗語有云“男女搭配,干活不累”這就是一種社交需求正面反饋。無論是線上網(wǎng)絡游戲還是線下桌游、以及各種朋友圈、Vlog都是這個時代主流的社交方式。更有Vup、VTUber等借助虛擬形象進行直播的主播。在這個人際關系復雜的時代,借助虛擬形象來滿足社交需求,成為了被越來越多人認可的一種方式。VR這個領域自20世紀開始就擁有這這個概念,而在前兩年又迎來了一波技術革新小高峰,但卻始終不能和現(xiàn)有的職業(yè)領域很好的融合。但我相信在未來的技術迭代過程中,VR一定會脫穎而出,成為新生的技術熱點。而在VR今后的發(fā)展中,成本最低、最容易取得成果的不是游戲,也不是職業(yè)模擬,而是虛擬社交社區(qū)的建設。社交作為人的五大需求之一,相關軟件將會是線上應用輻射規(guī)模最廣的一種,這一點已經(jīng)被不少現(xiàn)如今的龍頭企業(yè)證實過了。(二)研究目的與意義本項目主要開發(fā)的模塊有:場景搭建、多種人物移動腳本、視角跟隨、局域網(wǎng)連接、偽隨機概率梯度算法等。項目完成后可通過客戶端游覽虛擬世界,并使目前漸漸行成趨勢的虛擬人物形象相關產(chǎn)業(yè)提供一個虛擬活動場景。同時也是為了彌補國內(nèi)此種軟件的缺口,滿足人們對虛擬社交畫面、娛樂性、豐富性的需求,而開發(fā)這個項目。(三)國內(nèi)外研究現(xiàn)狀能真正稱得上是VR外置設備的產(chǎn)品,大多都是由外國廠商設計生產(chǎn)的,包括VR所依托的Unity引擎與3dmax等建模軟件也都是外國廠商。不過即使是這樣,其對VR產(chǎn)品的應用也同樣不多。當然軟件的應用是不分國內(nèi)國外的,HTCVIVE的VR外置設備也留有開發(fā)使用的接口和接口說明文檔,結合Unity編輯C#腳本即可。 在國內(nèi)VR領域雖然沒有較為杰出的作品,但在3d游戲與模型等方面,卻有不少優(yōu)秀的廠商?,F(xiàn)在VR所依托的3d建模等相關技術多用于建筑設計、裝修設計等行業(yè)。二、可行性研究(一)技術可行性本項目的開發(fā)需要使用的主要技術手段有:Unity3d、C#、Mirror框架。這些內(nèi)容雖然沒有系統(tǒng)的上過課程,但在課余時間是我一直研究的方向。在學校培養(yǎng)編程邏輯與思想,讓我在接觸C#時也迅速上手。Unity引擎的各種文檔資料在官網(wǎng)都有,并且作為兩大主流引擎之一,Unity開發(fā)的視頻資源也非常豐富。經(jīng)過這幾年的積累,在相關論壇、社交軟件中也有不少前輩能求教。市面上主流的VR設備也都能與SteamVR接口互通。綜上所述,基于Unity的VR交互系統(tǒng)具備技術支持,所以在技術上是可行的。(二)經(jīng)濟可行性從經(jīng)濟角度來看,需要一個配置較高的電腦就可以進行開發(fā)。雖然對電腦配置有一定要求,但從設計功能與系統(tǒng)的角度上來說,對硬件要求不高。如果一味地堆疊素材不僅對硬件要求嚴苛,其中技術的含金量也較低。在功能模塊明確后,項目交互操作開發(fā)為重點,減少不必要的資源消耗。并且我對計算機硬件了解也不少,在校期間自己組裝過臺式機,后續(xù)界面升級,也可自己手動按需升級硬件,提高計算機性能。項目開發(fā)中用到的模型資源,可在Unity3d官網(wǎng)的AssetStore中下載(包括Mirror在內(nèi)的)免費資源。因此項目并不需要大量的資金支持。同樣項目完成后,基于Unity3d便于開發(fā)Mod的性質(zhì),與Steam創(chuàng)意工坊的支持,將開放用戶部分開發(fā)權限,為項目的豐富性提供支持。雖然手中沒有現(xiàn)成的VR設備,但如技術可行性的分析所說,保留VR的接口即可。綜上所述,基于Unity的VR交互系統(tǒng)對經(jīng)濟方面要求不大,所以在經(jīng)濟上是可行的。(三)操作可行性該項目核心內(nèi)容就是設計系統(tǒng)對用戶輸入的指令做出反應,例如場景中的交互提示、移動指令、聯(lián)機房間等。在項目中會開發(fā)核心功能相同,但操控方式不同的腳本。使用者可以選擇自己習慣的操作方式進行操作綜上所述,基于Unity的VR交互系統(tǒng)在操作上是可行的。三、需求分析(一)系統(tǒng)功能需求分析基于Unity的場景交互系統(tǒng)主要設計方向是,能夠完成角色基本操作并對網(wǎng)絡功能進行適配。通過邏輯關系對場景中不同的物體發(fā)送交互指令,針對交互物體性質(zhì)產(chǎn)生不同的交互效果。從開發(fā)者的角度來看,腳本代碼要保證低耦合高內(nèi)聚,提高腳本代碼的泛用性,并保證腳本代碼不會過于零散,做到一個腳本做一件事。以便于用戶創(chuàng)意工坊及Mod的制作。同時也便于自己后續(xù)開發(fā),以及Bug的查找與修改。從用戶的角度來看,系統(tǒng)功能要簡單易于理解,快速上手,切合自身平時使用習慣(如有人習慣搖桿/鼠標翻轉(zhuǎn)),需要提供不同的操作方式,界面簡潔引導清晰。(二)市場需求分析在國內(nèi),以B站為活動中心一般稱虛擬主播為VUP,作為新興的直播模式,粉絲用戶數(shù)激增。甚至近一年來,在B站主辦的《花樣實習生》節(jié)目中,蔡明老師也加入了虛擬主播的行列。在上述所涉及的VTB、VUP,甚至是粉絲中,顯然都是虛擬社交社區(qū)的潛在用戶。(三)相關技術介紹1、編程環(huán)境選擇MicrosoftVisualStudio是微軟公司的開發(fā)工具包系列產(chǎn)品。VS包括了在軟件生命周期中所需要的絕大部分工具,例如UML工具、代碼管控工具、集成開發(fā)環(huán)境(IDE)等等。所寫的目標代碼適用于微軟支持的所有平臺,包括MicrosoftWindows、WindowsMobile、WindowsCE、.NETFramework、.NETCompactFramework和Microsoft
Silverlight
及WindowsPhone。簡單來說VS其實就是一個集合了許多工具的開發(fā)工具集合。在我們的項目中只需要在工具菜單欄中點擊獲取工具,添加Unity開發(fā)包即可。2、C#語言C#是由C和C++衍生出來的一種安全的、穩(wěn)定的、簡單的、優(yōu)雅的面向?qū)ο缶幊陶Z言。它在繼承C和C++強大功能的同時去掉了一些它們的復雜特性(例如沒有宏以及不允許多重繼承)。C#綜合了VB簡單的可視化操作和C++的高運行效率,以其強大的操作能力、優(yōu)雅的語法風格、創(chuàng)新的語言特性和便捷的面向組件編程的支持成為.NET開發(fā)的首選語言。
C#是面向?qū)ο蟮木幊陶Z言。它使得程序員可以快速地編寫各種基于MICROSOFT.NET平臺的應用程序,MICROSOFT.NET提供了一系列的工具和服務來最大程度地開發(fā)利用計算與通訊領域。C#使得C++程序員可以高效的開發(fā)程序,且因可調(diào)用由C/C++編寫的本機原生函數(shù),而絕不損失C/C++原有的強大的功能。因為這種繼承關系,C#與C/C++具有極大的相似性,熟悉類似語言的開發(fā)者可以很快的轉(zhuǎn)向C#。3、引擎Unity
作為兩大引擎之一,是應用非常廣泛的試試內(nèi)容開發(fā)平臺。為建筑工程、裝修設置、影視動畫、游戲開發(fā)等廣泛的領域提供了動畫、物理、粒子、光照系統(tǒng)等強大的工具。借助Unity平臺提供的這些工具,開發(fā)者輕易的獲得包含創(chuàng)作、運營和變現(xiàn)等整個項目流程所需要的東西,進行任何實時互動的2D和3D內(nèi)容,支持平臺包括手機、平板電腦、PC、游戲主機、增強現(xiàn)實和虛擬現(xiàn)實設備?;赨nity開發(fā)的游戲和體驗月均下載量高達30億次,并且其在2019年的安裝量已超過370億次。全平臺(包括PC/主機/移動設備)所有游戲中有超過一半都是使用Unity創(chuàng)作的;在Apple應用商店和GooglePlay上排名最靠前的1000款游戲中,53%都是用Unity創(chuàng)作的。Unity提供易用實時平臺,開發(fā)者可以在平臺上構建各種AR和VR互動體驗。四、詳細設計(一)項目環(huán)境設計本項目使用Unity3d進行創(chuàng)建,使用unity的Terrain(地形)模組、Lighting(光照)模組、camera(攝像機)模組以及導入的各種模型資源進行開發(fā)(1)創(chuàng)建Unity3d項目在UnityHub中選擇個人版免費許可證,創(chuàng)建3D項目。進入項目后在空場景中會自帶全局光照、主相機、天空盒各一個。(2)創(chuàng)建地形在上方菜單欄GameObject中選擇3DObject,添加其中的Terrain組件。為方便建造地形凹陷效果,調(diào)整地形Y軸(高度)坐標為100。在通過Terrain組件衍生周邊地形,擴大地形面積。選擇RaiseorLowerTerrain模式,調(diào)整大筆刷、低強度羽化邊緣的筆刷,按住鼠標左鍵使地形升高,建造地圖大型平緩山坡。選擇中型筆畫在地圖邊緣創(chuàng)建拔高地形的小型山地。再在此模式下按住Shift,使筆刷效果變?yōu)榘枷荩谏降刂行脑O計凹陷做湖泊效果。同時使地圖邊緣不規(guī)則凹陷,創(chuàng)造海島效果。選擇筆刷的PaintTexture模式添加草地、沙地、巖石等各種地形貼圖。分別在相應位置進行低強度覆蓋粉刷,保證漸變效果。最后通過SmoothHeight筆刷,磨平地形高度差,使其過度更加平滑。(3)導入模型在AssetStore中下載免費的房子、環(huán)境、室內(nèi)、人物等模型,拖拽模型預制體進入場景布置。樹木(有碰撞體的植被模型)與草(無碰撞體的植被貼圖)添加到Terrain組件下對應的模塊中,通過筆刷進行批量創(chuàng)建。通過調(diào)整TreeHeight強度,改變樹木模型高度隨機差異。通過調(diào)整TargetStrength調(diào)整草地擺動效果強度。調(diào)整水面模型Transform面板(屬性面板)中的ScaleX值與Z值,使水面模型放大。使其位于地形平面下方,并覆蓋凹陷部分,做出整體的水面效果。(二)腳本開發(fā)在Start()中的語句為:物體啟用時執(zhí)行一次的語句;在Update()中的語句是:每刷新一幀執(zhí)行一次的語句;FixedUpdate()對物理組件操作有優(yōu)化,能有效避免卡墻、卡地、閃回等問題。在涉及移動量的計算上,存在硬件性能區(qū)別,會出現(xiàn):刷新率高的設備每秒的幀數(shù)高,按幀執(zhí)行的語句執(zhí)行次數(shù)高,反之執(zhí)行次數(shù)低;進而導致不同設備(或同一設備在不同場景)的移動速度不同。在移動量的計算公式中,乘上Time.deltaTime,使語句每秒執(zhí)行次數(shù)與系統(tǒng)幀數(shù)(60幀/秒)對應。即可有效回避移動異常的問題。1、人物腳本(1)以世界坐標為基準進行平移:publicfloatmoveSpeed=5f;Vector3moveAmount;Vector3moveDir;Rigidbodyrb;voidStart(){rb=GetComponent<Rigidbody>();}voidUpdate(){moveDir=newVector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical")).normalized; moveAmount=moveDir*moveSpeed*Time.deltaTime;}privatevoidFixedUpdate(){rb.MovePosition(moveDir+this.gameObject.transform.position);}MoveSpeed為速度控制器保留外部控制接口,代碼掛到物體上后可以不改變代碼中的數(shù)據(jù),只改變這個物體上腳本的數(shù)據(jù)。Input.GetAxis("Horizontal")代表讀取鍵盤的A/D鍵輸入,Input.GetAxis("Vertical")代表讀取鍵盤的W/S鍵輸入,分別作文三維坐標系中X與Z的值放入暫存器moveDir。通過速度倍率與執(zhí)行幀數(shù)限制的調(diào)整后,通過與目標坐標值相加移動剛體位置,實現(xiàn)以世界坐標系為參考系的平移。(2)以自身為軸進行前進、后退與旋轉(zhuǎn)floath=Input.GetAxis("Horizontal");floatv=Input.GetAxis("Vertical");transform.Translate(Vector3.forward*v*speed*Time.deltaTime);//WS上下transform.Rotate(0,Input.GetAxis("Horizontal")*Time.deltaTime *RotateSpeed;,0);//AD左右通過transform.Translate改變以自身坐標系方向為基準的前后位置坐標,通過transform.Rotate改變自身坐標系的Y軸角度,實現(xiàn)角色以自身坐標系為參考系的轉(zhuǎn)向與移動。(3)攝像機與鼠標腳本①鼠標鎖定與隱藏Cursor.lockState=CursorLockMode.Locked;Cursor.visible=false;鎖定光標不能動,可按Esc解鎖光標,并隱藏光標,增強用戶的沉浸感與代入感。②攝像機鎖定Vector3dir;publicGameObjectCameraObject;voidStart(){dir=CameraObject.GetComponent<Transform>().position- gameObject.GetComponent<Transform>().position;} voidUpdate(){gameObject.GetComponent<Transform>().position= CameraObject.GetComponent<Transform>().position-dir;}鎖定攝像機,CameraObject為對外接口,可在腳本外設置目標對象。使掛載腳本的物體與目標物體的坐標差值不變,用于攝像機跟隨正在移動的人物,結合鼠標控制攝像機視角的腳本有另一種應用方式。③鼠標控制攝像機視角publicenumRotationAxes{MouseXAndY=0,MouseX=1,MouseZ=2}publicRotationAxesm_axes=RotationAxes.MouseXAndY;publicfloatm_sensitivityX=10f;publicfloatm_sensitivityY=10f;publicfloatm_minimumY=-45f;publicfloatm_maximumY=45f;floatm_rotationY=0f;通過枚舉設定三種模式的切換判定,可以通過外部接口進行切換,轉(zhuǎn)向速度倍率為10,上下最大轉(zhuǎn)動仰角限定45°。Y軸(左右轉(zhuǎn)向)初始值設定為0。voidUpdate(){if(m_axes==RotationAxes.MouseXAndY){ floatm_rotationX=transform.localEulerAngles.y+ Input.GetAxis("MouseX")*m_sensitivityX;m_rotationY+=Input.GetAxis("MouseY")* m_sensitivityY; m_rotationY=Mathf.Clamp(m_rotationY,m_minimumY,m_maximumY); transform.localEulerAngles=newVector3(-m_rotationY,m_rotationX,0);}判斷m_axes為0時執(zhí)行同時操作x與y軸視角的轉(zhuǎn)動。注:手握的鼠標硬件移動時是應用的傳統(tǒng)二維坐標系xy,所以鼠標左右移動時是鼠標的x軸在進行變化,所以體現(xiàn)在Unity3d中是變化y軸的旋轉(zhuǎn)值。而上下移動,鼠標y軸變換時,改變的是Unity3d中x軸的旋轉(zhuǎn)值。當前物體的y軸旋轉(zhuǎn)值與鼠標x軸移動量的和賦值給m_rotationX;同理m_rotationY賦值后,通過值限制函數(shù)Mathf.Clamp把其先行在-45°與45度之間。再把作為m_rotationX作為向量的y值,m_rotationY作為向量的x值,賦值給腳本掛載物體的軸。elseif(m_axes==RotationAxes.MouseX){transform.Rotate(0,Input.GetAxis("MouseX")*m_sensitivityX,0);}判斷m_axes變量為1時,僅讀取鼠標x軸增/減量,用于改變物體y軸角度,并物體的x軸與z軸鎖定為0。else{m_rotationY+=Input.GetAxis("MouseY")*m_sensitivityY;m_rotationY=Mathf.Clamp(m_rotationY,m_minimumY,m_maximumY); transform.localEulerAngles=newVector3(-m_rotationY,transform.localEulerAngles.y,0);}判斷m_axes不為0也不為1時(節(jié)省運算時間,不再if),僅改變物體x軸角度,并使目標y軸保持原有角度不變,z軸為0。將此腳本與攝像機跟隨腳本掛到一個空物體上,相機作為空物體的子類,空物體位于人物頭頂,攝像機跟隨腳本目標設為人物,可實現(xiàn)攝像機以人物為軸進行旋轉(zhuǎn)。觸發(fā)器及觸發(fā)事件腳本(1)觸發(fā)器腳本publicGameObjectF_Hover;publicvoidShow(GameObjectF_Hover){F_Hover.SetActive(true);}publicvoidHide(GameObjectF_Hover){F_Hover.SetActive(false);}F_Hover是對外接口,Show函數(shù)控制顯示目標對象(即啟用),Hide函數(shù)控制隱藏目標對象(即禁用)。F_Hover是場景中的交互提示,即“按F進行交互”。voidOnTriggerEnter(ColliderF_Trigger){Debug.Log(Time.time+"進入該觸發(fā)器的對象是:"+F_Trigger.gameO);Show(F_Hover);GameObject.Find("Ball").GetComponent<BallShot>().enabled=true;}進入觸發(fā)器后再控制臺顯示進入觸發(fā)器物體的名稱,并在進入時調(diào)用Show函數(shù),啟用目標對象(F_Hover),并且搜索場景中名稱為Ball的物體,啟用物體上名為BallShot的腳本。voidOnTriggerStay(ColliderF_Trigger){Debug.Log(Time.time+"留在觸發(fā)器的對象是:"+ F_Trigger.gameO);}進入觸發(fā)器控制臺每幀刷新一次,顯示留在觸發(fā)器物體的名稱。voidOnTriggerExit(ColliderF_Trigger){Debug.Log(Time.time+"離開觸發(fā)器的對象是:"+ F_Trigger.gameO);Hide(F_Hover);GameObject.Find("Ball").GetComponent<BallShot>().enabled=false;}離開觸發(fā)器后在控制臺顯示離開觸發(fā)器物體的名稱,并在離開時調(diào)用Hide函數(shù),禁用不表對象(F_Hover),并且搜索場景中名為Ball的物體,禁用物體上名為BallShot的腳本。(2)場景跳轉(zhuǎn)腳本if(Input.GetKeyDown(KeyCode.F)){SceneManager.LoadScene("thelastrevelation");}PRD偽隨機算法的實現(xiàn)for(int
i
=
1;
i
<=
100;
i++){ double
p
=
i
*
1d
/
100d;
double
c
=
CFromP(p);
Debug.Log("P:
"
+
p
+
"
C:
"
+
c);}p為實際客戶端顯示的概率數(shù)值,把p值作為參數(shù)傳入CFromP()函數(shù)中,進行運算計算出概率增量C值。private
static
double
CFromP(double
p){ double
dUp
=
p;double
dLow
=
0d; double
dMid
=
p; double
dPLast
=
1d;double
dPtested;while
(true){ dMid
=
(dUp
+
dLow)
/
2d;dPtested
=
PFromC(dMid);if
(Math.Abs(dPtested-dPLast)
<=
0.00005d)
break;if
(dPtested
>
p)
dUp
=
dMid;else
dLow
=
dMid;dPLast
=
dPtested;
}return
dMid;}把目標概率p設定為初始最大值,初始最小值為0,dMid為本次循環(huán)概率增量C的暫存器,dPLast上一次運算平均概率的暫存器,dPtested為本次運算平均概率的暫存器。應用二分法,取dUp(最大值)與dLow(最小值)和的一半作為概率增量C值傳遞到PFromC函數(shù)中。通過PfromC函數(shù)對本次循環(huán)概率增量C運算后,得出在此概率增量C下,對應的dPtested(平均概率)為多少。如果dPtested(本次運算的平均概率)與dPLast(上一次運算的平均概率)差值的絕對值小于我們設定的界限0.00005則跳出循環(huán)。否則判斷dPtested是否大于(目標概率)p。(1)如果大于概率p,則說明此次概率增量C設置的過大,理想的C值應該在dLow與dMid(C值暫存器)之間,則應把本次的概率增量賦值給dUp,再次進行上述循環(huán)。(2)如果小于概率p,則說明此次概率增量C設置的過小,理想的C值應該在dMid(C值暫存器)與dUp之間,則應吧本次的概率增量賦值給dUP,再次進行上述循環(huán)。在開始進入下一個循環(huán)之前需要把dPtested(本次運算平均概率暫存器)的值賦給dPlast(上一次運算平均概率暫存器),把這個放在最后說是因為這里有個看似不合理的地方:為什么不直接計算dPtested與(目標概率)p的差值,使dPtested在逼近p時就跳出循環(huán)呢?其實是因為在高精度運算中,過小的值可能會因為計算機誤差與運算精度等問題導致dPtested與p永遠無法達到0.00005差值的理想狀態(tài)。但同樣用二分法計算出的dPLast值會與dPtested最終的結果絕對是相等。private
static
double
PFromC(double
c){double
dCurP
=
0d;
double
dPreSuccessP
=
0d;double
dPE
=
0;int
nMaxFail
=
(int)Math.Ceiling(1d
/
c);for
(int
i
=
1;
i
<=
nMaxFail;
i++){dCurP
=
Math.Min(1d,
i
*
c)
*
(1
-
dPreSuccessP);dPreSuccessP
+=
dCurP;dPE
+=
i
*
dCurP;}return
1d
/
dPE;}PFromC函數(shù)的作用是計算在當前概率增量C下,平均概率為多少。dCurp是單次概率暫存器。dPreSuccessP為在當前C值下,前幾次循環(huán)概率事件發(fā)生的占比分布之和(簡稱占比分布)。dPE為事件發(fā)生的期望。概率增量C在PRD算法的意義是:第一次發(fā)生事件的概率為C,第二次發(fā)生事件的概率為2C,第三次3C,以此類推,借此用以達到保持隨機性的同時,降低完全隨機連續(xù)發(fā)生(或連續(xù)不發(fā)生)的概率。所以,出現(xiàn)事件連續(xù)不發(fā)生的情況時,在第nMaxFail次,概率會增加至極限100%,即事件必然發(fā)勝,所以使用通過1/c向上取整,即可求出極限值nMaxFail。Math.Min函數(shù)用于控制事件發(fā)生概率不會超過100%。(1-dPreSuccessP)為第i次循環(huán)發(fā)生的概率權重(這里的概率不同于事件發(fā)生的概率),沒有具體事件這里容易發(fā)生混淆,故用游戲中的暴擊率來舉例說明。第一次攻擊產(chǎn)生暴擊的概率為30%,因為第一次攻擊必定進行,所以概率權重為100%;第一次不暴擊,第二次攻擊產(chǎn)生暴擊,因概率增量提升暴擊率為2*30%,但僅在第一次不暴擊的情況下才會進入本次循環(huán),所以概率權重為1-(第一次暴擊概率),即(1-30%)。前兩次都不暴擊,第三次攻擊產(chǎn)生暴擊,因概率增量提升暴擊率為3*30%,但僅在前兩次都不暴擊的情況下才會進入本次循環(huán),所以概率權重為1-(在第一次攻擊發(fā)生暴擊的概率+在第二次攻擊發(fā)生暴擊的概率),即(1-((30%)+(2*30%*(1-70%))))。五、局域網(wǎng)聯(lián)機相關調(diào)試(一)調(diào)試的目的在Unity項目開發(fā)過程中,只能通過Game視窗運行一個進程,而在項目后期的局域網(wǎng)聯(lián)機開發(fā)中,必須打開至少兩個以上的項目同時運行。而在項目的導出與網(wǎng)絡組件加入后出現(xiàn)了不少問題,甚至出現(xiàn)了與單機模式腳本不兼容、邏輯混亂的問題。就此模塊的開發(fā)過程中留存了不少“版本更新”文檔,故在此整理。(二)測試檔案本項目中的測試是在基本功能完成后,對項目進行導出測試。本過程中不涉及測試案例,而是并針對版本中出現(xiàn)的問題進行整理,并提出擬解決方案(1)版本需解決問題:場景中自帶玩家預制體,輸入會同時操縱兩個玩家角色擬解決方案:刪除場景中預制體,靠腳本生成玩家,生成點從4減少為1出現(xiàn)問題:客戶端不能正常生成玩家角色預制體(2)版本解決問題:客戶端不能正常生成玩家角色預制體。解決方案:玩家角色生成點“SpawnPoint”從1增加到2。出現(xiàn)問題:生成角色不同步,且角色生成邏輯混亂,出現(xiàn)復數(shù)同時接受鍵盤輸入指令角色。解決問題:觸發(fā)器腳本關聯(lián)玩家預制體,進入場景后才創(chuàng)建角色預制體會導致交互提示圖標F邏輯異常。解決方案:把相機與角色預制體關聯(lián)解除,相機與交互提示圖標F關聯(lián),使場景加載后觸發(fā)器能鎖定場景中的圖標F,解決其邏輯錯誤。出現(xiàn)問題:場景中鼠標鎖定腳本生效,導致不能正常點擊創(chuàng)建或加入服務器房間。(3)版本解決問題:場景中鼠標鎖定腳本生效,導致不能正常點擊創(chuàng)建或加入服務器房間。解決方案:把鼠標鎖定腳本關聯(lián)角色模型,在玩家角色預制體生成后鎖定鼠標。出現(xiàn)問題: 客戶端不能正常加入服務器房間,角色生成異常。攝像機跟隨功能,因角色加載滯后出現(xiàn)異常。(4)版本解決問題:客戶端不能正常加入服務器房間,角色生成異常。攝像機跟隨功能,因角色加載滯后出現(xiàn)異常。解決方案:推翻之前一切問題解決方案,把觸發(fā)器腳本從物體上轉(zhuǎn)移到玩家角色預制體上。解決預制體加載觸發(fā)邏輯問題的同時,解決角色與場景交互的泛用性問題。出現(xiàn)問題:模型生成數(shù)量沒問題,但服務器端與客戶端數(shù)據(jù)不同步。鍵盤指令同時操作兩個模型,且兩個界面操作不互通。(5)版本解決問題:添加屋內(nèi)場景。解決方案:給房屋添加觸發(fā)器,并增加觸發(fā)器腳本以及事件腳本,實現(xiàn)場景跳轉(zhuǎn)。出現(xiàn)問題:場景跳轉(zhuǎn)后人物不會跟著轉(zhuǎn)移。通過在室內(nèi)環(huán)境添加新的角色生成解決問題。(6)版本/7/8①測試unity禁用腳本后,生成項目是否會同樣禁用,并對新的聯(lián)機移動方式進行第一次測試依舊通信異常。②調(diào)整移動腳本與網(wǎng)絡連接同時掛載到“攝像機-角色”的預制體父類空物體上。終端輸入還是會同時影響兩個角色,但在某一終端的輸入,會正確反映到另一終端。③把update定義成private,在添加判斷語句if(!isLocalPlayer)return。判斷是否是終端所屬生成角色,成功完成聯(lián)機數(shù)據(jù)互通。后續(xù)1.0.1.x版本為針對局域網(wǎng)相關腳本適配與BUG處理。均在詳細設計中已有體現(xiàn),故在此不再復述。結論雖然在整個開發(fā)過程中遇到了很多問題,但通過詢問與討論,最終都一一解決了。畢業(yè)設計工作有以下幾個方面:(1)本次系統(tǒng)開發(fā)是一種新型社交平臺,在項目初期,主要工作為收集各個模塊開發(fā)所需要的相關技術,并對學習與開發(fā)周期做了一個大概的預估。之后開始著手構建項目,并進行相關課程的學習。(2)在開發(fā)中期重點放在豐富場景,以及腳本編寫上。主要涉及環(huán)境布局與Unity接口的查找、使用上。環(huán)境布局雖然在計算機技術層面上,技術含量不高,但其也是項目中必不可少的一個模塊。Unity提供的各種接口功能非常的全面且強大,但相對應的,想要完全掌握一些接口的內(nèi)部邏輯以便開發(fā)學習不局限于表面,也付出了不少時間進行研究。(3)在項目的后期,基礎腳本都成功運行,但在變得的復雜的場景中會出現(xiàn)各種Bug。所以工作重點放在了調(diào)試腳本與修改Bug上,對腳本自身、腳本與腳本、腳本與物體之間的邏輯關系進行優(yōu)化。并針對局域網(wǎng)連接模塊進行腳本版本優(yōu)化與適配。通過這次畢業(yè)設計我受益良多,從一開始使用Unity的方塊、球體制作簡單地人物模型與方塊房間到現(xiàn)在的各種腳本、系統(tǒng)的開發(fā)。由于時間和精力的限制,受建模技術的制約,本次開發(fā)的虛擬社區(qū)還缺乏各種游戲性、美觀性,場景也只有兩個,但比較復雜的交互模塊已經(jīng)開發(fā)完畢,后續(xù)開發(fā)也僅僅需要簡單地對應事件腳本即可。總的來說項目還有著進一步開發(fā)的空間,使虛擬社交社區(qū)在更加豐富
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 【小學課件】體積單位的換算
- 《藥品管理制度》課件
- 《電氣設備故障診斷》課件
- 《紅樓夢》的英文簡介
- 單位人力資源管理制度呈現(xiàn)匯編十篇
- 單位管理制度展示匯編職工管理篇十篇
- 單位管理制度展示大全人員管理篇十篇
- 智慧農(nóng)貿(mào)冷鏈物流基地項目可行性研究報告模板立項審批
- 單位管理制度收錄大合集職員管理十篇
- 博物館對外文標識統(tǒng)一規(guī)范自查報告
- 森林火災滅火器具使用與技巧課件
- 雙氧水資源綜合利用項目建議書
- 物流園區(qū)及貨運站場規(guī)劃設計方案
- 如何處理銷售過程中的問題和挑戰(zhàn)
- 廣東省廣州市黃埔區(qū)2023-2024學年八年級上學期期末生物試卷+
- 眼科優(yōu)勢病種中醫(yī)診療方案
- 高中數(shù)學聯(lián)賽歷年真題分類匯編解析(高分強基必刷)
- 2024年工程部工作總結與計劃
- 漢語詞性講解
- 機械設備租賃保障措施
- 腳手架施工驗收表
評論
0/150
提交評論