版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
4.1NGUI
4.2動畫系統(tǒng)
4.3Animator(動畫)
4.4動畫層及事件應(yīng)用
4.5燈光系統(tǒng)
4.6粒子系統(tǒng)4.1NGUI4.1.1NGUI簡介在Unity4.6之前的版本中,引擎自帶的UI系統(tǒng)功能不完善,市面上大多數(shù)項(xiàng)目進(jìn)行UI界面開發(fā)的時候,使用的都是第三方插件NGUI。NGUI是一組用C#語言編寫的,并專門為Unity引擎所使用的插件。NGUI的第一個版本于2011年12月面世,經(jīng)過10年的發(fā)展和沉淀,現(xiàn)如今它已經(jīng)成為世界上使用最廣泛且最成熟的UnityUI插件,完美地彌補(bǔ)了Unity引擎本機(jī)GUI系統(tǒng)的各種缺點(diǎn)。可以說NGUI是Unity平臺最強(qiáng)大的第三方UI系統(tǒng)。4.1.2下載與安裝1.下載(1)必須先在Unity商店中購買NGUI插件,然后才能使用。(2)在互聯(lián)網(wǎng)搜索NGUI插件,下載后直接拖入Unity面板即可。2.安裝在一個Unity項(xiàng)目上導(dǎo)入NGUI插件資源包,導(dǎo)入NGUI后,“NGUI”菜單將出現(xiàn)在Unity的菜單欄上,其中包含NGUI的所有操作功能。NGUI插件目錄結(jié)構(gòu)如下:(1)Editor:編輯器擴(kuò)展。(2)Examples:示例工程。(3)Resources:資源文件。(4)Scripts:腳本組件。4.1.3基本控件NGUI基本控件如圖4.1所示。各基本控件說明如下:(1)AttachaCollider:指為NGUI的某些對象添加碰撞器。如果接口是使用NGUI制作的,則只能以這種方式添加。(2)AttachanAnchor:表示已將UIAnchor腳本添加到對象,即錨點(diǎn),其作用是可以指定攝像機(jī)的9個點(diǎn)為對象的錨點(diǎn),當(dāng)攝像機(jī)的尺寸變化(即屏幕尺寸變化)時,錨點(diǎn)組件可以校正其當(dāng)前的位置,將需要相對定位的組件拖入錨點(diǎn)組件中即可實(shí)現(xiàn)組件的相對定位。(3)AttachUIStretch:表示已將UIStretch腳本添加到對象以提供縮放功能。(4)MakePixelPerfect:表示已自動為用戶調(diào)整“Transform”的大小。(5)CreateaPanel:創(chuàng)建一個面,相當(dāng)于一個容器,里面的Button、Label、CheckBox控件全部包含在Panel里面。(6)CreateaWidget:創(chuàng)建小部件的工具,例如Button、Label、Sprite等。(7)CreateaNewUI:創(chuàng)建一個新的UI界面。(8)FontMaker:創(chuàng)建字體。4.1.4高級控件下面對菜單欄ComponentFNGUI的高級控件及其作用進(jìn)行逐一介紹。1.Examples面板屬性(1)PanWithMouse:表示分配的對象將根據(jù)鼠標(biāo)的變化而移動。(2)LookAtTarget:表示該物體朝向你的目標(biāo)物體(Target)。(3)LoadLevelOnClick:表示單擊按鈕后加載另一個場景,只需輸入要加載到LevelName中的場景名稱。(4)Spin:旋轉(zhuǎn)。(5)SpinWithMouse:跟著鼠標(biāo)旋轉(zhuǎn)。(6)TypeWriterEffect:作用于標(biāo)簽,打字風(fēng)格。(7)ChatInput:將輸入框中的內(nèi)容提交到文本框。2.UILabel面板控制1)字體文件(1)字體圖集:將用過的單詞處理成圖片使用,更適合英語國家。(2)TTF字體:直接使用TTF格式的字體顯示文本。2)UILabel面板屬性(1)FontSize(字體大小):控制文字顯示的大小和基本樣式普通、粗體、斜體、粗體+斜體。(2)Text(文字):UILable要顯示的文字,可以輸入多行。(3)Modifier(調(diào)節(jié)器):控制英文顯示狀態(tài),包括正常狀態(tài)、大寫狀態(tài)、小寫狀態(tài)。(4)Overflow(溢出):處理顯示當(dāng)文本大小超過Widget中Size屬性的大小。具體包括:ShrinkContent:收縮內(nèi)容(再大也無效)。ClampContent:夾緊內(nèi)容(只要能顯示幾個字就可以顯示)。UseEllipsis:是否使用省略符。ResizeFreely:調(diào)整自由(小部件中的大小會自動與字體大小同步)。ResizeHeight:調(diào)整高度(固定寬度,自動調(diào)整高度)。(5)Alignment(對齊方式):設(shè)置文字的對齊方式。(6)Gradient(漸變顏色):設(shè)置文字從上到下的顏色漸變。(7)Effect(特效):設(shè)置文字特效,比如:顏色描邊,投影。(8)Spacing(間距):設(shè)置文字與文字之間的間距大小。(9)ColorTint(色彩化):設(shè)置文字顯示的顏色。3.UISprite面板控制1)UISprite顯示圖片(1)創(chuàng)建UISprite組件,步驟為在菜單欄中依次選擇NGUI→Create→Sprite。(2)選擇圖集,選擇要顯示的圖片。(3)單擊Widget中的“Snap”按鈕以顯示圖片的原始大小。(4)在窗口Widget的“Aspect”中選擇“BasedOnWidth”,方便調(diào)整圖像的比例。2)UISprite面板屬性(1)Type:(類型/模式)。(2)Simple:簡單模式,默認(rèn)展示效果
(3)Sliced:九宮模式,適合按鈕背景圖像處理(九宮演示處理)。(4)Tiled:平鋪模式,使用該圖片平鋪Widget中Size的區(qū)域。
(5)Flip:進(jìn)度模式,最復(fù)雜的圖片模式。其中,F(xiàn)illDir指填充方向;FillAmount指填充量;InvertFill指翻轉(zhuǎn)填充。4.UIButton面板控制1)UIButton制作按鈕(1)基礎(chǔ)說明。在UI生成過程中,UILabel用于顯示文本,UISprite用于顯示圖像。
無論用戶界面多么復(fù)雜,它都以最基本的文本+圖像的形式顯示(創(chuàng)建),如圖4.2所示。使用鼠標(biāo)單擊UI,可以響應(yīng)該單擊的UI組件稱為UIButton。可以基于UILable和UISprite添加UIButton組件,以創(chuàng)建自己的個性化UI按鈕。(2)按鈕制作如圖4.3所示,具體步驟如下:①
展現(xiàn)一張圖片或者一段文字。②
在菜單欄依次點(diǎn)擊NGUI→Attach→Collider確定可以點(diǎn)擊的區(qū)域,其實(shí)點(diǎn)擊按鈕的操作就是在這個Collider區(qū)域進(jìn)行交互的。③
在菜單欄依次點(diǎn)擊NGUI→Attach→ButtonScript附加按鈕組件。
2)UIButton面板屬性(1)UIButton:將鼠標(biāo)置于按鈕上更改目標(biāo)對象的顏色。(2)UIButtonScale:將鼠標(biāo)置于按鈕上使目標(biāo)對象變大或變小,在“Hover”下調(diào)整X,Y,Z的比例。(3)UIButtonOffset:將鼠標(biāo)放在按鈕上移動目標(biāo)對象。(4)UIButtonSound:鼠標(biāo)點(diǎn)擊按鈕發(fā)出聲音。(5)UIButtonActivate:用鼠標(biāo)單擊按鈕后,目標(biāo)對象將從禁用狀態(tài)更改為啟用狀態(tài)(觸發(fā)對象)。(6)Colors:用顏色描述按鈕的4種狀態(tài)。如果用戶不希望顏色影響圖片效果,則可以選擇所有四種顏色為白色。(7)UIButtonRotation:將鼠標(biāo)移至按鈕后,目標(biāo)對象旋轉(zhuǎn)一定程度,在“Hover”下調(diào)整X,Y,Z旋轉(zhuǎn)的程度。(8)UIButtonTween:用鼠標(biāo)單擊按鈕后,將轉(zhuǎn)換目標(biāo)對象。Tween組件中的變換需要添加到目標(biāo)對象,并且需要從一開始就啟用目標(biāo)對象的變換,否則當(dāng)用戶開始運(yùn)行時它將顯示在游戲轉(zhuǎn)換中。(9)UIButtonPlayAnimation:鼠標(biāo)單擊按鈕后,將播放目標(biāo)動畫。(10)UIButtonMessage:傳遞消息,編寫一個公共函數(shù)來告訴系統(tǒng)要傳遞的消息內(nèi)容,在目標(biāo)對象上設(shè)置腳本,然后編寫傳遞消息的函數(shù)名稱。3)Sprites精靈Sprites精靈可以在一張圖(整體圖像集合)中截取一部分作為一個精靈,然后使用精靈來描述按鈕的四種狀態(tài)。按鈕的四種狀態(tài)如下:(1)Normal(*):默認(rèn)原始狀態(tài)。(2)Hover:經(jīng)過停留狀態(tài)。(3)Pressed(*):按下狀態(tài)。(4)Disabled:不可用狀態(tài)。5.CheckBox對多選框CheckBox進(jìn)行不同的勾選,會有不同的效果。(1)UICheckBox:用于多選框的選擇與取消。(2)UICheckBoxControlledObject:如果取消選中此復(fù)選框,則將禁用目標(biāo)對象和所有子對象。(3)UICheckBoxControlledComponent:當(dāng)將此腳本添加到CheckBox并選擇了多選按鈕時,將顯示此腳本的目標(biāo)。如果未選擇多選按鈕,則此腳本的目標(biāo)將被隱藏。6.DragDrag主要用于實(shí)現(xiàn)拖拽功能。(1)UIDragCamera:將此組件添加到對象,然后將UIDraggableCamera組件添加到Camera中,表示該Camera允許被拖拽。(2)UIDragPanelContents:表示該面的所有組件允許被拖拽的。7.其他(1)UIForwardEvents:表示從對象到另一個轉(zhuǎn)發(fā)事件。(2)UISoundVolume:用于Slider控件中。(3)UICenterOnChild:通常在拖動事件中使用,首先將UIDraggablePanel腳本添加到面板,然后將UIDragObject或UIDragPanelContents添加到要拖動的對象,最后將UICenterOnChild添加到網(wǎng)格根目錄。無論怎樣拖動容器中的對象,網(wǎng)格始終保持水平或垂直居中。(4)UIInputValidator:在輸入字段中使用。在將此腳本添加到輸入字段后,Logic中會有多個選項(xiàng)。None表示將不執(zhí)行任何驗(yàn)證,用戶可以輸入任何字符(中文除外)。Integer表示用戶只能輸入整數(shù)、英語和各種特殊字符。Double表示只能輸入浮點(diǎn)數(shù)。Alphanumeric表示用戶可以輸入英文、數(shù)字和特殊字符。Username表示可以輸入英文、數(shù)字和一些特殊字符(小數(shù)點(diǎn)除外)。Name表示只能輸入英文、特殊字符和其他字符(小數(shù)點(diǎn)除外)。(5)UIPanelAlpha:可以用于任何控件,將此腳本添加到對象,可以在Alpha中調(diào)整參數(shù),0表示完全透明,0~1表示越來越不透明,大于1的數(shù)字表示完全不透明。(6)UIPopupList:通過NGUI創(chuàng)建PopupList控件時,該控件用于下拉列表框(PopupList)。將添加此腳本,并且可以在“選項(xiàng)”下添加下拉列表框的子級。(7)UIScrollBar:用于滾動條,Value代表當(dāng)前滾動條的位置,Size代表滾動條的標(biāo)準(zhǔn)尺寸,Alpha代表滾動條的透明度,Direction可以選擇滾動條是垂直還是水平。(8)UISlider:用于滑動框,Value表示填充的滑動框的比例,Direction表示用戶可以選擇滑動框是垂直還是水平。8.TweenTween組件可以實(shí)現(xiàn)對象的透明度、顏色、位置、旋轉(zhuǎn)、大小和縮放的變化。Tween組件如圖4.4所示。1)組件功能(1)SpringPosition:表示轉(zhuǎn)換后的對象的位置,Target是目標(biāo)位置,對象將從起始位置移動到目標(biāo)位置。(2)TweenAlpha:表示物體的透明度從某一個值到另一個值,F(xiàn)rom表示開始的值,To表示之后的值。(3)TweenColor:表示物體的顏色從某一個值到另一個值,F(xiàn)rom表示開始的顏色,To表示之后的顏色。(4)TweenPosition:表示物體的坐標(biāo)從一個位置到另一個位置,F(xiàn)rom表示開始的位置,To表示之后的位置。(5)TweenRotation:表示物體從一個角度到另一個角度的變換,F(xiàn)rom表示開始的角度,To表示之后的角度。(6)TweenScale:表示對象大小從某個值到另一個值的轉(zhuǎn)換,F(xiàn)rom表示開始的大小,To表示之后的大小。(7)TweenTransform:表示物體的Transform變換,F(xiàn)rom表示開始的對象位置,To表示之后的對象位置。2)具體使用添加一個Alpha組件到UI上,這個緩動效果會直接作用到UI上。Alpha組件提供的屬性(所有的緩動組件屬性都大致相同)如圖4.5所示。TweenAlpha組件的屬性作用如下:(1)From:緩動開始的值。(2)To:緩動結(jié)束的值。(3)PlayStyle:播放的風(fēng)格,共有3種風(fēng)格,其中Once表示播放一次,Loop表示循環(huán)播放,PingPong表示循環(huán)往復(fù)播放。(4)AnimationCurve:Unity3D自帶的動畫曲線編輯器,可以在這里編輯緩動的曲線效果,可以實(shí)現(xiàn)線性動畫或越來越快的動畫效果等。(5)Duration:播放一次動畫所需的時間。(6)StartDelay:開始播放動畫前等待的時間。(7)TweenGroup:動畫所屬的組,在下文的UIPlayTween組件中使用。(8)IgnoreTimeScale:Unity3D的TimeScale值修改時是否會影響到該緩動動畫。(9)OnFinished:動畫播放結(jié)束時調(diào)用指定對象的指定方法,注意拖拽到該區(qū)域的GameObject必須帶有腳本組件,同時Loop和PingPong永遠(yuǎn)不會執(zhí)行到該方法。3)動畫控制單獨(dú)在組件上使用緩動動畫腳本意義不大,還需要對緩動動畫進(jìn)行控制才能制作出理想的效果。UIPlayTween是NGUI提供的一個腳本組件,可以用來控制多個動畫的播放,其參數(shù)如圖4.6所示。UIPlayTween的屬性作用如下:(1)TweenTarget:控制的目標(biāo)對象,為空表示控制自身添加的緩動對象,也可以指定特定的對象表示控制該對象上的緩動動畫。(2)IncludeChildren:是否控制目標(biāo)對象上子物體的緩動組件。(3)TweenGroup:具體控制的緩動組件的組號,只會控制設(shè)定組號為該數(shù)字的緩動組件。(4)Triggercondition:觸發(fā)機(jī)制,可以選擇觸發(fā)緩動動畫的事件機(jī)制,比如點(diǎn)擊當(dāng)前對象或者別的事件,注意和TweenTarget無關(guān),僅針對當(dāng)前對象。(5)Playdirection:播放方向?yàn)镕orward從From到To播放,Toggle從From到To后從To到From如此反復(fù),Reverse從To到From。(6)IfTargetisdisabled:目標(biāo)物體被禁用時的處理。DoNothing指不做任何處理,EnableThenPlay指激活目標(biāo)物體播放動畫。(7)Ifalreadyplaying:目標(biāo)動畫已經(jīng)在播放時的處理。Continue指繼續(xù)播放,Restart指重新播放,RestartIfNotPlaying指等待播放完畢再播放一次。(8)Whenfinished:播放完畢后對目標(biāo)物體的處理。DoNotDisable指不做任何處理、DisableAfterForward指正向播放完畢后禁用物體、DisableAfterReverse指反向播放完畢后禁用物體。(9)OnFinished:播放完所有動畫后的回調(diào)方法。使用該組件時一般會將掛載在目標(biāo)對象上的緩動腳本禁用,否則動畫會一開始就播放,這就失去了控制的意義。另外,該組件控制的是一個物體或包括該物體子物體的緩動,如果是簡單的緩動可以直接使用NGUI提供的組件,如果是較為復(fù)雜的緩動推薦使用專業(yè)的第三方緩動類庫,如DOTween等。9.CreateaWidgetCreateaWidget用于創(chuàng)建控件的功能,可以創(chuàng)建以下控件:(1)創(chuàng)建標(biāo)簽:Label。(2)創(chuàng)建下拉列表框:PopupList。(3)創(chuàng)建進(jìn)度條:ProgressBar。(4)創(chuàng)建滑動條:Slider。(5)創(chuàng)建輸入框:Input。(6)創(chuàng)建滾動條:ScrollBar。(7)創(chuàng)建按鈕:Button。(8)創(chuàng)建多選框:CheckBox。10.UIScrollView滾動視口組件,當(dāng)需要滾動指定區(qū)域中的一個或多個對象時可以使用它??梢詫crollView添加到任何UI。添加良好的ScrollView之后,發(fā)現(xiàn)它已綁定到兩個腳本,如圖4.7所示。UIPanel組件主要用于將內(nèi)容裁剪到視口之外,其主要參數(shù)的含義如下:(1)Clipping:剪輯類型。(2)None:無需編輯,移出可見區(qū)域的圖像仍然可見。(3)TextureMask:可以選擇一張貼圖作為遮罩。(4)SoftClip:軟編輯,默認(rèn)情況下處于此模式。(5)Constrainbutdon’tClip:約束不能從視口中拖出,不能編輯。如果選擇了SoftClip,則會出現(xiàn)以下可選項(xiàng):(1)Offset:視口偏移量。(2)Center:和Offset效果一致。(3)Size:視口尺寸。(4)Softness:剪輯邊緣柔和度。UIScrollView組件如圖4.8所示。該組件用于控制視口滾動功能。其核心屬性作用如下:(1)ContentOrigin:滾動起點(diǎn)。默認(rèn)為左上角。(2)Movement:滾動方向。Horizontal為水平方向、Vertical為垂直方向、Unrestrained為自由拖動、Custom為自定義方向。(3)DragEffect:拖動效果。None為無效果,Momentum為帶慣性的拖動、MomentumAndSpring為慣性和彈性阻力(超過極限值后,它將自動跳回到正常位置)。(4)ScorllWheelFactor:車輪系數(shù)。該值越大,滾動速度越快。(5)MomentumAmount:慣性系數(shù)。該值越大,滾動時的慣性越大。(6)RestrictWithinPanel:拖動是否僅限于視口,默認(rèn)情況下可以選擇。(7)CancelDragIfFits:當(dāng)對象恰好適合視口時,會退出拖動。(8)SmoothDragStart:選中后,拖動將開始具有緩沖感;如果未選中,則拖動將以鼠標(biāo)移動的速度進(jìn)行。(9)IOSDragEmulation:模擬IOS的拖拽效果,可以增強(qiáng)拖拽體驗(yàn)。(10)ScrollBars:滾動條屬性允許自己設(shè)置滾動條,留空則表示不使用滾動條。(11)在ScrollBars的ShowCondition屬性中,Always指總是顯示滾動條;OnlyIfNeed指當(dāng)需要顯示時出現(xiàn);WhenDragging指拖拽時出現(xiàn)。11.UIGrid通常不直接添加UIGrid對象(因?yàn)閁IGrid對象需要依靠父對象來確定其大小,所以不能單獨(dú)設(shè)置大小),可以先創(chuàng)建一個InvisibleWidget,然后創(chuàng)建一個UIGrid組件在創(chuàng)建的對象下,最后用戶需要將已排序的組件拖到UIGrid上。當(dāng)需要在編輯界面中排列子對象時,可以單擊設(shè)置菜單,如圖4.9所示。UIGrid的屬性作用如下:(1)Arrangement:網(wǎng)格排列方向。Horizontal指水平排列、Vertical指垂直排列、CellSnap指按子項(xiàng)當(dāng)前的位置對齊子項(xiàng)。(2)CellWidth:子項(xiàng)格子寬度。(3)CellHeight:子項(xiàng)格子高度。(4)ColumnLimit:子項(xiàng)最大數(shù)量。(5)Sorting:排序方式。None按照Index排序,Alphabetic按照名稱排序,Horizontal和Vertical按照localPosition進(jìn)行排序,Custom按照自定義排序。(6)Pivot:網(wǎng)格起始點(diǎn)錨點(diǎn)。12.UITableUIGrid是用于水平或垂直地對子級進(jìn)行排序,而UITable是用于在換行符中對子級進(jìn)行排序。UITable的屬性如圖4.11所示。UITable屬性作用如下:(1)Columns:列數(shù),超過該數(shù)目會添加一行。(2)Direction:行添加方向,Down向下添加、Up向上添加。(3)Sorting:排序方式。None按照Index排序、Alphabetic按照名稱排序、Horizontal和Vertical按照localPosition進(jìn)行排序、Custom按照自定義排序。(4)Pivot:網(wǎng)格起始點(diǎn)錨點(diǎn)。(5)CellAlignment:格子對齊點(diǎn)。(6)Padding:間隔。4.1.5事件監(jiān)聽NGUI事件函數(shù)可以用NGUI控制腳本或帶有沖突對象的腳本(由具有UICamera組件的相機(jī)渲染)編寫。(1)voidOnHover(boolisOver):當(dāng)鼠標(biāo)懸?;蛞瞥鰰r觸發(fā)。懸停時返回true,移出時返回false。(2)voidOnPress(boolisDown):在按下或釋放鼠標(biāo)或觸摸時觸發(fā),按下時觸發(fā),觸發(fā)時釋放。(3)voidOnClick():當(dāng)鼠標(biāo)或觸摸單擊(按下并釋放)時觸發(fā)。(4)voidOnDoubleClick():雙擊時觸發(fā)(雙擊間隔小于0.25?s)。(5)voidOnSelect(boolselected):與單擊類似,不同之處在于,如果此期間選擇了其他控件,在一次選擇之后將不再觸發(fā)OnSelect事件。(6)voidOnDrag(Vector2delta):當(dāng)按下或移動鼠標(biāo)或觸摸時觸發(fā),增量是輸入位移。(7)voidOnInput(stringtext):僅用于輸入控件,在每次輸入后觸發(fā),這次將在輸入的信息中傳遞文本,而不是輸入控件中的文本信息。(8)voidOnTooltip(boolshow):當(dāng)鼠標(biāo)懸停一段時間或移開時觸發(fā),懸停時返回true,移開時返回false。(9)voidOnScroll(floatdelta):滾動鼠標(biāo)中鍵時觸發(fā),增量是傳入的滾動增量。4.2動畫系統(tǒng)4.2.1Legacy動畫系統(tǒng)Unity3D的Mecanim動畫系統(tǒng)非常強(qiáng)大,作為Unity推薦的動畫系統(tǒng),目前它和Legacy動畫系統(tǒng)共同存在,但將來它會完全取代Legacy動畫系統(tǒng)?,F(xiàn)在先使用Unity的資源來學(xué)習(xí)舊版Legacy動畫系統(tǒng),創(chuàng)建一個Unity3D項(xiàng)目,在菜單欄中依次選擇Assets→ImportPackage→CharacterController,并將人物導(dǎo)入資源中以便使用Legacy動畫系統(tǒng)。1.模型文件對于骨骼這一項(xiàng),發(fā)現(xiàn)動畫類型設(shè)置為“Legacy”,表明此模型使用的動畫類型是動畫系統(tǒng)的舊版本,如圖4.12所示。再看看動畫頁,如圖4.13所示。在動畫頁面中,可以編輯動畫剪輯。2.控制動畫直接將FBX文件拖到場景中,Unity將自動為其添加兩個組件,即Transform和Animation(注意,Mecanim動畫系統(tǒng)使用Animator組件,而Legacy動畫系統(tǒng)使用Animation組件)。Animation組件如圖4.14所示。Animation組件的設(shè)置還是比較簡單的,其屬性作用如下:(1)Animation:當(dāng)前播放的動畫。(2)Animations:所有可以播放的動畫。(3)PlayAutomatically:是否自動播放。(4)AnimatePhysics:動畫是否與現(xiàn)實(shí)世界互動。(5)CullingType:動畫不可見時是否繼續(xù)播放,默認(rèn)情況下選擇OK選項(xiàng)都可以。單擊播放按鈕,用戶可以看到動畫正常播放。4.2.2Legacy動畫控制1.腳本控制如何使用腳本來控制動畫的播放。可以將以下腳本綁定到角色,示例代碼如下:運(yùn)行該程序,將看到兩行按鈕,第一行按鈕使用Play方法切換動畫,第二行按鈕使用CrossFade播放動畫。2.Play與CrossFade的區(qū)別以從跑步切換到站立動畫為例。Play可以直接切換動畫。如果角色先前處于傾斜的跑步狀態(tài),那么它將立即變?yōu)檎玖顟B(tài),這在性能上不是很真實(shí),特別是在兩個動畫姿勢完全不同時更不真實(shí)。CrossFade通過動畫融合切換動畫。第二參數(shù)可以指示融合的時間。如果角色先前處于傾斜的行走狀態(tài),則它將在指定的融合時間內(nèi)逐漸變?yōu)檎玖顟B(tài),這更接近角色動作的實(shí)際切換效果。3.PlayQueued該方法可以指定當(dāng)前動畫完成后要播放的動畫。4.文件格式和資源加載一般的模型使用通用的FBX格式,因此通常在兩種情況下保存動畫文件。一種是將所有動畫和模型保存在一個文件中,另一種是將模型保存在一個文件中,而動畫保存在一個文件中。5.模型動畫都存放在一個文件中的情況
該結(jié)構(gòu)類似于Unity提供的CharacterController中的資源。FBX文件用于保存模型,骨骼和動畫,如圖4.15所示。6.模型動畫分開存放的情況
模型和動畫存儲在多個FBX文件中,如圖4.16所示。
上圖中雖然有一個Take001的動畫,但是實(shí)際上并不使用該動畫,而是使用下面僅保存了動畫的FBX文件,如圖4.17所示。4.2.3Mecanim動畫系統(tǒng)1.認(rèn)識Mecanim動畫系統(tǒng)Mecanim動畫系統(tǒng)是Unity3D4.0推出的全新動畫系統(tǒng),主要提供以下4種功能:(1)針對人形角色提供一套特殊的工作流。(2)動畫重定向功能使將動畫從一個角色模型應(yīng)用于其他角色模型非常方便。(3)提供可視化的動畫編輯器,可以輕松創(chuàng)建和預(yù)覽動畫剪輯。(4)提供可視化的Animator編輯器,可以輕松管理多個動畫切換狀態(tài)。2.工作流1)模型的準(zhǔn)備Unity無法制作3D模型并綁定骨骼,這些需要由專業(yè)建模人員完成。常用的建模軟件有3DMax、Maya、Cinema4D、Blender、Mixamo。在模型建立好之后,只需要將這些資源導(dǎo)入Unity3D中即可使用。2)角色設(shè)置
導(dǎo)入Unity3D中的資源需要進(jìn)行一些簡單設(shè)置,主要分為人形角色的設(shè)置和通用角色的設(shè)置兩種。3)讓角色運(yùn)動
通過Unity3DMecanim提供的各種工具可以配置動畫,以便可以正常播放。常用的Mecanim模塊有動畫剪輯、動畫狀態(tài)機(jī)、混合樹、動畫參數(shù)。3.示例
學(xué)習(xí)動畫系統(tǒng)需要特定的動畫文件和資源。在這里,使用課題項(xiàng)目虛擬課堂中使用的資源包。依次選擇菜單欄中的Assets→ImportPackage→Character,導(dǎo)入資源中的人物使用Mecanim動畫系統(tǒng)模型。4.2.4模型導(dǎo)入要在Unity3D中使用模型和動畫,則需要一定的開發(fā)過程來實(shí)現(xiàn)。以下是基于人形模型的開發(fā)過程。1.模型制作(1)模型建模(Modelling):通常會在建模時制作一個稱為T型姿勢(雙臂張開)的模型。(2)骨骼綁定(Rigging):為了將骨骼綁定到先前制作的模型上,必須確保骨骼數(shù)量不能少于15,并且同時遵循Unity3D標(biāo)準(zhǔn)進(jìn)行骨骼生成。(3)蒙皮(Skinning):繪制權(quán)重的過程是設(shè)置受骨骼影響的模型的每個三角形的權(quán)重,以使骨骼可以影響模型并產(chǎn)生動畫。2.模型導(dǎo)入Unity3D支持以下模型格式的文件導(dǎo)入:FBX、OBJ、MAX、MB、BLEND。
由于諸如MAX類型的文件是相應(yīng)建模軟件的源文件,因此Unity3D需要安裝3DMax來支持該文件,而其他文件相同,因此更好的文件格式是FBX,這是一種通用的3D文件格式,盡管OBJ也是一種通用的3D文件格式,但是它不支持動畫等功能,通常僅用于靜態(tài)對象。3.FBXSDK
這里提供FBX的SDK下載地址為/products/fbx/overview。4.導(dǎo)入到Unity3D中
導(dǎo)入非常簡單,只需要在Project面板中右擊選擇“ImportNewAsset...”,然后在彈出的菜單中選擇FBX文件即可。5.模型配置
在Project面板中選擇導(dǎo)入的模型后,將在Inspector面板中看到模型的配置信息。下面給出相關(guān)選項(xiàng)卡官方網(wǎng)站的說明鏈接:(1)Model:/Manual/FBXImporter-Model.html。
當(dāng)模型需要使用光照貼圖烘焙系統(tǒng)時,需要選中“GenerateLightmap”UVs選項(xiàng)以打開第二組UV。(2)Rig:/Manual/FBXImporter-Rig.html。
這里需要說的是骨頭的類型,None表示沒有骨骼,Legacy表示為舊版動畫系統(tǒng)的骨架,Generic表示為通用的骨骼,Humanoid表示為人形骨骼。
如果選擇了Humanoid類型,則可以單擊“Configura...”按鈕來修改人體骨骼和肌肉的配置。4.2.5AnimationView(動畫視圖)1.動畫組件之間的關(guān)系動畫組件之間的關(guān)系如圖4.18所示。
在這里可以看到綁定到GameObject的Animator組件控制了動畫播放的模型。
屬性Controller對應(yīng)于一個AnimatorController文件,該文件可以在Animator窗口中打開。它是一個設(shè)計為狀態(tài)機(jī)的系統(tǒng),可以在此接口上設(shè)置多個狀態(tài)之間的切換關(guān)系。AnimatorController中的每個狀態(tài)則對應(yīng)一個AnimationClip,每個AnimationClip是一個簡單的動畫單元,可以在Animation窗口中打開。2.動畫文件1)AnimationClip文件
如果FBX包含動畫文件,則可以在其中創(chuàng)建多個動畫剪輯,并且每個AnimationClip都包含一個簡單的動畫,如Idle、Run等。2)Animation文件
舊版的動畫格式文件,使用XML數(shù)據(jù)記錄動畫信息。3)ApplyRootMotion選項(xiàng)Animator組件中有一個名為ApplyRootMotion的可選項(xiàng)。如果未選擇此選項(xiàng),動畫將根據(jù)世界坐標(biāo)移動,即Animation值將直接設(shè)置為目標(biāo)位置。選中此選項(xiàng)后,動畫設(shè)置將添加到目標(biāo)位置。3.事件系統(tǒng)
對于一個動畫,還可以為其任意幀添加一個事件。首先,為MainCamera添加一個接收Event事件的組件,示例代碼如下:
接下來,向Animation窗口中的任意幀添加一個事件,如圖4.19所示,并調(diào)用ShowAnimMsg方法以便同時傳遞字符串,運(yùn)行游戲后就會看到輸出結(jié)果。4.2.6AnimationState(動畫狀態(tài))1.動畫的設(shè)置AnimationClip窗口如圖4.20所示。AnimationClip的屬性作用如下:(1)Looptime:動畫是否循環(huán)播放。(2)RootTransformRotation:表示為有關(guān)播放動畫的對象旋轉(zhuǎn)的信息。(3)RootTransformPosition(Y):表示為播放動畫的對象的位置,Y軸信息。(4)RootTransformPosition(XZ):表示為播放動畫XZ平面信息的對象的位置。上述3個屬性都有一致的選項(xiàng),這些選項(xiàng)是:·BakeIntoPose:未選中表示動畫所產(chǎn)生的旋轉(zhuǎn)或位移將應(yīng)用于動畫的主要對象,這意味著它不會應(yīng)用于動畫的主要對象。·BasedUpon:基準(zhǔn)點(diǎn),該選項(xiàng)有3種類型,其中,Original表示參考點(diǎn)使用動畫文件中的預(yù)設(shè)值;CenterofMass表示參考點(diǎn)使用重心,這意味著角色的下半身將嵌入地面;Feet表示基準(zhǔn)點(diǎn)使用第一幀的腳。2.動畫狀態(tài)動畫狀態(tài)如圖4.21所示,點(diǎn)擊項(xiàng)目中任意一個AnimatorController,打開Animator界面可以看到該狀態(tài)界面。該圖展示的顯示面板是標(biāo)準(zhǔn)的有限狀態(tài)機(jī)配置面板。系統(tǒng)生成3個狀態(tài)“Entry”“AnyState”和“Exit”,其他狀態(tài)由自己創(chuàng)建和管理。每個狀態(tài)都由帶有箭頭的線段連接,表示該狀態(tài)可以轉(zhuǎn)換為指向狀態(tài)。3.狀態(tài)面板
狀態(tài)關(guān)系切換以后再點(diǎn)擊任意一個狀態(tài),在Inspector面板可以看到該狀態(tài)的詳細(xì)信息,如圖4.22所示。
狀態(tài)窗口的屬性作用如下:(1)Motion:表示當(dāng)前狀態(tài)對應(yīng)的AnimationClip。(2)Speed:表示當(dāng)前狀態(tài)速度,1代表正常速度,后面的參數(shù)刻度表示使用參數(shù)代表當(dāng)前速度,輸入框?qū)⒊蔀橄吕x擇框。可以選擇指定的參數(shù),可以在Parameters面板中進(jìn)行配置,其功能是通過代碼輕松修改參數(shù)值,以達(dá)到調(diào)速的目的。(3)Mirror:表示是否沿Y軸翻轉(zhuǎn)動畫,通常用于重用動畫。如果選中此項(xiàng)目,則召喚右手的動畫將變?yōu)檎賳咀笫帧?4)CycleOffset:表示播放偏移量。(5)FootIK:當(dāng)需要將腳靠近地面時,可以打開通常關(guān)閉的腳的IK動畫(反向動力學(xué))。(6)WriteDefaults:播放動畫后是否將狀態(tài)重置為默認(rèn)狀態(tài),通常進(jìn)行檢查。
下面的Transitions面板將列出可以轉(zhuǎn)換為其他狀態(tài)的當(dāng)前狀態(tài)。選中Solo表示當(dāng)前過渡是唯一的過渡,即當(dāng)前狀態(tài)只能過渡到此項(xiàng)目指向的狀態(tài)。選中Mute表示關(guān)閉此動畫過渡,即當(dāng)前狀態(tài)無法過渡到此項(xiàng)目指向的狀態(tài)。4.3Animator(動畫)4.3.1AnimatorController(動畫控制器)1.簡介AnimatorController是一種文件類型,在Unity中作為單獨(dú)的配置文件存在,并具有后綴Controller。AnimatorController包括以下功能:(1)可以對多個動畫進(jìn)行整合。(2)使用狀態(tài)機(jī)來實(shí)現(xiàn)動畫的播放和切換。(3)可以實(shí)現(xiàn)動畫融合和分層播放。(4)動畫回放的深入控制可以通過腳本來完成。
圖4.23所示為動畫的組成結(jié)構(gòu)。Animator組件用于控制角色動畫的播放。所需的兩個核心內(nèi)容是動畫控制器AnimatorController,用于控制動畫的播放邏輯,以及動畫骨架Avatar對象,用于控制角色動畫的播放。2.Animator組件
播放動畫的角色都需要添加Animator組件,該組件即為控制動畫的接口,Animator組件如圖4.24所示。Animator組件的屬性作用如下:(1)Controller:使用的AnimatorController文件。(2)Avatar:使用的骨骼文件。(3)ApplyRootMotion:綁定到該游戲?qū)ο蟮腉ameObject的位置是否可以通過動畫來更改。(4)UpdateMode:更新模式。Normal表示使用Update進(jìn)行更新,AnimatePhysics表示使用FixUpdate進(jìn)行更新,UnscaleTime表示無視timeScale進(jìn)行更新)。(5)CullingMode:剔除模式。AlwaysAnimate意味著即使看不見相機(jī)也將更新動畫,CullUpdateTransform表示如果看不見相機(jī),動畫將暫停,但位置將繼續(xù)更新,CullCompletely表示對照相機(jī)的所有更新,相機(jī)不可見時動畫將停止。下方還會顯示動畫的一些主要信息。3.AnimatorOverrideController
右鍵創(chuàng)建資源時會發(fā)現(xiàn)這樣的一個資源——AnimatorOverrideController,該資源的意思是根據(jù)AnimatorController修改每個狀態(tài)的動畫,其他設(shè)置保持不變,這可以輕松地重用創(chuàng)建的AnimatorController。4.創(chuàng)建一個AnimatorController
在Project視圖中右擊菜單可以創(chuàng)建AnimatorController,如圖4.25所示為新創(chuàng)建的AnimatorController。
在該界面中發(fā)現(xiàn)3個默認(rèn)狀態(tài),它們是Unity自動創(chuàng)建的,無法刪除。(1)Entry:在調(diào)用當(dāng)前狀態(tài)機(jī)時顯示條目。在狀態(tài)機(jī)之后進(jìn)入的與該狀態(tài)關(guān)聯(lián)的第一個狀態(tài)。(2)AnyState:表示任何狀態(tài),并具有它所指向的狀態(tài)是可以隨時切換狀態(tài)的功能。(3)Exit:表示要退出當(dāng)前狀態(tài)機(jī)。如果狀態(tài)指向出口,則意味著可以從指定狀態(tài)退出當(dāng)前狀態(tài)機(jī)。5.創(chuàng)建新狀態(tài)可以通過右鍵菜單進(jìn)行創(chuàng)建,如圖4.26所示。
或者可以通過將動畫剪輯拖放到狀態(tài)機(jī)窗口來創(chuàng)建??梢园l(fā)現(xiàn)創(chuàng)建的第一個狀態(tài)被設(shè)置為默認(rèn)的第一個狀態(tài),第一個狀態(tài)會被標(biāo)記為黃色,如圖4.27所示??梢允褂蒙鲜鰞煞N方法來創(chuàng)建多個狀態(tài),同時配置好每個狀態(tài),如圖4.28所示。6.狀態(tài)切換
狀態(tài)機(jī)已經(jīng)有了狀態(tài),但是還沒有指定每個狀態(tài)之間的關(guān)系,下面來看看該如何指定狀態(tài)之間的關(guān)系。
在Mecanim中,不再通過調(diào)用Play等方法在動畫之間切換播放,而是通過判斷參數(shù)的轉(zhuǎn)換來切換狀態(tài)(即動畫)。打開Parameters面板,該面板用于設(shè)置狀態(tài)機(jī)使用的各種參數(shù),如圖4.29所示。單擊“+”號創(chuàng)建參數(shù),可以在Unity中創(chuàng)建4種類型的參數(shù):(1)Float:浮點(diǎn)類型參數(shù),主要用于控制狀態(tài)機(jī)內(nèi)部的浮點(diǎn)參數(shù)。(2)Int:整型參數(shù),主要用于控制狀態(tài)機(jī)內(nèi)部的整數(shù)參數(shù)。(3)Bool:布爾型參數(shù),主要用于狀態(tài)切換。(4)Trigger:本質(zhì)上是布爾類型參數(shù),但默認(rèn)情況下其值為false,設(shè)置為true后,系統(tǒng)會自動將其恢復(fù)為true,否則,默認(rèn)為false。下面創(chuàng)建兩個簡單的Bool類型變量,如圖4.30所示。希望當(dāng)Walk為true時,角色行走,當(dāng)Walk為false時,角色站立,并且Run相同,但它將過渡為運(yùn)行。
接下來,用戶可以通過右鍵單擊狀態(tài)菜單以指示當(dāng)前狀態(tài)已轉(zhuǎn)換為目標(biāo)狀態(tài),拖出狀態(tài)轉(zhuǎn)換線,如圖4.31所示??梢詥螕粼撔性贗nspector窗口中設(shè)置轉(zhuǎn)換條件,如圖4.32所示。
在條件框中將Walk設(shè)置為true,這意味著將Walk設(shè)置為true時,它將從站立動畫跳到行走動畫。同樣,步行回到站立狀態(tài)需要轉(zhuǎn)換線,但步行應(yīng)設(shè)置為false,如圖4.33所示。Run的設(shè)置與Walk一致。7.HasExitTime發(fā)現(xiàn)該行中有一個復(fù)選框HasExitTime,如圖4.34所示。
如果選中此選項(xiàng),則在轉(zhuǎn)換動畫時,將等待當(dāng)前動畫完成后再切換到下一個動畫。如果當(dāng)前動畫是循環(huán)動畫,則在當(dāng)前播放完成后等待轉(zhuǎn)換,因此當(dāng)需要立即轉(zhuǎn)換動畫時,一定記住取消選中。另一種情況是當(dāng)前動畫完成后,當(dāng)前的動畫將自動切換到箭頭指向的下一個狀態(tài)(沒有其他跳轉(zhuǎn)條件),此時必須選擇此選項(xiàng),否則動畫結(jié)束后它將卡住。如果是循環(huán)動畫,那么最后一個圖像將始終循環(huán)播放。8.控制動畫轉(zhuǎn)換
向綁定到Animator組件的GameObject添加了以下新腳本組件,可以通過按下按鈕來更改角色的動畫。示例代碼如下:4.3.2使用腳本控制動畫1.控制人物動畫播放下面先看看AnimatorController的配置,如圖4.35所示。
角色只能在站立狀態(tài)下進(jìn)入行走狀態(tài),步行只能進(jìn)入跑步狀態(tài)或返回站立狀態(tài),跑步只能進(jìn)入跳躍狀態(tài)或返回行走狀態(tài),而跳躍只能返回跑步狀態(tài)。兩個參數(shù)分別是Float類型的moveSpeed和Trigger類型的Jump。連接的直接轉(zhuǎn)換條件為moveSpeed大于0.1角色切換到行走狀態(tài),moveSpeed大于0.9角色切換到跑步狀態(tài),小于0.1返回站立狀態(tài),moveSpeed小于0.9返回行走狀態(tài),并且Jump觸發(fā)進(jìn)入跳躍狀態(tài)。
向角色添加一個Animator組件,并綁定上面的AnimatorController文件,并綁定相應(yīng)控制腳本。2.StateMachineBehavior
在Unity5.0版本中,可以向Animator控制器中的每個狀態(tài)添加腳本,類似于專用于GameObject的MonoBehavior,可以向State添加狀態(tài)機(jī)行為,也可以打開任何Animator控制器,并且可以通過點(diǎn)擊檢查器窗口中的腳本按鈕來添加新的腳本,如圖4.36所示。
除了State外,還可以在層上添加,層可以看作是包含了整個State的一個大State,如圖4.37所示。
通過使用StateMachineBehaviour,可以在特定的時間點(diǎn)更方便地觸發(fā)一些需要的事件,但是應(yīng)該注意,通常將一些場景對象分配給StateMachineBehaviour,而不是直接將它們拖到Inspector面板中。Animator的GetBehavior方法獲取指定的StateMachineBehavior實(shí)例,然后通過腳本進(jìn)行分配。4.3.3IK動畫1.IKIK是反向動力學(xué),也就是說,用戶可以使用場景中的各種對象來控制和操縱角色身體部位的運(yùn)動。通常,骨骼動畫是從父節(jié)點(diǎn)驅(qū)動到子節(jié)點(diǎn)的傳統(tǒng)方法(即前向動態(tài))。而IK是另一種方法,是骨骼子節(jié)點(diǎn)驅(qū)動骨骼父節(jié)點(diǎn)。在特定情況下,例如當(dāng)角色在石頭上行走時,足部子節(jié)點(diǎn)需要驅(qū)動全身骨骼以響應(yīng)踩在石頭上的情況。IK可以使角色和場景適合更逼真的游戲效果。如果讀者玩過“刺客信條”系列,則主角的爬墻和飛行能力應(yīng)該會給每個人留下深刻的印象。這些是使用IK的應(yīng)用程序動畫適合特定場景的性能。使用IK時需要注意以下兩點(diǎn):(1)角色的動畫需要選擇Humanoid選項(xiàng),可以選中角色模型后,依次選擇Rig→AnimationType來找到Humanoid。(2)在菜單欄中依次選擇Window→Animator打開動畫控制器窗口,同時一定勾選IKPass。Unity3D本身已經(jīng)帶有了IK的功能,這里不再詳細(xì)介紹,感興趣的讀者可以查閱官網(wǎng)。2.FinalIK該插件是Unity自身IK的優(yōu)化和增強(qiáng),可以模擬更逼真的效果。4.4動畫層及事件應(yīng)用4.4.1AnimatorLayers(動畫分層)1.動畫分層的作用
如果用戶要開發(fā)第三人稱射擊游戲,可將人體動畫分為兩部分,上半部分根據(jù)目標(biāo)位置以及是否射擊進(jìn)行動畫處理,而下部分則將根據(jù)運(yùn)動進(jìn)行播放。2.AvatarMask
下面將使用“AvatarMask”來實(shí)現(xiàn)角色在運(yùn)行時召喚的效果。
首先,在場景中添加一個角色,同時添加一個動畫師控制器并設(shè)置跳轉(zhuǎn)條件,如圖4.38所示。
然后,將添加以下腳本來控制動畫的播放方式。為防止角色由于動畫而移動,請記住取消“ApplyRootMotion”,以便檢查動畫的效果。
希望角色在按下空格時播放召喚動畫,但不能停止跑步和跳躍動畫。需要添加一個新的Layer來管理招手動畫的播放,如圖4.39所示。
同時,必須配置召喚動畫。這里的“空閑”不需要添加任何動畫,僅表示它是空的。同時,添加了一個觸發(fā)器“wave”以指示進(jìn)入召喚動畫的條件。
接下來,設(shè)置該層的權(quán)重為1,如圖4.40所示。
點(diǎn)擊播放召喚動畫,發(fā)現(xiàn)在播放召喚動畫時其他動畫將停止。
需要創(chuàng)建一個AvatarMask文件,以指示只想播放動畫的一部分,即手部動畫,而其他部分則不會播放。在Project窗口中右鍵單擊以創(chuàng)建AvatarMask文件,如圖4.41所示。
將右手部分以外的區(qū)別關(guān)閉即可,如圖4.42所示。
這是一個稱為“Transform”的選項(xiàng),可控制是否在動畫中使用每個骨骼。如果角色有翅膀和尾巴,則使用該選項(xiàng)。
最后,將此AvatarMask拖到動畫控制器的Wave層上,如圖4.43所示。再次運(yùn)行動畫,需要的效果就出來了。3.設(shè)置解說Layers面板的設(shè)置如圖4.44所示。Layers面板的屬性作用如下:1)WeightWeight是指動畫層的權(quán)重,默認(rèn)基礎(chǔ)層必須為1。如果設(shè)置為0,將不播放當(dāng)前層的動畫,將播放1,并且將使用類似的融合在0~1之間播放動畫。例如前面的召喚示例,如果將其設(shè)置為0.5,則將播放召喚動畫,手臂只會舉到脖子上。2)MaskMask是指動畫遮罩,前面已經(jīng)詳細(xì)介紹,這里不再贅述。3)Blending動畫混合方式有以下兩種:(1)Override:重寫,表示當(dāng)前層的動畫覆蓋其他層的動畫。(2)Additive:添加,表示將當(dāng)前層的動畫量添加到其他層的動畫中。4)Sync
開啟了該功能后會多出一些選項(xiàng),可以將該功能看作復(fù)制的作用,如圖4.45所示。SourceLayer:指示哪一層是當(dāng)前層的副本。該功能提供的效果就是兩個狀態(tài)一致的層可以做出一些不同的調(diào)整。設(shè)置后,當(dāng)前級別的狀態(tài)將與指定級別完全相同或完全同步。但是,用戶可以更改特定狀態(tài)的動畫。Timing:如果當(dāng)前層和SourceLayer的動畫時間長度在同一狀態(tài)下不一致,則將根據(jù)SourceLayer的時間播放未選中的層以及動畫的播放速度(其效果是復(fù)制層的動畫可能變快或變慢)。選中此選項(xiàng)后,SourceLayer將根據(jù)復(fù)制圖層的時間進(jìn)行播放,即復(fù)制SourceLayer的播放速度動畫不會改變。5)IKPass
點(diǎn)擊勾選此選項(xiàng)框,表示啟動IK動畫。4.4.2BlendTree(混合樹)1.認(rèn)識BlendTree
除了在AnimatorController中創(chuàng)建State之外,還可以創(chuàng)建BlendTree,如圖4.46所示。BlendTree參數(shù),如圖4.47所示。BlendTree和State唯一的區(qū)別是Montion指向的類型變?yōu)锽lendTree類型。未選擇BlendTree時只能用一個動畫設(shè)置,而選擇BlendTree時可以設(shè)置為多個動畫混合。
2.一維混合樹
角色的運(yùn)行分為3個動畫,即向前運(yùn)行,向左運(yùn)行和向右運(yùn)行,其中向左運(yùn)行和向右運(yùn)行角色將有一個一定的傾斜度,這更符合實(shí)際情況,那么在狀態(tài)機(jī)中只有一個運(yùn)行狀態(tài),因此需要將運(yùn)行狀態(tài)設(shè)置為混合樹,以混合這3個動畫。
首先,需要創(chuàng)建一個新場景,拖動到角色模型中,再創(chuàng)建一個AnimatorController并對其進(jìn)行配置,如圖4.48所示。
注意:Run是混合樹而不是State。雙擊Run進(jìn)入混合樹的編輯界面。右擊混合樹添加3個Motion,如圖4.49所示。同時需要手動設(shè)定好3個方向的跑動動畫,如圖4.50所示。
還需要手動設(shè)定一個名為Direction的Float類型的參數(shù)來控制這個混合樹,如圖4.51所示。接下來,取消“AutomateThresholds”選項(xiàng)后按照如圖4.52所示設(shè)置參數(shù),系統(tǒng)將會自動配置閾值。現(xiàn)在,當(dāng)單擊預(yù)覽框查看動畫時,可以拖動紅色的短豎線以查看不同的更改,可用角度范圍是?-130~130。至此,動畫控制器就配置好了。3.腳本
使用相應(yīng)的腳本來控制人物。記住須將角色的Tag設(shè)置為Player,并且還應(yīng)該對腳本進(jìn)行一定的設(shè)置,如圖4.53所示。4.動畫方面的要求
每個混合樹的動畫都有要注意的地方:(1)動畫長度需要一致。(2)動畫的起始姿勢需要一致。5.二維混合樹
它與一維混合樹相同,但是二維混合樹被視為平面,并且需要兩個參數(shù)來控制。此模式可用于更復(fù)雜的動畫融合,因此在這里將不對其進(jìn)行深入講解??梢詫蓚€一維混合樹合并成一個二維混合樹來控制。6.多維混合樹Unity5中添加了多維混合樹,其配置更加復(fù)雜。多維混合樹通常用于面部表情動畫融合。4.4.3Mecanim動畫的資源存儲
使用FBX類型的模型和動畫文件,通常在兩種情況下存儲動畫文件。一種是將所有動畫和模型都存儲在一個文件中,另一種是將模型存儲在一個文件中,而動畫單獨(dú)存儲在另一個文件中。
以下所使用的資源是Unity3D隨附的兩種動畫資源。同時,有必要為其動畫創(chuàng)建一個相應(yīng)的AnimatorController。1.模型和動畫都存放在一個文件中的情況FBX文件保存模型、骨骼和動畫,如圖4.54所示。下面是點(diǎn)擊上圖中任一動畫后打開的控制器窗口,如圖4.55所示。應(yīng)該注意的是,官方?jīng)]有提供用于設(shè)置AnimatorController的接口,因此必須將已配置的游戲?qū)ο笞鳛轭A(yù)制組件進(jìn)行加載。2.模型和動畫分開存放的情況
模型和動畫存儲在多個FBX文件中,如圖4.56所示。
如圖4.57所示是配置的AnimatorController。除了不提供用于設(shè)置AnimatorController的界面外,在運(yùn)行時也無法添加或刪除動畫剪輯。因此,通常收集所有依賴項(xiàng)并將它們打包在一起。歸根結(jié)底,只需要一個預(yù)制件。從這個角度來看,實(shí)際上是否分割動畫,最終用法是一樣的。4.4.4高級功能應(yīng)用1.動作游戲
可以使用Unity3D的Mecanim非常簡單地實(shí)現(xiàn)諸多功能,如動畫重定向、提供可視化的Animation編輯器和Animator編輯器等,方便用戶創(chuàng)建和管理多個動畫片段。Mecanim的3個高級功能如下:(1)AnimationCurve:可以根據(jù)動畫的運(yùn)行時間來調(diào)整曲線,在播放動畫時可以獲得與該曲線相對應(yīng)的值,并且可以實(shí)現(xiàn)跳小洞的功能。(2)TargetMatch:匹配預(yù)定點(diǎn)進(jìn)行動畫播放,可以實(shí)現(xiàn)角色爬升的功能。(3)AnimationRecord:可以錄制動畫,然后播放錄制的動畫,可以實(shí)現(xiàn)時光倒流的功能。
可以說Unity3D現(xiàn)在具有開發(fā)與國際制造商相當(dāng)?shù)膭幼饔螒虻哪芰Α?.AnimationCurve
直接使用官方網(wǎng)站上的示例打開ScaleCapsule場景。在運(yùn)行游戲時,注意到角色當(dāng)前無法從墻上的洞跳出,如圖4.58所示。
原因很簡單,角色的膠囊碰撞體大于小孔。在檢查了右上角的“應(yīng)用比例”后,使角色跳躍,如圖4.59所示。
發(fā)現(xiàn)在角色跳躍時,膠囊碰撞體會收縮,角色可以鉆過這個小孔,角色跳躍后膠囊體會恢復(fù)。找到動畫文件Dive,就可以看到其設(shè)置了兩個Curve,如圖4.60所示。ScaleOffsetCapsule用于控制膠囊縮放的曲線,可以發(fā)現(xiàn)它的間隔為1→0→1。ScaleOffsetCapsule參數(shù)的設(shè)置,如圖4.61所示。ScaleOffsetCapsule參數(shù)的類型必須為Float,并且名稱必須與動畫文件中Curve的名稱一致,在播放跳躍動畫時,將根據(jù)預(yù)設(shè)曲線來設(shè)置參數(shù)。注意,該參數(shù)后面的輸入框已被禁用,無法進(jìn)入。每幀獲取參數(shù)值,以實(shí)現(xiàn)減少跳躍碰撞體的功能。3.TargetMatch
在游戲中,經(jīng)常會出現(xiàn)角色的頭和腳在某一個時刻需要放在特定的位置,其處理核心是使用Animator的MatchTarget方法,TargetMatch就是讓動畫的特定片段去匹配特定的位置。感興趣的讀者可通過網(wǎng)址/ScriptReference/Animator.MatchTarget.html來查看具體解釋。
在這里,仍然直接使用官方網(wǎng)站上給出的示例打開TargetMatch,如圖4.62所示。
觀察到已經(jīng)在該字段上方設(shè)置了一個目標(biāo)點(diǎn),并且角色的右手與此動畫重合的點(diǎn)重合。注意,帶有MatchTarget的動畫必須處于BaseLayer。MatchTarget插入角色位置的一部分和目標(biāo)點(diǎn)的位置以便移動角色。結(jié)果是高于指定的爬升動畫高度的任何爬升高度都可以調(diào)整。4.AnimationRecordUnity3D的Animator類為提供了4種錄制和播放動畫的方法:(1)StartRecording:開始錄制動畫。(2)StopRecording:停止錄制動畫。(3)StartPlayback:開始播放錄制的動畫。(4)StopPlayback:停止播放錄制的動畫。同時,還可以通過訪問Animator提供的一些屬性來了解有關(guān)動畫錄制的相關(guān)信息:(1)playbackTime:播放時間。(2)recorderStartTime:開始錄制的時間。(3)recorderStopTime:記錄結(jié)束的時間。
它相對易于使用,因此未作為示例顯示。應(yīng)該注意的是,當(dāng)播放錄制的動畫時,角色將返回到錄制開始的坐標(biāo)點(diǎn),而不是在當(dāng)前坐標(biāo)點(diǎn)播放。4.5燈光系統(tǒng)4.5.1燈光系統(tǒng)簡介
光照貼圖技術(shù)是一種增強(qiáng)靜態(tài)場景光照效果的技術(shù)。游戲場景不可能都是靜態(tài)對象,因此,游戲場景中的照明通常是幾種照明方法的混合。對于靜態(tài)對象,通常使用光照貼圖來模擬間接光的照明效果,然后添加來自直接光源的動態(tài)照明效果。
對于移動的對象,可使用直接光源的動態(tài)照明效果,或者使用光探頭模擬房間接收光的照明效果。Unity3D中的實(shí)時全局照明提供了可以實(shí)時計算的全局照明,但這對計算機(jī)性能的要求仍然很高。不過,隨著計算機(jī)硬件的改進(jìn),實(shí)時照明已應(yīng)用于游戲技術(shù)中。默認(rèn)情況下,Unity3D中可以創(chuàng)建的光源類型有自然光、點(diǎn)光源、聚光燈、區(qū)域光和兩種類型的探針反射探針、光照探針組如圖4.63所示。4.5.2DirectionalLight(自然光)Unity3D中的直接照明主要來自各種照明對象,并且照明對象本質(zhì)上是空對象加上照明組件。直接照明可以產(chǎn)生陰影,但是光不會被反射或折射,并且可以穿透半透明的物體。自然光設(shè)置如圖4.64所示。DirectionalLight的屬性作用如下:(1)Type:光源類型,所有類型的光源實(shí)際上共享一個組件,基本上是相同的。(2)Color:燈光顏色。(3)Mode:照明模式,每種模式對應(yīng)Light面板中的一組設(shè)置。其中,Realtime對應(yīng)RealtimeLight;Mixed對應(yīng)MixedLight;Baked對應(yīng)LightmappingSetting。(4)Intensity:燈光強(qiáng)度。(5)IndirectMultiplier:乘以燈光產(chǎn)生的間接照明的強(qiáng)度。(6)ShadowType:陰影貼圖的類型。其中,NoShadows指無陰影貼圖;HardShadows指硬陰影貼圖;SoftShadows指平滑的陰影邊緣(即陰影模糊效果);BakedShadowAngle指烘焙陰影的角度。同時,該屬性還包括:①RealtimeShadowsStrength實(shí)時陰影強(qiáng)度。②Resolution陰影貼圖分辨率。③Bias陰影偏移,通常適當(dāng)?shù)卦黾哟酥悼杉m正一些陰影偽像。④NormalBias正常偏差,通常適當(dāng)降低此值可校正某些陰影偽像(與使用Bias不同)。⑤NearPlane陰影裁剪平面,對于小于相機(jī)此距離的場景對象,不會生成陰影。(7)Cookie:Cookie等效于在燈光上粘貼黑白圖像模擬某些陰影效果,例如粘貼網(wǎng)格圖像模擬窗口網(wǎng)格效果。(8)CookieSize:調(diào)整Cookie的大小。(9)DrawHalo:燈光是否發(fā)光,不發(fā)光的光線是不可見的。(10)Flare:眩光可以使用黑白貼圖來模擬鏡頭中光線的“星光”效果。(11)RenderMode:渲染模式。包含自動、重要逐像素進(jìn)行渲染和不重要(以最快速度渲染)。(12)CullingMask:消除遮擋圖,與選定圖層關(guān)聯(lián)的對象將受到光源的影響。4.5.3PointLight(點(diǎn)光源)
點(diǎn)光源模擬了一個小燈泡向周圍發(fā)光的效果。點(diǎn)光源在其照明范圍內(nèi)隨著距離的增加而減弱其亮度。點(diǎn)光源設(shè)置列表如圖4.65所示。PointLight的屬性作用如下:(1)Range:光源的范圍,從光源對象中心發(fā)射的距離。(2)Color:光源的顏色。(3)Mode:照明模式,每種模式對應(yīng)Light面板中的一組設(shè)置。其中,Realtime對應(yīng)RealtimeLight;Mixed對應(yīng)MixedLight;Baked對應(yīng)LightmappingSetting。(4)Intensity:燈光強(qiáng)度,只有Point和Spotlight有該參數(shù)。(5)IndirectMultiplier:乘以燈光產(chǎn)生的間接照明的強(qiáng)度。(6)ShadowType:陰影貼圖的類型。其中,NoShadows指無陰影貼圖;HardShadows指硬陰影貼圖;SoftShadows指平滑的陰影邊緣(即陰影模糊效果)。(7)DrawHalo:燈光是否發(fā)光,不發(fā)光的光線是不可見的。(8)Flare:眩光可以使用黑白貼圖來模擬鏡頭中光線的“星光”效果。(9)RenderMode:渲染模式。包含自動、重要逐像素進(jìn)行渲染和不重要(以最快速度渲染)。(10)CullingMask:消除遮擋圖,與選定圖層關(guān)聯(lián)的對象將受到光源的影響。4.5.4SpotLight(聚光燈)
聚光燈模擬點(diǎn)光源僅沿圓錐體方向發(fā)光的效果,其亮度在照明范圍內(nèi)隨著距離的增加而衰減。聚光燈設(shè)置列表如圖4.66所示。4.5.5AreaLight(區(qū)域光)
區(qū)域光是模擬大發(fā)光表面對周圍環(huán)境的照明效果。通常,區(qū)域光的亮度快速衰減,陰影非常柔和。Unity3D的區(qū)域光僅在烘焙光照貼圖時才有效,并且不會像Maya的區(qū)域光一樣動態(tài)照亮場景。區(qū)域光設(shè)置列表如圖4.67所示。4.5.6LightProbes(燈光探針)LightProbes是一種用于實(shí)時渲染的高級照明技術(shù),它是ReflectionProbes與LightProb
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 養(yǎng)老院老人入住手續(xù)制度
- 養(yǎng)老院老人安全保障制度
- 向命運(yùn)挑戰(zhàn)課件
- 城市經(jīng)濟(jì)學(xué)城市化教學(xué)課件
- 救生員入職合同(2篇)
- 2024年度生物安全試劑采購與儲備合同3篇
- 2024年農(nóng)業(yè)設(shè)施維修及保養(yǎng)承包合同樣本3篇
- 2025年大興安嶺貨運(yùn)從業(yè)資格證模擬考試題目
- 2025年塔城貨物運(yùn)輸駕駛員從業(yè)資格考試系統(tǒng)
- 2025年阜陽貨運(yùn)從業(yè)資格證試題庫及答案
- 全球及中國機(jī)器人水果采摘機(jī)行業(yè)市場現(xiàn)狀供需分析及市場深度研究發(fā)展前景及規(guī)劃可行性分析研究報告(2024-2030)
- 辦公室玻璃隔斷安裝合同
- 陜西行政執(zhí)法資格考試題題庫及答案完整
- 2024-2029年益生菌項(xiàng)目商業(yè)計劃書
- 康復(fù)質(zhì)控中心工作計劃
- 咖啡的微觀世界智慧樹知到期末考試答案章節(jié)答案2024年成都師范學(xué)院
- 2024-2030年國內(nèi)工業(yè)用金屬桶行業(yè)市場發(fā)展分析及發(fā)展前景與投資機(jī)會研究報告
- DZ/T 0462.9-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第9部分:鹽湖和鹽類礦產(chǎn)(正式版)
- 小學(xué)生普法教育完整課件
- 60歲以上用工免責(zé)協(xié)議
- (“雙減”作業(yè)案例)“魚米之鄉(xiāng)”-一長江三角洲地區(qū)(第一課時)
評論
0/150
提交評論