基于unity3d的手部模擬器的設(shè)計與實現(xiàn)_第1頁
基于unity3d的手部模擬器的設(shè)計與實現(xiàn)_第2頁
基于unity3d的手部模擬器的設(shè)計與實現(xiàn)_第3頁
基于unity3d的手部模擬器的設(shè)計與實現(xiàn)_第4頁
基于unity3d的手部模擬器的設(shè)計與實現(xiàn)_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

緒論選題的目的和意義游戲行業(yè)日益高漲,游戲硬件的更新?lián)Q代,游戲的種類也越來越多,絕大部分游戲走向更加真實震撼的效果,如使命召喚系列等各種震撼的特效和超高真實度的人物模型。少數(shù)部分的游戲走向電競這條道路,它們更加追求游戲的平衡性和團(tuán)隊合作性,更貼合大眾。極為少數(shù)的一部分游戲卻走向那種注重新奇玩法的道路,它們不追求極致的畫質(zhì),甚至你能看見在Steam上有火柴人打架都售價50以上,這種游戲有著豐富的想象力。然而,這種游戲往往玩的是最開心的,不需要高配置的電腦,可以跟著朋友一起玩爆笑一整天。在這極少數(shù)游戲中就有一種仿真模擬類游戲,如造橋模擬器、卡車模擬器等等這種類型游戲能勾起玩家的興趣,更能陷入其中。選擇unity3d是因為可以讓制作者更加輕松的創(chuàng)建玩家手部骨骼的動畫、各種場景道具的三維模型。正因unity3d可以實現(xiàn)多平臺,我們才可以在以后推出PC端、手機(jī)端等各種平臺的游戲?qū)崿F(xiàn),讓大眾在各種平臺體驗。仿真模擬類游戲可以讓人們在游戲中盡可能地真實的體驗,而本款手部模擬器更加真實,細(xì)節(jié)到手的每一個骨骼每一個關(guān)節(jié),真實的體驗每一個場景,不需要長時間進(jìn)行,并且有較高的娛樂性,非常適合大眾在玩過各種大型游戲后放松一下。國內(nèi)外研究現(xiàn)狀仿模擬類游戲的重心是仿真。“仿”字代表著模仿模擬,根據(jù)真實世界而進(jìn)行模仿,一切符合現(xiàn)實的構(gòu)造,沒有一點的虛構(gòu)因素。而“真”字則是真實的世界,越高的仿真度能帶來的效果就越有意義,對我們的生活給予幫助。相反的,仿真程度很低從而添加游戲樂趣則與模擬這個沖突,偏離這類型游戲的主題,得不償失?,F(xiàn)在市面上主要的類型是訓(xùn)練類模擬游戲。它對應(yīng)著模擬。而訓(xùn)練類則是模擬類游戲里最多的。因為它門檻低,能夠從生活中種種簡單的活動中實現(xiàn),例如垃圾分類、烹飪、畫畫等等。現(xiàn)在有不少的教育機(jī)構(gòu)采用這種游戲讓學(xué)生們對學(xué)習(xí)更加有動力。但是仿真度越高的則會變成一種訓(xùn)練器,體驗這些游戲的就不是為了娛樂了。而實更深層度的提高某些技能的水平,但實際上兩種都是一樣的。模擬類的游戲好處已經(jīng)收到許多用戶的注意,有更多的游戲公司投資開發(fā)這類型的游戲。仿真模擬類游戲更加的貼近生活和現(xiàn)實。玩家在玩這類游戲的時候都會覺得是真實的,沒有一絲異樣,而且在游戲中發(fā)生的一切也是非常的生活性,僅有缺點就是不切實際的夸張,為了達(dá)到效果,某些小事情會被放大顯得不太真實。仿真模擬類游戲的到來讓全世界的人對游戲的看法發(fā)生改變。模擬游戲表明了游戲就是娛樂的這種說法是片面的,游戲是一把雙刃的劍,有好的一面也有壞的一面,模擬類游戲正是可以讓游戲與生活聯(lián)系起來,相互的發(fā)揮各有的價值。論文組織結(jié)構(gòu)?論文從最初構(gòu)思來源于小學(xué)期的試用品,當(dāng)時想做一個模擬類型的游戲,可是技術(shù)有限無法完成,現(xiàn)在結(jié)合了專業(yè)3D游戲開發(fā)資料,進(jìn)行了一個仿真手部操作戲的設(shè)計制作,其中,具體介紹游戲的制作步驟,包括游戲的系統(tǒng)功能設(shè)計和一系列代碼的編寫。論文分為七章,各章節(jié)細(xì)節(jié)安排如下:?第一部分:緒論,主要講述該畢業(yè)設(shè)計的制作背景、國內(nèi)外對相關(guān)課題的研究現(xiàn)狀和本設(shè)計的介紹;?第二部分:介紹了本文制作游戲使用的各類開發(fā)工具和Unity3D的介紹;?第三部分:詳細(xì)介紹游戲的設(shè)計的基本思路;第四部分:游戲的功能實現(xiàn);?第五部分:游戲的界面功能實現(xiàn);??第六部分:運(yùn)行游戲進(jìn)行測試,打包封裝;?第七部分:結(jié)論以及今后的改進(jìn)。

