Unity基礎(chǔ)-腳本與物理系統(tǒng)

一.剛體組件的屬性介紹

剛體能讓你的游戲?qū)ο蟊晃锢硪嫠刂疲芡ㄟ^受到推力和扭力來實(shí)現(xiàn)真實(shí)的物理表現(xiàn)效果。所有游戲?qū)ο蟊仨毎瑒傮w組件來實(shí)現(xiàn)重力、通過腳本施加力、或者與其他對象進(jìn)行交互,這一切都通過NVIDIA的PhysX物理引擎來實(shí)現(xiàn)。

屬性

Mass 質(zhì)量,單位為Kg,建議不要讓對象之間的質(zhì)量差達(dá)到100倍以上

Drag 空氣阻力,為0表示沒有阻力,infinity表示立即停止移動

Angular Drag 扭力的阻力,數(shù)值意義同上

Use Gravity 是否受重力影響

Is Kinematic 是否為Kinematic剛體,如果啟用該參數(shù),則對象不會被物理所控制,只能通過直接設(shè)置位置、旋轉(zhuǎn)和縮放來操作它,一般用來實(shí)現(xiàn)移動平臺,或者帶有HingeJoint的動畫剛體,在某些時(shí)候,主要是創(chuàng)建布娃娃效果的時(shí)候,你可能需要在動畫與物理控制之間進(jìn)行切換。你可以將剛體設(shè)置為IsKinematic,當(dāng)設(shè)置為Kinematic模式,它將不再受到外力影響。這時(shí)你只能通過變換方式來操作對象,但是Kinematic剛體還會影響其他剛體,但他自己不會再受物理引擎控制。比如,連在Kinematic剛體上的Joints還會繼續(xù)影響連接的另一個(gè)非Kinematic剛體,同時(shí)也能夠給其他剛體產(chǎn)生碰撞力。

Interpolate 如果你的剛體運(yùn)動時(shí)有抖動,嘗試一下修改這個(gè)參數(shù),None表示沒有插值,Interpolate表示根據(jù)上一楨的位置來做平滑插值,Extrapolate表示根據(jù)預(yù)測的下一楨的位置來做平滑插值

Freeze Rotation 如果選中了該選項(xiàng),那么剛體將不會因?yàn)橥饬蛘吲ちΧl(fā)生旋轉(zhuǎn),你只能通過腳本的旋轉(zhuǎn)函數(shù)來進(jìn)行操作

Collision Detection 碰撞檢測算法,用于防止剛體因快速移動而穿過其他對象,當(dāng)使用默認(rèn)的離散式碰撞檢測時(shí),如果前一楨時(shí)對象在墻這一面,下一楨時(shí)對象已到到了墻另一面,那么碰撞檢測算法將檢測不到碰撞的發(fā)生,你可以將該對象的碰撞檢測屬性設(shè)置為Continuous,這時(shí)碰撞檢測算法將會防止對象穿過所有的靜態(tài)碰撞體,設(shè)置為Continuous Dynamic將還會防止穿過其他也設(shè)置為Continuous或者Continuous Dynamic的剛體。CCD只支持Box,Sphere和Capsule的碰撞體。

Constraints 剛體運(yùn)動的約束,包括位置約束和旋轉(zhuǎn)約束,勾選表示在該坐標(biāo)上不允許進(jìn)行此類操作

Collider——很簡單,就是碰撞盒,有碰撞盒才有碰撞,所有碰撞的參與者都必須要有至少一個(gè)碰撞盒才行

Trigger——這也是一個(gè)描述,同是Collider的一個(gè)屬性。被標(biāo)記為Trigger的碰撞盒基本不再具備物理特性(如果綁有剛體的話,且使用重力,受重力下落)

Rigidbody.AddForce

Rigidbody.AddRelativeForce?

igidbody.AddTorque

Rigidbody.AddRelativeTorque

Physics.Raycast

1.檢測射線是否碰到物體

