如何導入一個模型,導入的模型在unity3d的project面板中是怎樣顯示的?包含什么內容?如何加載到場景中?怎樣去控制它?模型和動畫之間的關系?
【模型導入】:
Unity可以讀取fbx,dae,3ds,dxf,obj等格式的文件,可以在這里找到FBX導出器,
每一個被導入的項目中的模型,都包含下面這些東西:
Meshes 網格,每個模型都是由無數的三角面組合而成
相關選項:
Scale Factor 縮放系數 調整模型的比例
Use File Units 使用此文件單位 只適用於3dsMax文件,啟用時1Max=1Unity,否則1厘米Max=1Unity
Mesh Compression 網格壓縮 在差異允許的范圍內,盡量調高這個值
Mesh Optimization 網格優化 決定網格中的三角形排列順序
Generate Colliders 生成碰撞體 是否生成網格碰撞體
Swap UVs 交換UV 當有光照貼圖的物體的UV通道不正確時啟用此選項
Generate Lightmap UVs 產生光照貼圖UV 為光照貼圖創建第二個UV通道
Normals & Tangents 法線和切線,這主要是用來描述三角面朝向用的,可以應用在裁切(只顯示正面,不顯示背面)光照上
相關選項:
Normals 法線 默認導入法線,可選Calculate根據平滑度計算法線,也可禁用
Tangents 切線 當啟用法線時,切線才有作用,默認為自動計算,可以選擇導入和禁用
Smoothing Angle 平滑角 設置邊角的平滑程度,用來切分法線貼圖切線?
Split Tangents 分離切線 如果您的網格上的接縫破壞了法線貼圖光照,啟用此選項。這通常只適用於角色
Materials 材質,主要是描述顏色,在各種光照效果下的顯示,以及上面的貼圖!
相關選項:
Import Materials 導入材質 禁用則所有材質為漫反射
Material Naming 材質命名 貼圖名,材質名,模型-材質名等等命名方式
Material Search 材質搜索 決定如何根據材質命名查找已有的材質
Animations 動畫,如果這個文件附帶了動畫的話,可以在這里看到
相關選項:
Generation 生成 控制動畫的導入,以及動畫存儲的位置(Root還是Node)
Bake Animations 烘焙動畫 用於使用了IK的動畫
Animation Wrap mode 動畫循環模式
Split Animations 分割動畫
Anim.Compression 動畫壓縮的方法
Anim.Compression.Errors 當壓縮關鍵幀的時候,設置誤差控制
需要注意的是!我們導入的模型,並不包含貼圖,要導入一個模型需要同時導入模型材質用到的貼圖! u3d搜索貼圖的規則是模型所在路徑下的Textures文件夾,然后逐步搜索上級目錄的Textures文件夾,搜索不到就進行全局搜索(慢,而且當兩張紋理同名的話,可能會找錯)
每一個導入的材質,Unity使用下列規則:
1. 如果禁用了導入材質選項,所有材質默認為漫反射材質
2. 根據材質名設置為Unity的材質名
3. 在已有的材質中尋找名字相同的材質
4. 找到該材質則直接賦給對象,否則生成新的材質
Unity提供了兩種碰撞器,一種Mesh Colliders 網格碰撞器,可以精確地檢測碰撞,而Primitive Colliders 原始碰撞器,雖然沒有前者精確,但效率高很多,應該盡量使用這種
如果你有一個從高精度多邊形版本生成的帶法線貼圖的角色,你應該以180度的平滑角度(Smoothing angel)導入此角色的游戲質量版本。這將防止由於切線切割在光照中產生的奇怪的接縫。如果在應用了這些設置后仍然存在接縫,啟用在UV接縫處分割切線選項(Split tangents across UV seams)。
【動畫導入】
Maya的.mb,.ma文件,Cinema 4D的c4d文件和fbx文件都支持導出動畫,當我們導入這些模型的時候,可以順帶導入動畫
1.分割動畫 使用動畫分割導入動畫,所有的動作都放在同一個模型中,最為節省資源,導入模型的時候,分割動畫會被自動導入,可以在拆分動畫表中看到所有的動畫片段
2.@動畫 創建單獨的模型文件,並按照"模型名"@"動畫名".fbx這樣的格式命名,導入模型文件時,Unity會自動導入該模型相關的動畫文件,在導出這樣的文件時,單獨導出模型,另外再導出所有動作的剪輯。
3.反向動力學 設置烘焙IK和仿真箱????
【動畫腳本】
如果想播放一個簡單的動畫,可以使用Animation.Play;
如果想在動畫之間交叉淡入,可以使用Animation.CrossFade;
如果想改變動畫模式(循環,一次,乒乓),可以改變動畫導入設置里面的動畫幀的WrapMode,或者在運行時改變AnimationState.wrapMode的值;
AnimationState可以用於改變動畫的層,修改播放速度,並且直接控制融合與混合。
動畫疊加,混合,分層等等——參考u3d的hello world——angrybots
Animation是一個組件,可以被添加到GameObject上,當我們把腳本掛載到一個GameObject上的時候,可以通過animation成員變量來訪問掛載在它身上的動畫,動畫的方法有這些
- Animation
- AddClip添加剪輯
- animateOnlyIfVisible可見時動畫
- animatePhysics是否物理動畫
- Blend混合
- clip剪輯
- CrossFadeQueued淡入淡出隊列
- CrossFade淡入淡出
- cullingType消隱類型
- GetClipCount獲取剪輯數
- IsPlaying是否在播放?
- isPlaying是否在播放?
- localBounds本地邊界框
- playAutomatically自動播放
- PlayQueued播放隊列
- Play播放
- RemoveClip移除剪輯
- Rewind倒回
- Sample采樣
- Stop停止
- SyncLayer同步層
- this [string name]操作名字
- wrapMode循環模式
動畫融合:
用於確保角色的平滑動畫,當我們在游戲中要從一個動畫過渡的另外一個動畫,我們不希望這兩個動作之間是突然跳轉,而希望平滑地過渡。
我們使用CrossFade("animate name")來平滑地切換到另外一個動畫(
這中間可能是做了一個補間動畫)
動畫層:
層允許群組動畫和優先級別,動畫之間的過渡,可以用CrossFade或者指定手工融合權重來自動處理動畫的權重,當兩個動畫的權重都是100%,Unity生成最終動畫會規格化權重,這意味着兩者都占50%的權重,但在考慮優先級的情況下,需要設置哪個動畫的權重更高,還要確保權重之和為100%,使用層的話會容易很多。
要做到這點最簡單的方法是在射擊時簡單的保持行走和空閑動畫,然后我們需要確保射擊動畫比空閑和行走動畫在更高的層。這意思是射擊動畫將首先接收融合權重。行走和空閑動畫僅當射擊動畫不使用融合權重100%時,接收權重。因此,交叉淡入淡出射擊動畫時,權重將從0開始很短時間內變為100%,在開始時步行和空閑層仍然會收到融合權重,但當射擊動畫完全切入時,它們不再接收權重,這正是我們所需要的!
1 function Start () { 2 // Set all animations to loop 3 animation.wrapMode = WrapMode.Loop; 4 // except shooting 5 animation["shoot"].wrapMode = WrapMode.Once; 6 7 // Put idle and walk into lower layers (The default layer is always 0) 8 // This will do two things 9 // - Since shoot and idle/walk are in different layers they will not affect 10 // each other's playback when calling CrossFade. 11 // - Since shoot is in a higher layer, the animation will replace idle/walk 12 // animations when faded in. 13 animation["shoot"].layer = 1; 14 15 // Stop animations that are already playing 16 //(In case user forgot to disable play automatically) 17 animation.Stop(); 18 } 19 20 function Update () { 21 // Based on the key that is pressed, 22 // play the walk animation or the idle animation 23 if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1) 24 animation.CrossFade("walk"); 25 else 26 animation.CrossFade("idle"); 27 28 // Shoot 29 if (Input.GetButtonDown ("Fire1")) 30 animation.CrossFade("shoot"); 31 }
Animation Playback and Sampling 動畫播放和取樣:
取樣這個詞可能不大好理解,取樣在Unity里面是涉及到渲染的一個術語,就是對像素取樣來進行綜合運算,我們的動畫是在不斷運動的,將動畫當前的運動狀態提取出來,並渲染到屏幕上,這是我理解的取樣。
我們在3ds Max或者Maya等模型編輯工具中編輯一個動畫,我們按照某個幀速率(FPS)來創建這個動畫,在動畫被導入到U3D的時候,這個幀速率也會被導入,所以會跟編輯器的速率保持一致。
但我們游戲的運行幀速率並不穩定,可能有硬件的原因或者要渲染的對象,處理的邏輯復雜度不一樣,而導致的幀速率不穩定,如果我們按照它設定的幀率來播放,動畫就會一卡一卡的。Unity是在變化的幀頻中對動畫進行取樣,而不在制作時的幀頻。3D電腦圖形動畫不是由分散的動畫組成,而是連續的曲線。這些曲線可以讓我們在任何時間點取樣,而不只是對應某一個原始幀的時間點。這樣當我們的電腦比較快的時候,動畫將會更加地平滑和流暢。
對於大多數的實際應用,事實上Unity對變化幀速的采樣不是我們需要關切的,然而,如果你的某個游戲邏輯依賴於動畫變換或屬性的動畫在一個非常特殊的配置,那必須知道這一點。例如,如果有一個動畫是把一個物體30幀內從0旋轉到180度,想從代碼中知道當它已達到了一半,你不能寫一段條件語句來檢查現在旋轉值是不是90度。因為 Unity 依照游戲的變化速率來對動畫取樣,它可能在旋轉快到90度時進行取樣,或剛好過90度的時候取樣。當在一個動畫指定一個點到達時,需要通知, 應該使用AnimationEvent來代替。
還要注意的變化幀速率采樣的結果,一個使用WrapMode.Once模式播放的動畫的采樣不一定是精確的最后一幀。在游戲中很有可能是剛好結束前的某一幀,在下一幀時間可能超過動畫的長度,所以它被禁用,而不再采樣。如果需要動畫的最后一幀取樣精確,你可以使用WrapMode.ClampForever。
如在這種情況下,動畫在這種情況下,動畫將保持無限取樣最后一幀,直到你停止動畫。
【動畫視圖】

按下Ctrl+6,可以彈出動畫編輯視圖,選擇Hierarchy面板上的任意對象,可以編輯它們的動畫。