開發(fā)工具介紹Unity3D游戲引擎Unity3D軟件介紹Unity3D是一款面對用戶開發(fā)的游戲引擎。它適用于2D和3D的游戲開發(fā)。它有著完美的跨平臺系統(tǒng)。在PC端、安卓端和IOS端尤為顯著。它適用于制作小類型的游戲,它輕巧、快捷、功能強(qiáng)大,有各種接口。它不僅僅是一個制作游戲的引擎,它還可以制作3D渲染場景圖,也能搭載動畫。它有著一個良好的互動,獨特的編輯界面,簡單方便,能夠與Windows平臺和MacOS平臺上進(jìn)行互動。它有著良好的視圖分配,在制作過程中簡潔分清設(shè)計者需要的編輯視圖,還能自定義分布,符合各種開發(fā)者的需求。它擁有著自己各種腳本語言進(jìn)行編輯的常用環(huán)境,識別市面上常見的語言,例如:C#、javascript等。API接口Unity3D擁有十分豐富的API接口,可以完成這種接口完成各種各樣的需求。API是一種函數(shù),預(yù)先定義的,可以幫助開發(fā)人員在不訪問代碼的情況下訪問一組例程,還有了解內(nèi)部的機(jī)制細(xì)節(jié)。在U3D里,有一個非常完整的一套API函數(shù)的庫存,開發(fā)者可以實現(xiàn)該項目的初始階段是為了方便這些功能,能檢測每個模塊的是否有觸發(fā)響應(yīng)、離開觸發(fā)相應(yīng)、調(diào)出數(shù)據(jù)等等。物理引擎在非特定游戲的基礎(chǔ)上,物理效果是游戲開發(fā)的一大難點,也是游戲中關(guān)鍵的一部分,任何一款網(wǎng)絡(luò)游戲的設(shè)計都需要一個符合實際物體特性的合理,這樣才顯得更加真實。U3D則有著一套幾乎完美的物理引擎,可以是物體的色彩亮度、渲染、平行光、點光源、色彩亮度、正常映射等,游戲材料可以給我們帶來真實的視覺效果,宛如身臨其境。而在力的方面,U3D有著簡潔簡單的剛體編輯,只要不是過于困難的類型,我們只要改幾項數(shù)據(jù)就可以完成一種真實的物理效果。Unity常用生命周期的函數(shù)Unity3D游戲引擎不像常規(guī)的程序直接在Main函數(shù)入口運(yùn)行,而是在內(nèi)部實現(xiàn)了自己的生命周期事件。通過對這些生命周期的事件進(jìn)行寫入,Unity內(nèi)部就會不斷地迭代這些生命周期函數(shù)。下面按照腳本的執(zhí)行順序介紹游戲中比較常用的Unity事件函數(shù)。Awake():當(dāng)游戲?qū)ο蟊怀跏蓟臅r候調(diào)用,無論該對象是否已被激活。Start():在Awake事件后調(diào)用,但只有被激活的時候才能夠執(zhí)行。Update():游戲中的幀事件,因為游戲大部分都是按幀率來執(zhí)行邏輯的。FixedUpdate():游戲的固定幀事件,基本同Update(),但該事件可由開發(fā)者去控制執(zhí)行頻率。OnEnable():Start事件調(diào)用之后,只有被激活時將執(zhí)行。OnDisable():當(dāng)游戲研究對象被禁止通過激活的時候會調(diào)用。OnDestroy():當(dāng)游戲?qū)ο蟊讳N毀時執(zhí)行。Unity3D腳本將基本上是從基類繼承MonoBehaviour。一般不繼承于MonoBehavior的類會用自己來寫出了一些重要工具類。通常來說,它在整個程序運(yùn)行的過程中都是存在的,除非自己手動GC釋放內(nèi)存。GUI(圖形用戶界面)Ugui,本項目的UI層是用UGUI進(jìn)行開發(fā),GUI的意思是圖形用戶界面。而UGUI則是Unity的GUI系統(tǒng)的簡稱,UGUI能讓開發(fā)者簡單快捷的添加各種種類的界面部件,通過控件的創(chuàng)建同時實例化。使你用少量的代碼創(chuàng)建一個功能齊全的基本框架。3DsMax軟件3dsmax是一個以電腦操作系統(tǒng)為基礎(chǔ)的三維動畫渲染和三維對象制作的軟件,是當(dāng)代模型制作最常用的建模平臺。它的前身是一個以dos操作系統(tǒng)為基礎(chǔ)的3dstudio軟件,軟件的最初功能是制作游戲中的動畫,到現(xiàn)在已經(jīng)拓展到制作影視電影中的特效制作。C#開發(fā)語言C#是一種開發(fā)語言,是由微軟公司開發(fā)并運(yùn)行在.net