void Update(){

Vector3 fwd = transform.TransformDirection(Vector3.forward);

if (Physics.Raycast(transform.position, fwd, 10))

{

print("There is something in front of the object!");

} ?

2.檢測射線碰到物體,出參

void Update() {

RaycastHit hit;

if (Physics.Raycast(transform.position, -Vector3.up, out hit, 100.0F))

{

float distanceToGround = hit.distance; ?

}

}

3.從攝像機(jī)發(fā)射出射線,出參

void Update() {

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit hit;

if (Physics.Raycast(ray, out hit, 100))

{

Debug.DrawLine(ray.origin, hit.point);

} ?

}?

CharacterController

Move

角色移動只受到碰撞的約束。角色遇到碰撞時(shí)將會沿著碰撞盒滑動(你懂得)。返回值是對移動過程中遇到的碰撞信息的匯總。Move函數(shù)并不使用重力。

SimpleMove 簡單移動(會自動模擬重力)

Y軸的速度將會被忽略。速度單位是米每秒。重力自動生效。返回值是角色是否著地。

建議每幀只調(diào)用一次Move或者SimpleMove

移動Move

設(shè)置目的地SetDestination

停止Stop

繼續(xù)Resume

路徑等待pathPending

設(shè)置速度Speed

當(dāng)前速度Velocity

導(dǎo)航層

& 位邏輯與

| 位邏輯或

^ 位邏輯異或

- 位邏輯反

>> 右移

<< 左移

Navigation

Object面板

NavigationStatic 勾選后表示該對象參與導(dǎo)航網(wǎng)格的烘培。

Generation OffMeshLink 勾選后可跳躍(Jump)導(dǎo)航網(wǎng)格和下落(Drop)。

NavigationArea 物體烘焙網(wǎng)格屬于那個(gè)圖層,可通過代碼讓游戲人物走不同的路

Bake面板

AgentRadius 具有代表性的物體半徑,半徑越小生成的網(wǎng)格面積越大

AgentHeight 具有代表性的物體的高度,代理所能通過的最大高度

Max Slope 斜坡的坡度

Step Height 臺階高度

Drop Height 允許跳躍最大下落距離

Jump Distance 允許最大的跳躍距離

Advanced

Manual Voxel Size 手動設(shè)置立體像素

Min Region Area 最小生成區(qū)域(小于該值則忽略)

Height Mesh 生成高度圖,(如果你的游戲agent需要更精準(zhǔn)的行走位置,你可以啟用高度網(wǎng)格Height Mesh,高度網(wǎng)格Height Mesh將占用你“運(yùn)行時(shí)”的內(nèi)存和cpu,并且需要更多的烘焙時(shí)間);

導(dǎo)航Agent

Raduis 代理的半徑(僅用于尋路目的,可以跟實(shí)際對象的半徑大小不一樣,一般比實(shí)際對象的半徑大)。

Speed 速度,走向它的目的地的最大移動速度。

Acceleration 加速度,最大加速度。

Angular Speed 角速度,最高轉(zhuǎn)速(度/秒)。

Stopping distance 制動距離,到目的地的距離小于這個(gè)值,代理減速。

Auto Traverse OffMesh Link 自動通過OffMesh鏈接

Auto Repath 自動重新尋路

Height 代理的高度

Base offset 碰撞幾何體相對于實(shí)際幾何體垂直的偏移

方法:

移動Move

設(shè)置目的地SetDestination

停止Stop

繼續(xù)Resume

路徑等待pathPending

設(shè)置速度Speed

當(dāng)前速度Velocity

導(dǎo)航障礙物

carve 是否雕刻

carveOnlyStationary 當(dāng)障礙靜止時(shí)可以被雕刻?

carvingMoveThreshold 移動障礙物后,重新雕刻的移動臨界距離

TimeToStationary 障礙被處理為靜止的等待時(shí)間

center 障礙的中心,在對象自身空間測量。

height 障礙的圓柱形狀的高。

radius 障礙的膠囊形狀的半徑。

shape 障礙的形狀。

size 障礙的大小,在對象的自身空間測量。?

分離網(wǎng)格

activated 激活連接。

NavMesh area 該OffMeshLink 組件的NavMesh 區(qū)域索引。

autoUpdatePositions 自動更新端點(diǎn)。

biDirectional 可以在兩個(gè)方向來回移動。

costOverride 修改鏈接尋找目標(biāo)成本。

startTransform 該變換表示鏈接開始位置。

endTransform 該變換表示鏈接終點(diǎn)位置。

腳本與材質(zhì)系統(tǒng)

整個(gè) CG 領(lǐng)域中這三個(gè)概念都是差不多的,在一般的實(shí)踐中,大致上的層級關(guān)系是:?材質(zhì) Material包含貼圖 Map,貼圖包含紋理 Texture。

紋理是最基本的數(shù)據(jù)輸入單位,游戲領(lǐng)域基本上都用的是位圖。此外還有程序化生成的紋理 Procedural Texture。

貼圖的英語 Map 其實(shí)包含了另一層含義就是“映射”。其功能就是把紋理通過 UV 坐標(biāo)映射到3D 物體表面。貼圖包含了除了紋理以外其他很多信息,比方說 UV 坐標(biāo)、貼圖輸入輸出控制等等。

材質(zhì)是一個(gè)數(shù)據(jù)集,主要功能就是給渲染器提供數(shù)據(jù)和光照算法。貼圖就是其中數(shù)據(jù)的一部分,根據(jù)用途不同,貼圖也會被分成不同的類型,比方說 Diffuse Map,Specular Map,Normal Map 和 Gloss Map 等等。另外一個(gè)重要部分就是光照模型 Shader ,用以實(shí)現(xiàn)不同的渲染效果。

color 顏色

mainTexture 主紋理

Legacy動畫系統(tǒng)

Unity提供了Animation編輯器,它可以為我們編輯物理動畫。舉個(gè)例子比如場景中有一個(gè)來回?fù)u動的秋千,這個(gè)秋千在項(xiàng)目中完全只起到襯托作用,它不會與別的游戲?qū)ο笥腥魏谓换?。如果這個(gè)秋千也用代碼來寫控制它來回?fù)u動,會感覺小題大做。此時(shí)完全可以使用Animation編輯器來完成。

