1006大設(shè)計(jì)翻譯版以黃楊_第1頁
1006大設(shè)計(jì)翻譯版以黃楊_第2頁
1006大設(shè)計(jì)翻譯版以黃楊_第3頁
1006大設(shè)計(jì)翻譯版以黃楊_第4頁
1006大設(shè)計(jì)翻譯版以黃楊_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

緒 選題背景與意 發(fā)展現(xiàn) 研究內(nèi)容及方 結(jié) Unity引 Unity引擎簡 Unity基本功能介 基本概 剛體物 動(dòng)畫系 可擴(kuò)展編輯 傳統(tǒng)方法的缺陷與應(yīng) 需求分析與設(shè) 人物控制器的邏輯需求分 人物控制器的美術(shù)需求分 傳統(tǒng)狀態(tài)機(jī)架 總體架構(gòu)設(shè) 解決方 狀態(tài)機(jī)層級結(jié) 機(jī) 關(guān)鍵幀算 動(dòng)畫速率控 小 具體功能的設(shè)計(jì)與實(shí) 輸入響 輸入響應(yīng)需 實(shí)現(xiàn)方 運(yùn)動(dòng)物 由曲線輸入位 物理擊打效 的碰撞檢 打擊效 停 閃 相機(jī).......................................................................................................... 參數(shù)監(jiān) 小 實(shí)現(xiàn)效果與................................................................................................................效果比 開發(fā)效 可視化編輯內(nèi) 工作流程的優(yōu) 使用者反 小 結(jié)論與展 致 參考文 器射擊敵人、與場景中特殊互動(dòng)。例如:精英,等;ARPG。通常采用第三人稱跟隨俯視角,玩家在一個(gè)平面的地形上移動(dòng),入按鍵多,不僅不同動(dòng)作、不同時(shí)間、不同按鍵組合的情況下能夠不同的跳轉(zhuǎn),而ACT人物控制器主要1.21.1的青睞。至2014年4月,根據(jù)其的數(shù)據(jù)已經(jīng)有超過60%的移動(dòng)游戲開發(fā)采用了Unity引擎[2]。Unity上內(nèi)置了一套人物控制器組件,但是僅限于通用游戲開發(fā),并未針第二部分:Unity引擎架構(gòu),并且實(shí)現(xiàn)人物控制器基礎(chǔ)的部分和可視化編輯方案。UnityUnityUnity是由Unity開發(fā)的一個(gè)讓玩家輕松創(chuàng)建諸如三維游戲、建筑(c)為迪斯尼和ImangiStudios的卡通魔幻風(fēng)格縱深跑酷游戲《TempleRun:魔境仙 yStation3、Xbox360、開發(fā)友好:Unity支持C#、JavaScript、Boo等進(jìn)行游戲開發(fā),并且對這些運(yùn)行而不用修改代碼。由于游戲開發(fā)者多慣用C++,C#相對于另外兩者更容易上手,的第插件庫,不論是簡單的功能擴(kuò)展還是復(fù)雜的功能組件都可以找到快速的解Hierarchy窗口,以樹形結(jié)構(gòu),按名稱顯示場景中所有的物體。開發(fā)者在這里對場景中的物體進(jìn)行選擇、層級關(guān)系編輯、創(chuàng)建、或刪除; 或者打開特定的全局屬性時(shí),Inspector2.3MonoDevelopUnitySceneScene中有以下重要的概念構(gòu)成了場景運(yùn)行GameObjectGameObject,GameObject按樹形層級結(jié)構(gòu)組織,通過父子關(guān)系來確定空間變換關(guān)系。GameObject既可以是有型場景中存在的所有GameObject及其層級關(guān)系;ComponentGameObjectGameObject的類別只運(yùn)行在一個(gè)GameObject上存在一個(gè)實(shí)例,比如剛體。開發(fā)者可以通過Inspector窗口檢視所選GameObject上掛在的Component及其屬性;Component。開發(fā)者可以編寫自定義,繼承MonoBehavior類,然后定義一些響應(yīng)方法,當(dāng)GameObject上有發(fā)生時(shí),指定的方被運(yùn)行。比如:GameObjectUpdateUpdate方法調(diào)StartOnCollisionEnter方法等。MonoBehavior是Component的一個(gè)子類,默認(rèn)情況下中定義的public成員變量會(huì)Collider:Collider組件管理碰撞范圍和表面屬性,當(dāng)GameObject上掛載了Collider走之后,物理引擎才將其作為物理實(shí)體進(jìn)行碰撞檢測。Collider本身并不是一ComponentBoxCollider、CapsuleCollider、SphereCollider等基本形狀,還包括使用指定的網(wǎng)格模型進(jìn)行碰撞的MeshCollider。當(dāng)碰撞發(fā)生時(shí),物理引擎向發(fā)生碰撞的兩個(gè)GameObject上的所有MonoBehaviorOnCollisionEnter、OnCollisionStay、OnCollisionExit消息并且進(jìn)ColliderTrigger選Exit消息,但是不執(zhí)行物理計(jì)算[4];除此之外,UnityRayCast、SphereCast等方法提供主動(dòng)的碰撞檢測,碰撞范圍可視化等功能,已經(jīng)較為完備,版的Unity中,還包括了一套2D的物理組Unity提供了傳統(tǒng)動(dòng)畫組件,在版中還引入了Mecanim動(dòng)畫控制狀態(tài)機(jī)。傳統(tǒng)Animation和AnimationState:Animation是動(dòng)畫的組件,是Component的子類。開發(fā)者必須將Animation掛載到GameObject上以AnimationClip。而每個(gè)AnimationClipAnimationAnimationState來控制當(dāng)前動(dòng)畫實(shí)例的狀態(tài)。AnimationState封裝了動(dòng)畫的主要功能,包括正常的控制、速度控AnimationCurve:AnimationCurveAnimationClip中的一種資源,開者通過在關(guān)鍵幀添加AnimationEvent來實(shí)現(xiàn)偵聽動(dòng)畫狀態(tài)并且將邏輯綁定到動(dòng)畫上。AnimationEvent功能支持在到指定的幀時(shí)回調(diào)該GameObject上掛載的某個(gè)MonoBehavior類中的一個(gè)基本類型參數(shù)或者無參數(shù)方法[6]。Mecanim動(dòng)畫狀態(tài)系統(tǒng)在傳統(tǒng)動(dòng)畫組件的基礎(chǔ)上,增加了動(dòng)畫狀態(tài)機(jī)的功能,圖2.4所示:每個(gè)動(dòng)畫都被作為一個(gè)狀態(tài)塊,動(dòng)畫之間的跳轉(zhuǎn)被用白色箭頭線標(biāo)準(zhǔn)。主其他的Unity原生動(dòng)畫組件方,難以根據(jù)特殊需求進(jìn)行自定義,因此在本文中不作詳細(xì)2.4MecanimUnityEditor文件夾,Unity將會(huì)自動(dòng)將其中的文件歸入編輯器工程內(nèi)。開發(fā)者主要可以通過以下幾ScriptableObject:開發(fā)者可以將ScriptableObject類,并且使用 ACTARPG類人物動(dòng)作設(shè)計(jì)作為游戲設(shè)計(jì)的需求,其具體動(dòng)作跳轉(zhuǎn)圖如圖3.1所示:3.1kAttack3。3連擊的動(dòng)畫不同,效果也不同。隨著動(dòng)作的不同,時(shí)角色也會(huì)當(dāng)人物是受到時(shí),人物根據(jù)受傷后HP數(shù)值,如果大于0則跳轉(zhuǎn)到受傷狀態(tài),如果小于等于0,則跳轉(zhuǎn)到Dead狀態(tài);360度回旋斬,周圍所有的敵人,并且在玩家的搖桿引導(dǎo)下朝某個(gè)方向移動(dòng);或者Try的情況,游戲設(shè)計(jì)師經(jīng)常會(huì)有一些天才的想法和設(shè)計(jì)需要驗(yàn)證,開發(fā)人員很難預(yù)測,當(dāng)人物進(jìn)行并且作出位移的時(shí)候,由于動(dòng)作產(chǎn)生的位移應(yīng)當(dāng)盡可能真效果是正好敵人時(shí)發(fā)生的、敵人瞬間會(huì)感受到動(dòng)作的停頓、被擊打動(dòng)畫的快入慢回等。為了增強(qiáng)打擊的效果,可以配合以一些火花的特效、鏡頭的、被GameObject在場景中產(chǎn)生,不再接受人物動(dòng)ACT人物,游戲中各個(gè)元素與動(dòng)畫的精密配合是3.23.2Character人物控制器類:控制器類管理一個(gè)人物可能有的所有狀態(tài),并且根據(jù)StateControllerState的子類,并執(zhí)行具Idle狀態(tài)類,Move狀態(tài)類,Attack狀態(tài)類,Injured狀SpecialCharacterStateCharacter只需要負(fù)責(zé)在不同類之間切換并且向CharacterState發(fā)送。公用邏輯產(chǎn)生問題,以圖3.3的情況為例:3.3MoveStateSpecial2State共享,但是“判定盒接觸敵人時(shí)發(fā)生”邏輯又被AttackStateSpecial1StateSpecial2State共享,MoveState、AttackState、Special1State卻又不共享“鍵觸發(fā)跳轉(zhuǎn)到狀態(tài)”等邏輯。且將子類邏輯寫死在代碼中的設(shè)計(jì)使得設(shè)計(jì)師依賴開發(fā)者去修改一些子類的邏輯,現(xiàn),確實(shí)可以解決共些邏輯代碼,也能簡單地向設(shè)計(jì)師提供更大的自由度來管理每過多的類成員變量,另一方面State類中的方法也會(huì)過多,這都造成工程代碼的,降低了可性,甚至?xí)炷軉栴}??梢娺@種架構(gòu)并沒有真正解決代碼通用性和可性的思路:將邏輯與動(dòng)畫綁定。上文提到,UnityAnimationEvent的功能,GameObjectMonoBehavior成員方法,不帶參數(shù)或者只有一個(gè)基本類型參數(shù),而且該方法不能被重載,使用起來也非常不方便。相比之下,自己實(shí)現(xiàn)對動(dòng)畫管理的代價(jià)相對較小。因此,可作架構(gòu)和有限狀態(tài)機(jī)運(yùn)行部分的功能。4.1的分離,它的主要職責(zé)變?yōu)楣芾懋?dāng)前狀態(tài)的動(dòng)畫。因此稱其為AnimatedState,并且是KeyFrame的聚合。主要職責(zé)即是該狀態(tài)所指定的動(dòng)畫,并且向動(dòng)畫的幀發(fā)送開始Next指定的狀態(tài),Next可以為空表示無跳轉(zhuǎn)操作,也可以為自身表示循環(huán);Action是所有獨(dú)立邏輯單元的抽象類,提供兩個(gè)基本接口:ActionEnter在人物進(jìn)入所KeyFrameActionExitKeyFrame被調(diào)用。新增一類邏四個(gè)類的協(xié)作關(guān)系:CharacterAnimatedState,并且維持其中一個(gè)處于運(yùn)AnimatedStateAnimatedState管理多個(gè)KeyFrame,并且順序;每個(gè)KeyFrame上都可以掛載Action,在被時(shí)激活這些Action;Action在激活時(shí)運(yùn)行指定邏輯可以人物并且對其進(jìn)行處理。與傳統(tǒng)方法一:UnityAnimationClipAnimation窗口(如圖4.2)將其通過對Unity文檔的閱讀和分析,Unity并沒有提供編輯器內(nèi)置的窗口實(shí)現(xiàn)UI元素繪制,要支持各種狀頭、DirectionalLight(定向光、SingletonofVirtualScreen(用以后期效果處理的抽象CharacterStateKeyFrameAction四層的層級結(jié)GameObject編輯方法已經(jīng)完備,并且可以使用菜單快速擴(kuò)展4.4最后,利用層級窗口實(shí)現(xiàn)狀態(tài)可視化的開發(fā)代價(jià)是少量的,僅需要將狀態(tài)邏輯掛載到具體的GameObject上即可。每個(gè)人物最頂層的GameObject上掛載Character,以該節(jié)點(diǎn)作為人物的根根節(jié)點(diǎn)之下有模型節(jié)點(diǎn),節(jié)點(diǎn)名為模型名字berserker_model,由于模型名稱并不確定,需要在Character中建立;另一個(gè)是狀態(tài)表節(jié)點(diǎn),以States命名,這個(gè)節(jié)點(diǎn)不需要掛載,其作用相當(dāng)于一個(gè)文件夾,所有狀態(tài)將會(huì)成為子節(jié)點(diǎn)被其收納;態(tài)、Idle狀態(tài)、Move狀態(tài),掛載State;動(dòng)的瞬間空氣摩擦、并且在揮動(dòng)過程中擁有碰撞的邏輯,因此其狀態(tài)下還建立了Frame8、Frame8to11的關(guān)鍵幀,以掛載這兩個(gè)邏輯;點(diǎn)然后在Inspector中進(jìn)行查看。Unity可視化開發(fā)設(shè)計(jì)的一條而是將層級窗口中掛載有State的狀態(tài)節(jié)點(diǎn)拖至需要賦值的屬性上,從根本上避免圖4.5Character檢視和拖拉效Character類屬性檢視效果如圖CurStateCharacterNameDefendState、DefenseBrokenState、InjuredState、FallState、DeadState為一系指定。這些狀態(tài)都需要通過拖拽StateListAttackRange為范圍,預(yù)留以來控制AI行為轉(zhuǎn)狀態(tài),CurFrame顯示了當(dāng)前幀便于調(diào)試。其他狀態(tài)與動(dòng)畫有關(guān),在下章中進(jìn)行4.6AnimatedStateKeyFrame以及掛在的Action如圖4.7所示,其中KeyFrame中的Always表4.7KeyFrame以及掛載的Action 類型,而對其感的類可以自由或者停止,使得處理者對產(chǎn)生者保持透明[8]。這種處理下,復(fù)雜的事務(wù)處理被分解,產(chǎn)生和處理邏輯獨(dú)立開來,4.8逐級傳遞方法圖4.8所示:Character將發(fā)送至當(dāng)前活躍的State,State將發(fā)送給當(dāng)前活躍的KeyFrame,而KeyFrame需要將轉(zhuǎn)發(fā)給感的Action。不同的都使用不同接口,為了傳遞,在State和KeyFrame中也存在所有Action所需的接口的副本。4.9的詢問機(jī)制:State通過詢問當(dāng)前活躍的所有KeyFrame來告知Character活躍Action,這使得State和KeyFrame不必要建立傳遞接其實(shí)狀態(tài)機(jī)內(nèi)部也可以使用同樣的消息機(jī)制,由Action主動(dòng)去Character子類而言,只需要在重載ActionEnter時(shí)感的event,在ActionExit停止同時(shí)向者和全局者發(fā)送。由于此處較多地依賴語言特性進(jìn)行了代碼實(shí)現(xiàn),為了表現(xiàn)語言相關(guān)性,貼出如下代碼:publicclassGameEvent<T>//定義一個(gè)模板類,T為類{publiceventSystem.Action<T>publicstaticeventSystem.Action<T>publicboollistened//檢查是否有{get{returnOnEvent!=null||OnEventGlobal!=null;}//按源發(fā)送publicvoidSendEventMessage(T{if(OnEvent!=null)//向源的對象發(fā)if(OnEventGlobal!=null)//向全局此類型的對象發(fā)送}publicstaticvoidSendGlobalEventMessage(T{if(OnEventGlobal!=null)}}害Damaged為例,的定義代碼實(shí)現(xiàn)如下:publicclass{publicCharactercharacter;//受傷人物publicCharactersender; //打擊者publicInjuryInformationinjury;//信息}publicGameEvent<Damaged>onDamaged=new表.1狀態(tài)功能的基本的名StateFrame般情況下StateUpdate與FrameUpdate都是每秒發(fā)送60各個(gè),但是一旦動(dòng)畫將會(huì)進(jìn)行State與Frame更新關(guān)系的詳細(xì)解釋。ActionKeyFrameKeyFrameState,同時(shí)Action自身的ActionEnter與ActionExit是強(qiáng)制的默認(rèn),具有一定特殊性,因此不使用GameEvent進(jìn)行實(shí)現(xiàn),而由KeyFrame進(jìn)行直接調(diào)用接口的。關(guān)鍵幀算State管理多個(gè)KeyFrame,每當(dāng)Character的更新來臨時(shí),State都得知?jiǎng)赢嫴シ帕艘粠?,并且根?jù)進(jìn)入時(shí)動(dòng)畫始終從第0幀開始,因此可以迭代記錄當(dāng)前幀號,記錄變量CurrentFrame。而每個(gè)KeyFrame都有記錄開始幀號和結(jié)束幀號,記錄變量StartFrame與EndFrameKeyFrameEndFrameStartFrame1。State管理和所有的KeyFrame表,當(dāng)檢查到對于某個(gè)KeyFrame,有CurrentFrame>=StartFrame&&CurrentFrameEndFrame時(shí)候,該關(guān)鍵幀為活動(dòng);否則即為非活動(dòng)。而一個(gè)狀態(tài)因跳轉(zhuǎn)而中斷的情況ListKeyFrame,即可得到KeyFrame的進(jìn)入和退出。表.2關(guān)鍵幀交A34B5C8D9EIndex;IndexIndexKeyFrame遍歷ActiveFrame表的簡單方法。動(dòng)畫速率控對動(dòng)畫速率控制的需求來源于兩方面。從美術(shù)上說,從數(shù)據(jù)上調(diào)整速率來避免資源的替換能夠提高調(diào)試效率;而從游戲設(shè)計(jì)上說,改變動(dòng)畫以及整個(gè)狀態(tài)的速度是一種常有的需求,比如一種增強(qiáng)魔法能夠加速玩家的跑動(dòng)速度和速度方。由于本多功能綁定,因此也要支持實(shí)現(xiàn)改變動(dòng)畫速度時(shí),邏輯與關(guān)鍵幀的綁定不被破壞,KeyFrameActionState接受到人物更新消息時(shí),加SpeedCurrentFrameDeltaFrameDeltaFrame1*AnimationSpeed。最后CurrentFrame到CurrentFrame+DeltaFrame之間的整數(shù)幀號,進(jìn)行離散的Frame更新。率發(fā)生變化。State總是保持與物理引擎速度相同的頻率進(jìn)行更新;在Animation>1FrameUpdateAnimationSpeed1時(shí),F(xiàn)rameUpdate的時(shí)間頻率也降低,可能多個(gè)StateUpdate過程中僅包含一次FrameUpdate。區(qū)分這兩種主要是為FrameUpdate,而一些不隨動(dòng)畫速率改變的動(dòng)作,例如“獲得5秒無敵狀態(tài)”等狀態(tài)就需要StateUpdate。KeyFrame概念的引入,使得邏輯綁定動(dòng)畫的功能更加易用。利用層級窗口進(jìn)行狀可性。另外GameEvent機(jī)制的設(shè)置,使得處理對于發(fā)生保持透明,并且可且保證了工程的可性。要實(shí)現(xiàn)的功能包括處理玩家或者AI的輸入、控制人物的物理運(yùn)動(dòng)、檢測碰撞和打UI的交互等等。這里由于篇幅限制,僅選取開中最的部分即質(zhì)量與效率的平衡,也較為針對所選的Unity平臺(tái),因此著重介紹。一個(gè)游戲最為的部分即是提供交互性,對輸入的響應(yīng)是重要的一步。而由于鍵,在空閑狀態(tài)按下,觸發(fā)的將是原地動(dòng)作;而移動(dòng)狀態(tài)按下時(shí),觸發(fā)的是向的情況作為最早跳轉(zhuǎn)幀為0的一個(gè)特例。由于本項(xiàng)目處于移動(dòng)平臺(tái),輸入都來源于觸屏方式的UI按鍵,然后根據(jù)玩家轉(zhuǎn)到空閑狀態(tài);另外在狀態(tài)的末尾幾幀,玩家可以使用拉下移動(dòng)鍵提前進(jìn)入移動(dòng)狀態(tài)。由具體應(yīng)用中可見,需要提供屬性以區(qū)分方向輸入開始和方向輸入結(jié)束。 5.1名floatButtonCommandCharacterButtonCommandCharacterButtonTypefloatButtonCommandCharacterButtonTypefloat以向輸入方向慢慢移動(dòng)但是不改變其角色面朝向,比如連續(xù)的360度回旋斬。然后根據(jù)以上類型的需求,分別建立對應(yīng)的Action的子類,在子類邏輯中向?qū)崿F(xiàn)效果如圖5.1TransitionOnButtonEventEventType指定按鍵彈起或是按下、ButtonType指定按鍵類型、ToState指定跳轉(zhuǎn)目標(biāo)狀態(tài),ActionFrame指TransitionOnDirectionEventEventType指定搖桿輸入彈起或是按下、ToState指定跳轉(zhuǎn)目標(biāo)狀態(tài)。Unity中為了實(shí)現(xiàn)動(dòng)態(tài)的碰撞檢用Rigidbody的功能來實(shí)現(xiàn)。在XZ軸上的旋轉(zhuǎn)角度。如圖5.2。另外,RigidbodyDrag參數(shù)可以用來控制阻力,LinearVelocity能夠直接控制運(yùn)LerpLerprotationSpeedcharacter.transform.rotation=Quaternion.Lerp(character.transform.rotation,Quaternion.Euler(newVector3(0,character.targetRotation,0)),rotationSpeed*Time.fixedDeltaTime);RigidbodyLinearVelocity來實(shí)現(xiàn)Unity提供了AnimationCurve的曲線編輯器,但該編輯器是完全圖形化的,沒5.3當(dāng)人物收到但未被擊倒時(shí),人物需要受傷動(dòng)畫,并且根據(jù)的推力適當(dāng)當(dāng)發(fā)生時(shí),會(huì)調(diào)用Rigidbody的Add RigidbodyRigidbody被然而人物騰空到落地時(shí),應(yīng)當(dāng)有地面后小小反彈,然后保持躺在地上的效果。為了使人物能夠在落地時(shí)候進(jìn)行跳轉(zhuǎn),此處定義了一個(gè)HitGround,當(dāng)人物的碰撞盒重新接觸地面時(shí),就會(huì)發(fā)送一個(gè)HitTound,為了響應(yīng)這個(gè),建立一個(gè)TransitionOnHitGround的跳轉(zhuǎn),指定落地時(shí)跳轉(zhuǎn)到的狀態(tài)。這個(gè)和Action的的狀態(tài)跳轉(zhuǎn)來說,無需關(guān)心它需要多久才能洛回到地上,只需要使用TransitionOnHitGround跳轉(zhuǎn)到指定的落地Pose狀態(tài),可以進(jìn)行自由的設(shè)計(jì)。 5.4將的碰撞檢測綁定到根據(jù)的形狀將碰撞盒綁定到上,當(dāng)揮動(dòng)時(shí),判定盒也跟隨進(jìn)行運(yùn)動(dòng)。在高速揮動(dòng)的幾幀內(nèi)若的碰撞盒敵人時(shí)候便認(rèn)為。這種方法不需的范圍相當(dāng)于一個(gè)扇形,而較小的碰撞盒在每一幀的停留不足以覆蓋整個(gè)應(yīng)[9](如圖5.4:魚處于劍掃過的范圍上理應(yīng)發(fā)生碰撞,但是劍兩幀的碰撞范圍均未與魚。為了保證沒有落網(wǎng)之魚,需要使用連續(xù)的碰撞檢測方法,性能開銷較大。RayCastSphereCast方法,即僅有射線和球形檢測,并且沒有原生的可視化ColliderDisabled;而當(dāng)關(guān)鍵幀活動(dòng)時(shí),果玩家時(shí)沒有運(yùn)動(dòng),就檢查不到這此。經(jīng)過,發(fā)現(xiàn)這是由于Unity的物理DisabledColliderEnabled時(shí),Rigidbody并沒有發(fā)生運(yùn)動(dòng),所以剛EnableCollider時(shí)手動(dòng)調(diào)用Rigidbody的WakeUp方法,強(qiáng)制將其激活,退出睡眠狀態(tài)而進(jìn)行碰撞檢測。一些特殊形狀之間的碰撞檢測,會(huì)需要網(wǎng)狀的相互碰撞算法。使用Unity已經(jīng)給出的Collider形狀已較為實(shí)用,并且可以通過多個(gè)Collider進(jìn)行拼接來模擬稍顯復(fù)雜的碰撞上,這些特效的實(shí)現(xiàn)邏輯互相獨(dú)立,互不,在邏輯上也沒有執(zhí)行順序的要求,可以利用機(jī)制來編寫效果邏輯,并且提供對設(shè)計(jì)師來說更為直觀的管理。5.5在真實(shí)世界中,拳頭揮空和的時(shí)候是有區(qū)別的,在的一瞬間者會(huì)當(dāng)時(shí),者的動(dòng)畫將暫停,同時(shí)速度暫時(shí)為0;被者跳轉(zhuǎn)到受的動(dòng)畫,然后暫停在受動(dòng)畫的第一幀,速度同樣暫時(shí)為0,在暫停期間,人物的還要作小范圍的相對于機(jī)視角的水平方向。暫停時(shí)間大約一般保持0.1秒以度恢復(fù)停幀的狀態(tài),被者因?yàn)榻邮芰?,速度?huì)變?yōu)橥屏λ鶐淼乃俣?。擊狀態(tài),人物狀態(tài)由被規(guī)則而進(jìn)行跳轉(zhuǎn)。停幀狀態(tài)(時(shí)錄暫停前的動(dòng)畫速度,而在暫停時(shí)將動(dòng)畫速度暫時(shí)歸0,結(jié)束后再恢復(fù)。對于停幀狀態(tài)(被停幀狀態(tài)在停幀狀態(tài)基礎(chǔ)上,再執(zhí)行的效果。這種只是純視覺效果,void{Vector3camForcamera.transform.forward;Vector3shakeNorm=newVector3(camFor.z,0,-//根據(jù)時(shí)間計(jì)算函數(shù)相floatphase=floatshakedTime=delayFrames*phase=Mathf.Cos(shakedTime*shakeFrequency*Mathf.PI*modelTransformRef.localPosition=shakeNorm*shakeDistance*} 實(shí)現(xiàn)了一個(gè)簡單的shader,能夠指定變化顏色,其主要原理是對像素器進(jìn)行自身變白。通過流失時(shí)間來控制白色數(shù),以達(dá)到按時(shí)間漸變的效果。由于沒有對頂U(kuò)nitySurfaceShaderShader代碼編寫即能夠快速的相機(jī)的還分為兩種形式,一個(gè)是位移,又稱平動(dòng),相機(jī)保持拍攝的方向不變,進(jìn)行上下左右二維的晃動(dòng);另一個(gè)是軸向,又稱旋轉(zhuǎn),相機(jī)的位置不變,浩宇單純使用位移,能夠更好地模擬擊打時(shí)的感覺,而位移用于、等好似受到?jīng)_擊,給玩家更強(qiáng)力度反饋。為了制作較好的效果,此處采用Unity資值、位移幅度(向量、軸向幅度(向量而對每一個(gè)打擊而言,都能分別設(shè)置不同的強(qiáng)度。5.6HUDUIUIUI的顯示位置不是與UIHUD在游戲場景中GameObject的子節(jié)點(diǎn)進(jìn)行管理,這樣一來不僅所見即所得,而且已經(jīng)實(shí)然而,UnityNGUIUIUI元素來顯示效果會(huì)帶來如3D2DUIRoot節(jié)點(diǎn),會(huì)導(dǎo)致三維的場景和二維的節(jié)點(diǎn)交叉混合,破壞場景點(diǎn)統(tǒng)一性。NGUI機(jī)通常使用正交投影,而三維機(jī)都是投影,用不同的機(jī)拍HUD擺放擺放在目標(biāo)位置不能真正讓該HUD在游戲中切實(shí)地顯示在響應(yīng)的位置。HUDHUD被場景中的其它景物阻擋的問題,當(dāng)3D2DUI有相當(dāng)多的問題需要解決,最好能夠找到其他UI跟隨一個(gè)人物并且懸掛于該人物的頭頂時(shí),由HUD是一條捷徑,在堅(jiān)持這一點(diǎn)的情UI元素,同時(shí)在每幀更新時(shí),將自身的屏幕位置投影到UI所在的機(jī)空間,并且主HUD顯示的原理,而可以簡單地認(rèn)為這是一個(gè)嵌入三維場景中HUD,并且以子節(jié)點(diǎn)方式控制其跟隨和相對位置。需要對人物的和綁定;缺點(diǎn)在于其更新過程需要進(jìn)行矩陣計(jì)算。雖然有利有弊,但是在場景中HUD數(shù)量不多的情況下,性能損耗尚可接受。InfieldPanelUIHPNumberUI元素,更新其位置。UI組件進(jìn)行更新,在C#編程中,使用event即可快速添加。然而,游戲中需要關(guān)注的參數(shù)太多,使用event一一為其建立的做法,每次修BUG在測試環(huán)節(jié)容易被發(fā)現(xiàn),也容易修正,但是每次走一遍流程也會(huì)使效率降而且能夠提高可性,減少錯(cuò)誤發(fā)生的可能。那么這能否實(shí)現(xiàn)呢?這需要從C#語言上文也提到C#提供了event參數(shù),能夠方便地定義[11]。數(shù)值和定的event。Value屬性的Set方法中將自動(dòng)發(fā)出OnValueChange,OnValuepublicclass{publicMonitoredInt(int{_value=}[SerializeFieldprivateint_valuepublicintValue//給外界的Value屬{get{return_value;}{intlastValue=_value=if(OnValueChangednull)在值改變時(shí)發(fā)送{}}}publicdelegatevoidOnValueChangedDelegate(intnewValue,publiceventOnValueChangedDelegateOnValueChanged;定義}MonitoredIntMonitoredInt類型的加減乘除運(yùn)算符都需要重載。使得兩個(gè)被監(jiān)視符均進(jìn)行重載,使得MonitoredInt能夠與其他Int類型進(jìn)行比較。C#implicitoperatorintInt類型的方法,重載了這個(gè)隱式轉(zhuǎn)換之后,在需要使用Int作為參數(shù)的地方均可傳入MonitoredInt。publicstaticimplicitoperatorint(MonitoredInt{return}publicoverridestringToString{return}由于C#不支持重載賦值操作符,每次修改MonitoredInt類型數(shù)值時(shí),需要Monitored版本。這部分的代碼的可UnityCollider組件可子節(jié)點(diǎn)控制的HUD以及參數(shù)監(jiān)視類。法進(jìn)行開發(fā)相比較,對工作流程的效率改善情況進(jìn)評。20131219Glu在iOS平臺(tái)上的《永恒戰(zhàn)士3》作為參考[12],而主機(jī)平臺(tái)上我們選取2008年1月31日在PS3、Xbox360上由公司的《鬼泣4》作為參考[13]。兩狀態(tài)切換的過渡處理表6.1所示:表.1主要?jiǎng)赢嬊袚Q過渡方法和效果4》中,主角的每一個(gè)招數(shù)后都能有數(shù)種后續(xù)的進(jìn)攻方式,形成大量分支的4》中主狀態(tài)起跑、跑步結(jié)束回到空閑、從狀態(tài)末尾開始進(jìn)入等等基本的過渡全部都是生切,而且生切前后的與動(dòng)作趨勢也都不相接近,效果極其生硬。只有連招狀態(tài)之間的生切前后的基本能夠銜接上。任何狀態(tài)下釋放技能也都沒有過渡動(dòng)畫。Slash的效果如表6.2所示:表.24》中的角色在自由運(yùn)動(dòng)狀態(tài)下都能做到動(dòng)畫與位移的完美配合,跑步、攻的演示人物,出招時(shí),腳下位移配合人物動(dòng)畫快速上步前進(jìn),急速變緩的動(dòng)作下,戲試玩并且對慢動(dòng)作進(jìn)行比對,對三款游戲的打擊感細(xì)節(jié)做法如表6.3所示:《鬼泣4》作為老牌動(dòng)作游戲廠商的優(yōu)秀的主機(jī)平臺(tái)動(dòng)作游戲,其打擊感各方面都相當(dāng)?shù)轿?,其中各種特效與的時(shí)機(jī)配合都非常完美,停頓特效改進(jìn)表.3被人無無有有移和角度移和角度不同的范圍,使得無論在揮舞過程中任意時(shí)刻敵人都能夠發(fā)生準(zhǔn)確的只是缺少閃白效果,稍稍減少了切實(shí)的感受。而《永恒戰(zhàn)士3》的打擊感有很大的問題,不僅時(shí)機(jī)稍早于動(dòng)畫,而且打擊火花的位置只是簡單地處理在被擊物的中心、時(shí)間也是

溫馨提示

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

評論

0/150

提交評論