framework上,是一種面向?qū)ο蟮母呒壋绦蛟O(shè)計語言。它跟java類似即是一種語言也是一種工具。但它并不是跨平臺的開發(fā)語言,由于mono的實現(xiàn)使得它能在Unity這種跨平臺引擎上編寫,它語法簡單明了,能方便使用類庫,在Unity上開發(fā)發(fā)C#為首要。VisualStudio2017VisualStudio2017也就是VS2017,它是由微軟公司推出的開發(fā)環(huán)境,它有著最新的集成開發(fā)環(huán)境,也帶來了更快地為Android、iOS和Windows創(chuàng)建移動應(yīng)用。微軟還在官網(wǎng)上強(qiáng)調(diào)了VisualStudio2017的其它主要方面的改進(jìn),聲稱可以為任意開發(fā)、任意app、任意平臺提供“無與倫比的生產(chǎn)力”。它也支持各種數(shù)據(jù)庫。游戲設(shè)計在模擬游戲中有很多種類型,游戲的名字就決定了游戲的核心側(cè)重。這款游戲的側(cè)重點是手,整個游戲最基本都要有一雙可控制的手和一些可交互的物品。以下就講述手和場景的如何設(shè)計。游戲總體設(shè)計我根據(jù)文獻(xiàn)中學(xué)到基本流程[]。手部設(shè)計3.1.1手部的移動設(shè)計在手的移動上必須滿足幾個點,一是能比較簡單的操作最好是通過鼠標(biāo)前后左右平移的方法實現(xiàn)手的移動,但這樣就會遇到一個問題,手如何上下提高和下降。鼠標(biāo)不能高低移動,但鼠標(biāo)上的按鍵很多,這里我選擇用滾輪,我覺得滾輪的滾上滾下很適合手的上下升降。二者是移動的距離要比較精確,幅度要小。這里我選擇檢測鼠標(biāo)XY軸的移動再乘一個速度,這個速度可控,可以達(dá)到比較精細(xì)的移動。如圖3-1。圖3-1控制手部移動的物體三是手的合理關(guān)節(jié),人的手很復(fù)雜,它有各種骨頭和筋,每個移動都要各個部位協(xié)調(diào)完成,在游戲中也不例外,在玩家移動手時,連接手掌后的手臂手肘也應(yīng)該接連運(yùn)動。在這種情況下很難通過代碼方式限制角度。在Animator中則有一個方法,IK的方法,如圖3-2。圖3-2控制手部移動的物體在玩家控制物體移動的同時,手會有綁定骨骼似的旋轉(zhuǎn)拉伸。當(dāng)玩家控制的物體超過手所觸及的距離,手也不會斷開去跟隨,而實在最大值附近停留。3.1.2手部的抓取設(shè)計在手的抓取上有幾個必須的功能,一、是手手掌的握拳張開,能有單獨的手指控制最好。在選擇上,我覺得動畫機(jī)的控制最好,能控制單獨控制手指,所有手指彎曲就是握拳的效果。但是在這種方法不能準(zhǔn)確與物體碰撞體交互,所以也準(zhǔn)備了另外一種手的設(shè)計,運(yùn)用ConfigurableJoint來控制各條手指的彎曲程度實現(xiàn)握拳張開,但是具體代碼比較復(fù)雜,只能有簡單的表現(xiàn)。二、手以掌心為基點,玩家通過手掌手指來抓取物體而不是用手肘夾著或者手的撥動。三、手的合理翻轉(zhuǎn)抓取,在手的翻轉(zhuǎn)上,有手腕的左右旋轉(zhuǎn)上下翻轉(zhuǎn),都有著角度限制,而IK的方法則不能實現(xiàn)這種效果。在旋轉(zhuǎn)上我限制了角度,讓手的旋轉(zhuǎn)和翻轉(zhuǎn)都有一個固定的限度,這樣手就不會穿模或者模型撕裂不正常。3.1.3抓取效果設(shè)計抓取效果是一個很難的點,它既與物理效果有關(guān)也與碰撞有關(guān),如果單純用剛體碰撞通過手指卡死物體實現(xiàn)抓取,這樣沒有精確的物理數(shù)據(jù)會導(dǎo)致被抓物體的莫名彈飛,從而實現(xiàn)不成抓取效果。與物體的碰撞,rigidbody很復(fù)雜,難以真實實現(xiàn)。我就讓它簡單化,讓手抓取效果換成IK跟隨目標(biāo)切換,讓本來控制手移動的移動Cube,在Collier碰撞加上鼠標(biāo)點擊下,目標(biāo)轉(zhuǎn)換成抓取的地方,那樣簡單又少bug,如圖3-3.還有一種是用fixedjoint的方法,手指彎曲觸碰到碰撞體的時候就會停止彎曲,并將觸碰到的碰撞體與手指連接生產(chǎn)fixedjoint,松手的時候再刪除fixedjoint,剛好有個能實現(xiàn)它項目例子。圖3-3控制手部移動的物體場景設(shè)計3.2.1場景的選擇在這款游戲里,玩法是玩家對手的理解和操作,不需要控制人物移動或者道具拾取,在場景的選擇上應(yīng)該以手的操作為重點,這里我選擇了釣魚場景和汽車場景,釣魚場景需要玩家對魚竿魚餌控制,釣魚需要玩家對魚竿控制要求很高,要精準(zhǔn)抓到魚竿的底端,還要旋轉(zhuǎn)角度正握,其次還要玩家抓魚餌掛鉤和釣魚上船,能讓玩家對手的操控熟悉。汽車場景的話更深一步的熟悉操控,汽車場景的重點是方向盤,玩家通過控制方向盤的旋轉(zhuǎn)來控制車輛的左右行動,不僅僅是方向盤,還要玩家控制車輛的擋位。3.2.2釣魚場景的設(shè)計在釣魚的場景中,我更加注重玩家對魚竿的控制,而不是釣多少魚。對魚竿的控制大致是對手的抓取要求更高,所以我選擇了用碰撞來抓,考慮到物理結(jié)構(gòu)的復(fù)雜,我查閱了各種資料,決定用fixedjoint物理連接來實現(xiàn),用ConfigurableJoint來控制手的彎曲程度,通過方法讓碰撞體接觸到物體的碰撞體后停止彎曲,達(dá)到抓住的感覺,再用fixedjoint來連接接觸位置和物體之間,魚餌和魚竿的魚鉤之間也需要玩家合理的操作平移旋轉(zhuǎn)雙手才能做到,所以我覺得釣魚場景能體驗該手的功能性。所用到的魚餌和魚竿如圖3-4圖3-4魚竿和魚餌3.2.3汽車場景的設(shè)計在汽車場景里,我更注重玩家左右手的合理搭配,左手該做的事情就是控制好方向盤,右手則是要換擋,再抓取方向盤。搭配很重要,汽車本身也大概根據(jù)現(xiàn)實的汽車,擋位打前只能走前,打后才能倒車。方向盤方面我根據(jù)方向盤的轉(zhuǎn)動角度來改變車輪的轉(zhuǎn)動角度,因為技術(shù)的問題,不能寫到真實方向盤那樣打滿兩圈多,而是180度為盡頭打滿。汽車系統(tǒng)有網(wǎng)上插件,只要改好幾項參數(shù)再改代碼就能實現(xiàn)手部控制汽車移動。魚竿和汽車的設(shè)計3.3.1魚竿的設(shè)計在釣魚場景里關(guān)鍵的是釣魚的魚竿,魚竿的基本功能要有桿體、釣魚線和魚鉤,如果可以的話還能加上控制釣魚線伸長縮短的輪子??紤]到精確游玩的問題,輪子沒有添加,而實要玩家通過抬高釣魚竿的方式來釣魚。桿體上要有一個可以與玩家手接觸碰撞的檢測,可以讓手握住抓的地方。單純使用rigidbody不行,會因為剛體穿過而讓魚竿莫名擊飛,這時我運(yùn)用了網(wǎng)上手部關(guān)節(jié)的例子讓碰撞的手指與物體進(jìn)行連接,達(dá)到抓取不掉的效果。魚線方面則是用網(wǎng)上帶的繩子系統(tǒng),經(jīng)過調(diào)試,線已經(jīng)比較接近能用的程度,可以達(dá)到不斷不穿模的狀態(tài),但還是有點莫名的晃動。魚鉤則更簡單,放一個可以與魚餌和魚交互的物體碰撞交互。3.3.2汽車的設(shè)計汽車場景里關(guān)鍵的是汽車,在這款游戲中有一個注意的點,就是不能讓手部模擬器變成一個汽車模擬器,所以汽車的功能不能太精細(xì),也不能太簡陋。我保留了汽車的行駛功能,在行駛功能上添加了方向盤和自動桿的功能。方向盤是靈魂,玩家通過方向盤控制前輪實現(xiàn)轉(zhuǎn)彎,通過自動桿實現(xiàn)前進(jìn)倒退。如圖3-5圖3-5方向盤游戲界面設(shè)計場景1為菜單界面,菜單界面包括汽車場景開始,釣魚場景開始和退出鍵,均使用UGUI制作。釣魚場景、汽車場景開始按鈕:用來進(jìn)入釣魚場景,即進(jìn)入游戲主界面。當(dāng)通過鼠標(biāo)按下該按鈕,就可以載入所要進(jìn)行的游戲。玩家把鼠標(biāo)移動到按鈕上方或移出時,按鈕會有相應(yīng)的顏色狀態(tài)變化。退出按鈕:用來退出游戲。游戲操控設(shè)計手的操控有很多,例如五只手指的彎曲、手的移動和手腕部位的旋轉(zhuǎn)??紤]到按鍵過多的問題,應(yīng)該設(shè)計的簡單一點,具體操控如下表3-6。表3-6游戲操控表按鈕表現(xiàn)備注適用場景按鍵A食指彎曲點擊或長按釣魚場景按鍵S中指彎曲點擊或長按釣魚場景按鍵D無名指彎曲點擊或長按釣魚場景按鍵F尾指彎曲點擊或長按釣魚場景空格大拇指彎曲點擊或長按釣魚場景鼠標(biāo)移動手的XZ軸移動滑動釣魚場景/汽車場景滾輪手的Y軸移動滑動釣魚場景/汽車場景右鍵+鼠標(biāo)移動手腕的旋轉(zhuǎn)右鍵長按滑動鼠標(biāo)釣魚場景中鍵+鼠標(biāo)移動手腕的旋轉(zhuǎn)中鍵長按滑動鼠標(biāo)汽車場景按鍵W汽車前進(jìn)長按汽車場景按鍵S汽車倒退長按汽車場景空格汽車剎車長按汽車場景游戲?qū)崿F(xiàn)首這章講的是如何實現(xiàn)這款游戲,通過上述的游戲設(shè)計,重點是手的實現(xiàn),其次是場景有關(guān)的實現(xiàn),下述重點描述的是是手的移動、抓取動畫和抓取效果,其次描述的是場景的實現(xiàn),包括其中魚竿和汽車的實現(xiàn)。手部的實現(xiàn)導(dǎo)入兩種手部模型首第一種用動畫控制的手部模型,如圖4-1,在游戲中體現(xiàn)的樣子是圖4-2,該模型是我從網(wǎng)上找的,手的操控邏輯是我自己寫的,該角色模型上掛著動畫控制腳本、左右手的旋轉(zhuǎn)腳本、左右手的移動腳本和頭部的跟隨腳本。他的整條手臂會合理的進(jìn)行移動,受骨骼的影響顯得真實。手臂的移動主要以IK的方式進(jìn)行移動調(diào)整,部分代碼如下:public

