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

下載本文檔

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

文檔簡介

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

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論