如下圖所示,Animation窗口彈出后,點(diǎn)擊左上角那個(gè)“小紅點(diǎn)”按鈕。因?yàn)槟J(rèn)新建的Cube對象是沒有動畫的,所以這里將彈出創(chuàng)建動畫窗口。在窗口中點(diǎn)擊Save,此時(shí)一個(gè)名叫New Animation的動畫文件將被保存在Project視圖中。

如下圖所示,此時(shí)動畫將處于編輯中模式, 在右上方空白處點(diǎn)擊鼠標(biāo)右鍵,即可添加一個(gè)Key , 點(diǎn)擊Key就會出現(xiàn)一道豎向的紅線,上面對應(yīng)著Key的時(shí)間,這時(shí)候在左側(cè)Transform中可以修改每一幀模型的位置,或者在編輯器中也可以修改,數(shù)值同樣會被保存在每一幀的Transform中。

1、動畫與燈光的結(jié)合——制作一閃一閃的燈光

2、動畫與攝像機(jī)的結(jié)合——制作地形漫游功能

插值動畫與光照系統(tǒng)的配合使用

Mecanim動畫系統(tǒng)

2D混合類型使用了一套適應(yīng)自身的不同使用方法。他的不同點(diǎn)在于:每個(gè)子動作都在對整個(gè)動作產(chǎn)生影響。

2D Simple Directional 2D簡單定向

當(dāng)你的動作表現(xiàn)為不同的方向(就像“向前走”、“向后走”、“向左走”和“向右走”,或“”“朝向上”、“朝向下”、“朝向做”和“朝向右”)時(shí),你可以使用這個(gè)混合類型。你可以選擇“等待”或者“朝向前”作為原點(diǎn)動作。在簡單定向模式中應(yīng)該盡量避免使用相同朝向的動作,比如“向前走”和“向前跑”。

2D Freeform Directional 2D自由定向