Transform

Righttarget;

public

Transform

Lefttarget;

public

Animator

animator;

private

void

OnAnimatorIK(int

layerIndex)

{

//設(shè)置右手谷歌的權(quán)重,0-1,可自行改變查看效果

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.RightHand,

1f);

//設(shè)置右手骨骼的ik目標(biāo)為膠囊體的坐標(biāo)和旋轉(zhuǎn)

animator.SetIKPosition(AvatarIKGoal.RightHand,

Righttarget.position);

animator.SetIKRotation(AvatarIKGoal.RightHand,

Righttarget.rotation);

//設(shè)置左手谷歌的權(quán)重,0-1,可自行改變查看效果

animator.SetIKPositionWeight(AvatarIKGoal.LeftHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.LeftHand,

1f);

//設(shè)置左手骨骼的ik目標(biāo)為膠囊體的坐標(biāo)和旋轉(zhuǎn)

animator.SetIKPosition(AvatarIKGoal.LeftHand,

Lefttarget.position);

animator.SetIKRotation(AvatarIKGoal.LeftHand,

Lefttarget.rotation);

}

手指手掌的彎曲則用動畫控制,加入AvatarMask來限制部分部位進(jìn)行動畫,設(shè)置好骨骼權(quán)重使得整個過程合理。具體Animator如圖4-1圖4-1人物模型圖4-2游戲效果第二種是在網(wǎng)上找的模擬器,他的好處是通過物理進(jìn)行操控的,顯得抓取物體會更加真實更加容易操作,不好地方是它的項目已經(jīng)是很多年以前,代碼已經(jīng)棄用了使得運(yùn)用上比較困難。游戲里如下圖4-3,如圖所示,他只有兩條手臂,原理上可以轉(zhuǎn)移到軀體上,但是過程比較復(fù)雜就沒有轉(zhuǎn)移,只能這樣用著了。他的是用ConfigurableJoint來進(jìn)行抓取物體。圖4-3游戲效果兩種手部移動的實現(xiàn)兩種手是跟隨物體移動,我們主要控制隱形的物體,讓該物體進(jìn)行移動或者旋轉(zhuǎn)從而實現(xiàn)手的跟隨移動旋轉(zhuǎn)。個別手的代碼如下:void