這個(gè)混合類型同樣也用于混合朝向不同的動作,你也可以混合像“向前走”和“向前跑”這樣的動作。在自由定向模式下,動作集合一般都應(yīng)該有一個(gè)位于原點(diǎn)的動作,比如“等待”。

2D Freeform Cartesian 2D自由笛卡爾坐標(biāo)

這種模式最好使用在你的各個(gè)動作間沒有明顯朝向區(qū)別的時(shí)候。在使用自由笛卡爾坐標(biāo)時(shí),你可以在X軸和Y軸上分別使用不同的定義,比如“角速度”和“線速度”。比如這樣一些子動作:“向前走動不轉(zhuǎn)彎”、“向前跑動不轉(zhuǎn)彎”、“向前走動轉(zhuǎn)向右”、“向前跑動轉(zhuǎn)向右”等。

通過身體遮罩可以對動畫里面特定的身體部位進(jìn)行激活或禁止。在網(wǎng)格導(dǎo)入觀察器和動畫層的動畫標(biāo)簽里面可以設(shè)置身體遮罩。身體遮罩讓您能根據(jù)角色需求精確的裁剪動畫。例如,您有一個(gè)常見的行走動畫,包括手臂和腿的動作,但是如果現(xiàn)在一個(gè)角色的雙手舉著巨大的物體,您當(dāng)然不會希望她在行走的時(shí)候手臂來回?cái)[動。當(dāng)然,您可以通過身體遮罩的切換,繼續(xù)使用常規(guī)的行走動畫。?

using UnityEngine;using System.Collections; IK與FK對應(yīng),正向運(yùn)動學(xué)就是根骨骼帶動節(jié)點(diǎn)骨骼運(yùn)動。而反向運(yùn)動學(xué)就是反過來,由子節(jié)點(diǎn)帶動父節(jié)點(diǎn)運(yùn)動。對于Humanoid的動畫,使用的方法很簡單,在Animator窗口中,對于要使用IK的動畫狀態(tài)勾上Foot IK選項(xiàng),在Base Layer中勾上IK Pass選項(xiàng)。然后在代碼中實(shí)現(xiàn)OnAnimatorIK函數(shù)來控制IK。public class Lession04 : MonoBehaviour {Animator anim;public Transform rightHand;public Transform leftFoot;void Start(){anim=GetComponent();

}

void OnAnimatorIK(int layer){

if(rightHand!=null)

{

anim.SetIKPositionWeight(AvatarIKGoal.RightHand,1);

anim.SetIKPosition(AvatarIKGoal.RightHand,rightHand.position);

anim.SetIKRotationWeight(AvatarIKGoal.RightHand,1);

anim.SetIKRotation(AvatarIKGoal.RightHand,rightHand.rotation);

}

if(leftFoot!=null)

{

anim.SetIKPositionWeight(AvatarIKGoal.LeftFoot,1);

anim.SetIKPosition(AvatarIKGoal.LeftFoot,leftFoot.position);

}

}

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 111. [動畫系統(tǒng)]如何將其他類型的動畫轉(zhuǎn)換成關(guān)鍵幀動畫? 動畫->點(diǎn)緩存->關(guān)鍵幀 112. [動畫]Unit...
    胤醚貔貅閱讀 13,531評論 3 88
  • Unity內(nèi)置了NVIDIA的Physx物理引擎,Physx是目前使用最為廣泛的物理引擎,被很多游戲大作所采用,開...
    沉麟閱讀 966評論 0 3
  • 最先執(zhí)行的方法是: 1、(激活時(shí)的初始化代碼)Awake,2、Start、3、Update【FixUpdate、L...
    困卡閱讀 4,496評論 0 8
  • 更新:【面試題含答案】http://bbs.9ria.com/thread-288394-1-1.html 高頻問...
    好怕怕閱讀 5,087評論 3 53
  • 昨天乘朋友車子進(jìn)城來了,住的賓館,不知道是幾級。朋友定的。反正是一天159吧。 房間覺得還可以吧,也就是一個(gè)大宿舍...
    南受朝北閱讀 223評論 0 0

友情鏈接更多精彩內(nèi)容