HandHorizontal()

{

//float

Ax

=

A.transform.position.x;

//float

Az

=

A.transform.position.z;

float

mouseX

=

Input.GetAxis("Mouse

X")

*

moveSpeed;

float

mouseY

=

Input.GetAxis("Mouse

Y")

*

moveSpeed;

Vector3

movent

=

new

Vector3(mouseX,

0,

mouseY);

transform.Translate(movent

*

moveSpeed

*

Time.deltaTime);

}

void

HandVertical()

{

float

Vertical

=

0.5f;

if

(Input.GetAxis("Mouse

ScrollWheel")

>

0)

{

Vector3

vertical

=

new

Vector3(0,

Vertical,

0);

transform.Translate(vertical

*

moveSpeed

*

Time.deltaTime);

}

//Zoom

in

if

(Input.GetAxis("Mouse

ScrollWheel")

<

0)

{

Vector3

vertical

=

new

Vector3(0,

-Vertical,

0);

transform.Translate(vertical

*

moveSpeed

*

Time.deltaTime);

}

}

void

Cushion()

{

float

Vertical

=

0.1f;

Vector3

vertical

=

new

Vector3(0,

-Vertical,

0);

transform.Translate(vertical

*

VerticalSpeed

*

Time.deltaTime);

return;

}

void

Rotate()

{

if

(Input.GetMouseButton(1))

{

float

mouseX

=

Input.GetAxis("Mouse

X")

*

moveSpeed;

Vector3

_movent

=

new

Vector3(mouseX,

0,

0);

rotate.transform.Rotate(_movent

*

Time.deltaTime

*

RotateSpeed);

}

途中我們用鍵盤左邊的Shift鍵來切換左右手,玩家只能同時控制一只手移動。當(dāng)正在控制任意一只手的時候,代碼就會實時監(jiān)控場景里的移動cube,通過檢測鼠標(biāo)的前后左右移動實現(xiàn)cube的前后左右的移動,讓模型的手通過IK跟cube移動,從而實現(xiàn)手的移動效果。同理,手的上下升降為檢測鼠標(biāo)滑輪的值,判斷手的升降。手腕翻轉(zhuǎn)則是通過點擊右鍵開始檢測鼠標(biāo)的前后左右滑動的值改變cube的翻轉(zhuǎn),在加上角度的限制,從而實現(xiàn)手腕的翻轉(zhuǎn)。兩種手部手指抓取動畫的實現(xiàn)第一種手的抓取動畫機(jī)Animator,因為考慮到開車操作問題,真實上用不到這么復(fù)雜,已經(jīng)減去手指的單獨行動,演變成只能握拳和展開。第二種手的抓法不是用動畫表現(xiàn)得,通過我的觀察和實驗,是通過ConfigurableJoint里面帶的方法實現(xiàn)的,具體也說不清楚。根據(jù)動畫文獻(xiàn)了解基本實現(xiàn)。部分控制代碼如下:void

RightHand()

{

if

(Input.GetMouseButtonDown(0))

{

Righthand.SetFloat("RightAll",

2f);

Click

=

true;

}

if

(Input.GetMouseButtonUp(0))

{

Righthand.SetFloat("RightAll",

0f);

Righthand.SetFloat("RFinger1",

0f);

Righthand.SetFloat("RFinger2",

0f);

Righthand.SetFloat("RFinger3",

0f);

Righthand.SetFloat("RFinger4",

0f);

Righthand.SetFloat("RFinger5",

0f);

Click

=

false;

}

}

void

LeftHand()

{

if

(Input.GetMouseButtonDown(0))

{

Righthand.SetFloat("All",

2f);

}

if

(Input.GetMouseButtonUp(0))

{

Righthand.SetFloat("All",

0f);

}

}

第動畫機(jī)如圖4-4,比較繁瑣。圖4-4animator狀態(tài)另外一種方法則比較簡單,如圖4-5,這種方法比較簡單,角色關(guān)節(jié)(characterjoint):可以模擬角色的骨骼關(guān)節(jié)。通過控制各個關(guān)節(jié)位碰撞體的角度實現(xiàn)手的彎曲,有現(xiàn)成的模擬器參照。關(guān)節(jié)是一個游戲組件,在導(dǎo)航菜單欄中選擇component——physics然后從中選擇一種關(guān)節(jié)組件,即可完成關(guān)節(jié)組件的添加。使用breakforce可設(shè)置關(guān)節(jié)斷裂的力,一旦力超過它,關(guān)節(jié)將會斷裂。斷裂時,通過onjointbreakforce方法可監(jiān)聽相關(guān)事件。圖4-5characterjoint關(guān)節(jié)兩種手部手指抓取效果的實現(xiàn)讓玩家控制手部與場景進(jìn)行交互我參考了文獻(xiàn)中的內(nèi)容圖4圖4-6抓取效果第一種汽車場景的手的抓取效果邏輯是讓手觸碰到特定的collider后進(jìn)行記錄,然后檢測此時玩家有沒有點擊鼠標(biāo)左鍵來判斷isTouch是否為真,若為真,玩家就不再控制手的移動cube的移動,而是控制當(dāng)前所碰撞的特定collider,人的手IK就會切換目標(biāo),從而實現(xiàn)手放在上面進(jìn)行操控一樣。該方法可能會造成穿模的現(xiàn)象,但是勝在簡單容易實現(xiàn),也不會因為各種rigidbody不規(guī)范而產(chǎn)生各種bug。部分代碼如下,SteeringWeelCount的多少是判斷玩家觸碰各種特定物品變化,只要數(shù)字是多少,點擊了鼠標(biāo)就會讓手掛在上方。抓取效果如圖4-6第二種釣魚場景的手的抓取效果是由Unity自帶的fixedjoint實現(xiàn)的,通過我的觀察與實驗,該手模擬器是通過控制ConfigurableJoint里面的數(shù)值來改變手指的彎曲程度,當(dāng)手指彎曲時碰到有碰撞體的物體時就會讓碰撞的點與被碰撞物進(jìn)行fixedjoint物理連接,只要玩家不松開左鍵,這個物理關(guān)節(jié)就會一直鏈接,直到玩加松開左鍵才會斷開。這種效果會更加真實,因為它會根據(jù)物體大小來改變手指握住的那個曲度,像是真的握在上面一樣。難點就是對于rigidbody的數(shù)值比較嚴(yán)格,很難有合理的效果。抓取效果如圖4-1-4-2圖3-1-2抓取效果場景的實現(xiàn)在Unity中分了一個環(huán)境物體,里面放著該場景的所有環(huán)境物體,在這釣魚環(huán)境中我加入了汪洋大海,大海上加入了一個小島,小島上有幾棵椰子樹,因為素材上樹有動畫,加入WindZone風(fēng)向讓樹葉有吹動效果。在岸邊加入了一個小船,玩家在船上,船邊有本場景的關(guān)鍵道具魚竿和魚餌,玩家通過道具釣到一條魚到船上就算勝利。如圖3-1所示圖3-1釣魚場景圖3-1-2汽車場景釣魚場景的實現(xiàn)釣魚場景,視覺會一直跟隨左手或者右手,玩家可以切換左右手來切換視覺跟隨。汽車場景會有些不同,當(dāng)玩家操控方向盤的時候,頭部的跟隨會回到正前方,方便玩家操控汽車,當(dāng)玩家松開方向盤,攝像機(jī)就會回到左右手的跟隨。汽車場景的實現(xiàn)接在汽車場景中,我們加入一個大賽道給玩家移動,如圖3-1-2,玩家通過控制車中的方向盤和擋位進(jìn)行車的移動,玩家操控汽車通過指定的點完成游戲。釣魚場景魚竿的實現(xiàn)釣魚場景的魚竿由三部分組成,一是一個帶碰撞體的魚竿模型,二是一條由Obi插件提供的釣竿線,這條線數(shù)值十分復(fù)雜,到現(xiàn)在也只能調(diào)整到比較正常的度,三是一個可以跟魚餌碰撞的魚鉤。釣魚的基本邏輯,玩家通過右手握緊魚竿調(diào)整角度,讓魚鉤能放在自己面前,再通過左手抓住魚餌掛在魚鉤上,魚餌跟魚鉤碰撞就會讓他們之間生成一個fixedpoint而實現(xiàn)掛在上面,然后玩家通過右手調(diào)整魚竿角度讓魚餌浸到水里,水里有一個collider檢測魚餌是否在水里,經(jīng)過幾秒后,如果魚餌在水里,掛在魚鉤上隱藏的大魚就會顯現(xiàn),而原本托起魚鉤在水面的collider就會消失,而實現(xiàn)一個魚上鉤的場景,玩家調(diào)整魚竿角度讓大魚停在船上方,操控左手讓魚掉到船上,游戲通關(guān)。汽車場景汽車的實現(xiàn)汽車場景的汽車是由兩部分組成,一是汽車模型本體,承載整個汽車系統(tǒng)的是RealisticCarControllerV3的汽車插件,它的優(yōu)點是操作簡單,碰撞真實。二是汽車的方向盤和自動擋桿,我把這些單獨分離了出來,因為這個汽車插件會自動識別汽車內(nèi)的collider如果有多余的它會進(jìn)行清除,會影響我們操控。汽車內(nèi)部如下圖4-5-1。、圖4-5-1游戲效果方向盤:方向盤上有三個可供玩家觸碰的collider,玩家可以左右手去交互這三個collier,當(dāng)玩家觸碰到方向盤并進(jìn)行握住,就會觸發(fā)方向盤的轉(zhuǎn)動,方向盤的轉(zhuǎn)動角度限制為90度和-90度,等于該角度的時候便會卡住不能超過該度數(shù)。部分代碼如下:void

SteeringWheelRotate()

{

if

(isTouch

&&

!isShift)

{

if

(SteeringWeelCount

==

1

||

SteeringWeelCount

==

2

||

SteeringWeelCount

==

3)

{

float

moveSpeed

=

2f;

float

RotateSpeed

=

60f;

float

mouseX

=

Input.GetAxis("Mouse

X")

*

moveSpeed;

Vector3

_movent

=

new

Vector3(0,

0,

-mouseX);

SWheel.transform.Rotate(_movent

*

Time.deltaTime

*

RotateSpeed);

}

}

}

角度限制代碼如下:public

void

Update()

{

this.transform.position

=

steering.position;

angle

=

transform.localEulerAngles.z;

if

(CheckAngle(angle)

>

90)

transform.localEulerAngles

=

new

Vector3(transform.localEulerAngles.x,

transform.localEulerAngles.y,

90);

if

(CheckAngle(angle)

<

-90)

transform.localEulerAngles

=

new

Vector3(transform.localEulerAngles.x,

transform.localEulerAngles.y,

-90);

}

public

float

CheckAngle(float

value)

{

float

angle

=

value

-

180;

if

(angle

>

0)

return

angle

-

180;

return

angle

+

180;

}

方向盤主要控制的是前車輪,當(dāng)玩家方向盤打到90度或者-90度,車輪就會向左或向右打滿。自動手桿:自動手桿總共有三個檔,前擋,倒退檔和不動的檔。玩家通過右手交互,上下推動切換擋位,前擋只能按W前進(jìn),倒退檔只能按S倒退,不動的檔就W和S都按不了。攝像機(jī)位置兩個場景的攝像機(jī)幾乎一致,都是綁定在人模型的頭部眼睛的位置,通過頭部的旋轉(zhuǎn)來實現(xiàn)。當(dāng)玩家是用左手的時候,頭部骨骼IK會以左手為目標(biāo)進(jìn)行跟隨移動,右手也是一樣,部分代碼如下:if

(SteeringWheel.Instance.SteeringWeelCount

==

0)

{

SteeringWheel.Instance.OutSteeringWeel

=

true;

SteeringWheel.Instance.Clutch

=

false;

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKPosition(AvatarIKGoal.RightHand,

Righttarget.position);

}

else

if

(SteeringWheel.Instance.SteeringWeelCount

==

1

&&

SteeringWheel.Instance.isTouch)

{

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKPosition(AvatarIKGoal.RightHand,

SteeringWheel_1.position);

animator.SetIKRotation(AvatarIKGoal.RightHand,

SteeringWheel_1.rotation);

SteeringWheel.Instance.REyes

=

false;

SteeringWheel.Instance.OutSteeringWeel

=

false;

}

else

if

(SteeringWheel.Instance.SteeringWeelCount

==

2

&&

SteeringWheel.Instance.isTouch)

{

animator.SetIKPositionWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKRotationWeight(AvatarIKGoal.RightHand,

1f);

animator.SetIKPosition(AvatarIKGoal.RightHand,

SteeringWheel_2.position);

animator.SetIKRotation(AvatarIKGoal.RightHand,

SteeringWheel_2.rotation);

SteeringWheel.Instance.REyes

=

false;

SteeringWheel.Instance.OutSteeringWeel

=

false;

}

游戲測試游找到打包好的游戲exe文件雙擊打開,在窗口中選好游戲的分辨率,再點擊開始游戲按鈕,游戲就開始運(yùn)行了。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論