版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第四章Unity物理引擎玩法設(shè)計(jì)NTENTS4.2物理碰撞體組件解析4.3物理關(guān)節(jié)組件解析4.5物理引擎高級系統(tǒng)設(shè)置4.1物理基礎(chǔ)知識4.6物理引擎玩法總結(jié)與拓展學(xué)習(xí)4.4碰撞觸發(fā)事件檢測物理基礎(chǔ)知識Prefab預(yù)制體與實(shí)例化游戲?qū)ο驲igidbody剛體組件ConstantForce恒定力組件碰撞觸發(fā)事件物理材質(zhì)第一節(jié)4.1.1
Prefab預(yù)制體與實(shí)例化游戲?qū)ο驪refab預(yù)制體可以看作對象資源的一個模板,創(chuàng)建出來后可以被輕松的反復(fù)使用,同時也可以統(tǒng)一修改場景中所有用到該預(yù)制體對象的組件屬性,參數(shù)等配置對象值。通常應(yīng)用于反復(fù)需要被使用的石頭、樹木等環(huán)境資源,多次出現(xiàn)的NPC非玩家角色,不斷生成并銷毀的子彈對象等。創(chuàng)建使用實(shí)例化對象的常用方式有兩種,一種是在編輯狀態(tài)將Project面板中的預(yù)制體拖拽至Scene面板中進(jìn)行創(chuàng)建,還有一種則是在游戲運(yùn)行時通過代碼的形式動態(tài)生成。方法函數(shù)常用運(yùn)行實(shí)例化游戲?qū)ο蠛瘮?shù)有CreatePrimitive()、Instantiate()。其中Instantiat以下幾種重置方法,具體參數(shù)內(nèi)容介紹見表4.1.1-1所示。original要復(fù)制的現(xiàn)有對象rotation新對象的方向position新對象的位置parent指定給新對象的父對象instantiateInWoldSpace指定父對象的方式是保持世界位置(true)或是相對位置(false)4.1.1
Prefab預(yù)制體與實(shí)例化游戲?qū)ο髐sing
UnityEngine;public
class
CreatePrefab
:
MonoBehaviour{public
GameObject
cube;public
Transform
t_cubeWall;void
Update(){if
(Input.GetKeyDown(KeyCode.R))for
(int
x
=
0;
x
<
3;
x++)for
(int
y
=
0;
y
<
3;
y++){GameObject
gameObject
=
Instantiate(cube,
newVector3(x,
y,
1),
Quaternion.identity,t_cubeWall);gameObject.AddComponent<Rigidbody>();//組件的獲取gameObject.transform.position
=
new
Vector3(x,
y,
0);}}}3.案例實(shí)踐以Prefab為例介紹預(yù)制體的創(chuàng)建和使用方法。案例代碼案例效果圖4.1.2
Rigidbody剛體組件屬性功能屬性功能Mass對象的質(zhì)量(Kg)Collision
Detection碰撞檢測模式Drag空氣阻力大小velocity剛體的速度矢量Use
Gravity是否受重力影響position剛體的位置Is
Kinematic是否由物理引擎驅(qū)動rotation剛體的旋轉(zhuǎn)Constraints對剛體運(yùn)動限制worldCenterOfMass剛體在世界空間中的質(zhì)心FreezePosition剛體位置移動限制FreezeRotation剛體局部旋轉(zhuǎn)限制Rigidbody剛體組件是實(shí)現(xiàn)游戲?qū)ο笪锢硇袨榈闹饕M件。對象添加剛體組件后便可以設(shè)置相關(guān)物理屬性例如重力、阻力等參數(shù),獲取當(dāng)前位置、速度等信息,也可以自定義取消受重力影響以及限制對象運(yùn)動位置旋轉(zhuǎn)狀態(tài)。1.創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->Rigidbody添加剛體組件;或者選中需要添加的對象,點(diǎn)擊Inspector面板的AddComponent按鈕,搜索Rigidbody并添加剛體組件。4.1.2
Rigidbody剛體組件3.案例實(shí)踐以Rigidbody剛體組件為例,測試不同參數(shù)函數(shù)作用效果,具體操作步驟如下。using
UnityEngine;public
class
Demo_Rigidbody
:
MonoBehaviour{public
Rigidbody
cube;public
float
forceValue=10.0f;//設(shè)置力的大小
void
Start(){cube.mass=1.0f;//設(shè)置Cube質(zhì)量為1kgcube.useGravity=true;//設(shè)置Cube受重力影響
cube.freezeRotation=true;//設(shè)置Cube無法旋轉(zhuǎn)}void
Update(){if(Input.GetKey(KeyCode.F))//以世界坐標(biāo)系的Z軸方向施加力
cube.AddForce(Vector3.forward*forceValue,ForceMode.Acceleration);if(Input.GetKeyDown(KeyCode.E))//以自身坐標(biāo)軸-Z軸方向施加力
cube.AddRelativeForce(Vector3.back*forceValue,ForceMode.Impulse);if(Input.GetKey(KeyCode.T))//以世界坐標(biāo)系的X軸方向施加扭矩
cube.AddTorque(Vector3.right*10.0f,ForceMode.Impulse);if(Input.GetKeyDown(KeyCode.R))//按下P鍵重置位置
cube.MovePosition(Vector3.zero);}void
DebugInfo(){Debug.Log("velocity:"+cube.velocity);Debug.Log("velocity:"+cube.position);Debug.Log("velocity:"+cube.rotation);}}案例代碼案例效果圖4.1.3
ConstantForce恒定力組件恒定力
(Constant
Force)可用于快速為剛體對象添加恒定力,使對象在游戲中受到力的作用而運(yùn)動。例如飛機(jī)航行、火箭發(fā)射、馬達(dá)轉(zhuǎn)動等運(yùn)動。創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->Constant
Force添加恒定力組件;或者選中需要添加的對象,點(diǎn)擊Inspector面板的AddComponent按鈕,搜索Constant
Force并添加恒定力組件。屬性介紹有關(guān)ConstantForce恒定力組件屬性參數(shù)介紹見表4-5。屬性功能Force每幀都在向剛體施加力,相對于世界坐標(biāo)系的矢量Relative
Force每幀都在向剛體施加力,相對于剛體坐標(biāo)系的矢量Torque每幀都在向剛體施加扭矩旋轉(zhuǎn),相對于世界坐標(biāo)系的矢量Relative
Torque每幀都在向剛體施加扭矩旋轉(zhuǎn),相對于剛體坐標(biāo)系的矢量4.1.4物理材質(zhì)3.案例實(shí)踐使用ConstantForce恒定力組件就可以實(shí)現(xiàn)給對象添加作用力。組件說明案例效果圖4.1.4物理材質(zhì)在真實(shí)世界當(dāng)中,剛體對象碰撞效果會因?yàn)椴馁|(zhì)的不同而產(chǎn)生不同作用力的效果。3D物理材質(zhì)指的是碰撞體表面的材質(zhì),PhysicMaterial物理材質(zhì)用于調(diào)整碰撞對象的摩擦力和反彈效果。例如即便是相同質(zhì)量的乒乓球,網(wǎng)球,籃球,保齡球從同樣高度進(jìn)行下落到地面上反彈的高度也會有所不同1.創(chuàng)建使用點(diǎn)擊菜單欄Assets->Create->PhysicMaterial或者在Project面板右鍵Create->PhysicMaterial創(chuàng)建物理材質(zhì)資源。調(diào)節(jié)物理材質(zhì)Inspector面板中的參數(shù)模將其拖拽至具有碰撞體對象Inspector面板Collider組件的Material處進(jìn)行賦值使用。2.屬性介紹組件常用三個參數(shù)為DynamicFriction動態(tài)摩擦力、Static
Friction靜態(tài)摩擦力以及Bounciness彈性摩擦力,模式計(jì)算方式有具體物理材質(zhì)參數(shù)介紹見表4-6。材質(zhì)參數(shù)介紹計(jì)算模式介紹DynamicFriction動態(tài)摩擦力Average兩者平均值StaticFriction靜態(tài)摩擦力Minimum/
Maximum取最小/大值Bounciness彈性摩擦力Multiply兩者相乘值4.1.4物理材質(zhì)3.案例實(shí)踐在Project面板中創(chuàng)建物理材質(zhì)并添加給對象測試不同的摩擦系數(shù)以及計(jì)算模式狀態(tài)下在對象發(fā)生碰撞時所產(chǎn)生的效果影響。材質(zhì)屬性案例效果圖物理碰撞體組件解析第二節(jié)盒型、球形、膠囊碰撞體組件網(wǎng)格碰撞體地形碰撞體車輪碰撞體4.2.1盒型、球形、膠囊碰撞體組件Unity引擎中提供了幾種簡單幾何體碰撞組件分別為:BoxCollider,SphereCollideCapsuleCollider組件??梢苑謩e為箱子,石頭,人體等對象添加簡易碰撞體進(jìn)行物理撞檢測。創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->BoxCollider/SphereCollider/CapsuleCollider添加碰撞體組件;屬性介紹盒型、球形、膠囊碰撞體組件屬性參數(shù)介紹見表4-7。屬性功能屬性功能EditColliderScene面板對碰撞體編輯Radius碰撞體的半徑大小Is
Trigger啟用觸發(fā)事件而忽略碰撞Height碰撞體的總高度Material引用物理材質(zhì)效果Direction膠囊體局部空間縱方向的軸Center碰撞體的空間位置Size碰撞體在方向軸上的大小4.2.1盒型、球形、膠囊碰撞體組件3.案例實(shí)踐創(chuàng)建碰撞體對象編輯對象碰撞體區(qū)域并設(shè)置Trigger觸發(fā)區(qū)域。運(yùn)行效果圖簡單幾何體組件4.2.2網(wǎng)格碰撞體MeshCollider網(wǎng)格碰撞體是自定義網(wǎng)格對象碰撞體。網(wǎng)格碰撞體比起內(nèi)置簡單碰撞體更加精確,但會占用更多的系統(tǒng)資源。創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->MeshCollider添加碰撞體組件;屬性介紹具體網(wǎng)格碰撞體的屬性參數(shù)介紹見表4-8。屬性功能屬性功能Convex保證網(wǎng)格數(shù)小于255個三角形Material引用物理材質(zhì)效果Is
Trigger啟用觸發(fā)事件而忽略碰撞Mesh引用碰撞的網(wǎng)格Cooking
Options網(wǎng)格處理方式的網(wǎng)格烹制選項(xiàng)4.2.3地形碰撞體地形碰撞體
(Terrain
Collider)實(shí)現(xiàn)了一個碰撞表面,其形狀與其所附加到的Terrain對象相同,具體內(nèi)容可以閱讀第五章的Unity地形編輯系統(tǒng)。地形碰撞體4.2.4車輪碰撞體WheelCollider車輪碰撞體是Unity內(nèi)置PhysX物理引擎提供的一套可以用來輕松創(chuàng)建地面交通工具的車輪模擬系統(tǒng)。每個車輪碰撞體都有質(zhì)量、半徑、阻尼值等屬性,具備轉(zhuǎn)向、電機(jī)或制動扭矩功能。創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->WheelCollider添加車輪碰撞體組件;屬性介紹具體車輪碰撞體的屬性參數(shù)介紹見表4-9。Mass車輪的質(zhì)量rpm當(dāng)前輪軸轉(zhuǎn)速(r/min)Radius車輪的半徑brakeTorque制動扭矩以牛頓米表示Center車輪中心位置motorTorque輪軸上的電機(jī)扭矩(N/m)SuspensionSpring懸架嘗試通過增加彈簧力和阻尼力來到達(dá)目標(biāo)位置Target
Position懸架沿懸架的靜止距離,1和0對應(yīng)于完全展開/壓縮懸架,默認(rèn)0.5isGrounded指示車輪當(dāng)前是否與某物發(fā)生碰撞Forward/Sideways
Friction車輪向前和側(cè)向滾動時輪胎摩擦的特性ForceAppPointDistance默認(rèn)車輪上受力點(diǎn)值為0時,處于靜止時車輪底部,會使受力點(diǎn)略低于車輛質(zhì)心4.2.4車輪碰撞體using
System.Collections.Generic;using
UnityEngine;public
List<AxleInfo>
axleInfos;public
float
maxMotorTorque;//預(yù)設(shè)車輪驅(qū)動力public
void
Update(){float
motor
=
maxMotorTorque
*
Input.GetAxis(“Vertical”);float
steering
=
maxSteeringAngle
*
Input.GetAxis(“Horizontal”);foreach
(AxleInfo
axleInfo
in
axleInfos){axleInfo.leftWheel.brakeTorque
=
Input.GetKey(KeyCode.Space)
?breakMotorTorque
:
0; axleInfo.leftWheel.brakeTorque
=Input.GetKey(KeyCode.Space)
?
breakMotorTorque
:
0;}foreach
(AxleInfo
axleInfo
in
axleInfos){//遍歷所有車輪組if
(axleInfo.steering){//如果啟用旋轉(zhuǎn),則設(shè)置車輪組件旋轉(zhuǎn)值為預(yù)設(shè)值axleInfo.leftWheel.steerAngle=steering;axleInfo.rightWheel.steerAngle=steering;}if
(axleInfo.motor){//如果啟用驅(qū)動力,則設(shè)置車輪組件驅(qū)動力為預(yù)設(shè)值axleInfo.leftWheel.motorTorque=motor;axleInfo.rightWheel.motorTorque=motor;}}}}3.案例實(shí)踐制作一輛可以駕駛的小車案例。案例代碼案例效果圖[System.Serializable]//序列化public
class
AxleInfo{//一組輪public
WheelColliderleftWheel;//左車輪public
class
script_WheelCollider
:
MonoBehaviopuurb{lic
WheelColliderrightWheel;//右車輪public
bool
motor;//是否作為public
float
breakMotorTorque;//預(yù)設(shè)車輪剎車力驅(qū)動力public
float
maxSteeringAngle;//預(yù)設(shè)車輪旋轉(zhuǎn)角度public
bool
steering;//是否可以旋轉(zhuǎn)}物理關(guān)節(jié)組件解析第三節(jié)固定關(guān)節(jié)組件FixedJoint鉸鏈關(guān)節(jié)組件HingeJoint彈簧關(guān)節(jié)組件SpringJoint角色關(guān)節(jié)組件Character
Joint可配置關(guān)節(jié)組件Configurable
Join4.3.1固定關(guān)節(jié)組件FixedJoint固定關(guān)節(jié)(FixedJoint)作用是基于一個物體來限制另一個物體運(yùn)動。效果類似于父子關(guān)系,但是不是通過層級變換,而是通過物理實(shí)現(xiàn)的。當(dāng)你有一些想要輕易分開的物體,或想讓兩個沒有父子關(guān)系的物體一起運(yùn)動時可以使用該組件進(jìn)行綁定。例如應(yīng)用與射箭擊中目標(biāo)后被固定到靶子上面,C4炸彈固定安放等情況。創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->FixedJoint添加固定關(guān)節(jié)組件;屬性介紹具體固定關(guān)節(jié)屬性功能介紹見表4-10。屬性:功能:Connected
Body對關(guān)節(jié)所依賴的剛體的引用。如果未設(shè)置則關(guān)節(jié)連接到世界。Break
Force為破壞此關(guān)節(jié)而需要施加的力。Break
Torque為破壞此關(guān)節(jié)而需要施加的扭矩。Enable
Collision選中此復(fù)選框后,允許關(guān)節(jié)連接的連接體之間發(fā)生碰撞。Enable
Preprocessing禁用預(yù)處理有助于穩(wěn)定無法滿足的配置。4.3.1固定關(guān)節(jié)組件FixedJointusing
UnityEngine;public
class
script_FixedJoint
:
MonoBehaviour{void
Update(){if
(Input.GetKeyDown(KeyCode.A)){this.GetComponent<Rigidbody>().AddForce(newVector3(10,0,
0),
ForceMode.Impulse);}}}3.案例實(shí)踐利用固定關(guān)節(jié)連結(jié)兩個對象進(jìn)行移動,并在某一時刻施加力使其破壞。案例代碼案例效果圖4.3.2鉸鏈關(guān)節(jié)組件HingeJoint鉸鏈關(guān)節(jié)(HingeJoint)將兩個剛體組合在一起,對剛體進(jìn)行約束,讓它們就像通過鉸鏈連接一樣移動。鉸鏈關(guān)節(jié)非常適合用于門,但也可用于模擬鏈條、鐘擺等對象。1.創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->HingeJoint添加鉸鏈組件;2.屬性介紹有關(guān)鉸鏈關(guān)節(jié)組件具體屬性見表4-11所示。屬性:功能:Anchor連接體圍繞擺動的軸位置。該位置在局部空間中定義。Axis連接體圍繞擺動的軸方向。該方向在局部空間中定義。Auto
ConfigureConnected
Anchor如果啟用此屬性,默認(rèn)會自動計(jì)算連接錨點(diǎn)位置以便與錨點(diǎn)屬性全局位置匹配。如果禁用此屬性則可以手動配置連接錨點(diǎn)的位置。Connected
Anchor手動配置連接錨點(diǎn)位置。Use
Spring彈簧使剛體相對于其連接體呈現(xiàn)特定角度。Spring在啟用Use
Spring的情況下使用的彈簧的屬性。Use
Motor電機(jī)使對象旋轉(zhuǎn)。Use
Limits如果啟用此屬性則鉸鏈的角度將被限制在Min到Max值范圍內(nèi)。Spring
Damper
Target
Position移動到位時施加的力值越高對象減速越快彈簧的目標(biāo)角度彈簧朝著該4.3.2鉸鏈關(guān)節(jié)組件HingeJoint3.案例實(shí)踐利用鉸鏈關(guān)節(jié)制作一扇門并設(shè)置其開合范圍,使用小球進(jìn)行撞擊查看門運(yùn)動效果。鉸鏈組件案例效果圖4.3.3彈簧關(guān)節(jié)組件SpringJointSpringJoint彈簧關(guān)節(jié)將兩個剛體連接在一起,但允許兩者之間的距離改變,就好像它們通過彈簧連接一樣,可以模擬了彈簧的效果。創(chuàng)建使用選中Hierarchy面板對象,點(diǎn)擊菜單Component->Physics->SpringJoint添加彈簧關(guān)節(jié)組件;屬性介紹有關(guān)彈簧關(guān)節(jié)組件的屬性功能見表4-12所示。屬性功能Spring彈簧的強(qiáng)度Damper彈簧為活性狀態(tài)時的壓縮程度Min
Distance彈簧不施加任何力的距離范圍的下限Max
Distance彈簧不施加任何力的距離范圍的上限Tolerance彈性范圍,允許彈簧具有不同的靜止長度4.3.3彈簧關(guān)節(jié)組件SpringJoint3.案例實(shí)踐使用彈簧關(guān)節(jié)連結(jié)兩個Cube對象并從高處下落,查看彈簧關(guān)節(jié)效果。彈簧關(guān)節(jié)組件案例效果圖4.3.4角色關(guān)節(jié)組件Character
Joint角色關(guān)節(jié)
(Character
Joint)模擬人體骨頭關(guān)節(jié)的連接,就是兩個物體能根據(jù)一個關(guān)節(jié)點(diǎn)自由的朝一個方向旋轉(zhuǎn),但固定在一個相對的距離。主要用于布娃娃效果,
此類關(guān)節(jié)是延長的球窩關(guān)節(jié),可在每個軸上限制該關(guān)節(jié)。1.創(chuàng)建使用點(diǎn)擊菜單欄GameObject->3Dobject->Ragdoll打開布娃娃系統(tǒng),將Hierarchy面板的對象按要求拖拽入CreateRagdoll面板相應(yīng)欄中。角色關(guān)節(jié)組件案例效果圖4.3.5可配置關(guān)節(jié)組件Configurable
Joint可配置關(guān)節(jié)
(Configurable
Joint)的可定制性極高,因?yàn)榇祟愱P(guān)節(jié)包含其他關(guān)節(jié)類型的所有功能。使用可配置關(guān)節(jié)可以創(chuàng)建任何關(guān)節(jié),是一個非常靈活的關(guān)節(jié)組件,功能十分完善。可配置關(guān)節(jié)是可定制的。可配置關(guān)節(jié)將PhysX引擎中所有與關(guān)節(jié)相關(guān)的屬性都設(shè)置為可配置的,因此可以用此組件創(chuàng)造出與其他關(guān)節(jié)類型行為相似的關(guān)節(jié)。正是由于其靈活性,也造成了其復(fù)雜性,可以根據(jù)具體需要實(shí)現(xiàn)各種關(guān)節(jié)效果。感興趣的讀者可以對該組件進(jìn)行深入學(xué)習(xí)。配置關(guān)節(jié)組件碰撞觸發(fā)事件檢測第四節(jié)Collidion類碰撞檢測事件觸發(fā)檢測事件連續(xù)碰撞檢測CCD射線碰撞檢測與繪制4.4.1
Collidion類在4.2中對各類碰撞組件的屬性進(jìn)行了講解,這些組件都繼承自Collider類,而Collision類用于處理對象碰撞事件的檢測信息的Collision類中可以訪問以下屬性。碰撞和觸發(fā)檢測的條件碰撞器檢測條件是都需要有碰撞器組件且都不能勾選為觸發(fā)器并且掛腳本的物體上有剛體組件。觸發(fā)器檢測條件時都需要有碰撞器組件,至少有一個勾選為觸發(fā)器并且掛腳本的物體上有剛體組件。屬性功能collider我們撞擊的Collider(只讀)。contacts物理引擎生成的接觸點(diǎn),請改用GetContact或GetContacts。gameObject您正在碰撞其碰撞體的GameObject(只讀)。impulse為解析此碰撞而施加于該接觸對的總沖量。relativeVelocity這兩個碰撞對象的相對線性速度(只讀)。rigidbody碰撞到的Rigidbody(只讀),擊的對象未附加剛體則為null。transform我們撞擊的對象的Transform(只讀)。4.4.2碰撞檢測事件在Unity
3D中,檢測碰撞發(fā)生的方式有兩種,一種是利用碰撞體,另一種則是利用觸發(fā)器(Trigger)。觸發(fā)器用來觸發(fā)事件。在很多游戲引擎或工具中都有觸發(fā)器。例如,在角色扮演游戲里,玩家走到一個地方會發(fā)生出現(xiàn)Boss的事件,就可以用觸發(fā)器來實(shí)現(xiàn)。當(dāng)綁定了碰撞體的游戲?qū)ο筮M(jìn)入觸發(fā)器區(qū)域時,會運(yùn)行觸發(fā)器對象上的OnTriggerEnter函數(shù),同時需要在檢視面板中的碰撞體組件中勾選IsTrigger復(fù)選框。Collider.OnCollisionEnter(Collision)當(dāng)該碰撞體/剛體已開始接觸另一個剛體/碰撞體時,調(diào)用OnCollisionEnterCollider.OnCollisionStay(Collision)對應(yīng)正在接觸剛體/碰撞體的每一個碰撞體/剛體,每幀調(diào)用一次OnCollisionStay。Collider.OnCollisionexit(Collision)當(dāng)該碰撞體/剛體已停止接觸另一個剛體/碰撞體時,調(diào)用OnCollisionexit。4.4.2碰撞檢測事件using
UnityEngine;public
class
script_CollisionEvent
:
MonoBehaviour{private
void
OnCollisionEnter(Collision
collision){Debug.Log("與"+collision.gameO+"發(fā)生碰撞");
this.GetComponent<MeshRenderer>().material.color=Color.red;}private
void
OnCollisionStay(Collision
collision){Debug.Log("與"+collision.gameO+"處于碰撞中");collision.gameObject.GetComponent<MeshRenderer>().material.color
=Color.green;}private
void
OnCollisionexit(Collision
collision){Debug.Log("與"+collision.gameO+"碰撞解除");this.GetComponent<MeshRenderer>().material.color
=
Color.white;}}3.案例實(shí)踐創(chuàng)建一個小球和斜坡,當(dāng)小球下落與斜坡發(fā)生碰撞時調(diào)用碰撞事件檢測事件并修改對象材質(zhì)球上的顏色。案例代碼案例效果圖4.4.3觸發(fā)檢測事件觸發(fā)檢測事件指點(diǎn)是當(dāng)對象進(jìn)入某個區(qū)域時會被調(diào)用的事件,例如在游戲當(dāng)中角色進(jìn)入到傳送區(qū)域,便會切換場景。1.屬性介紹有關(guān)觸發(fā)檢測的函數(shù)方法見表4.4.3-1。Collider.OnTriggerEnter(Collider)當(dāng)Collider
other事件進(jìn)入該觸發(fā)器時調(diào)用
OnTriggerEnterCollider.OnTriggerStay(Collider)對于正在接觸該觸發(fā)器的每個其他Collider,“幾乎”所有幀都調(diào)用OnTriggerStayCollider.OnTriggerExit(Collider)當(dāng)Collider
other已停止接觸該觸發(fā)器時調(diào)用
OnTriggerExit。4.4.3觸發(fā)檢測事件using
UnityEngine;public
class
script_TriggerEvent
:
MonoBehaviour{private
void
OnTriggerEnter(Collider
other){Debug.Log(other.gameO+"進(jìn)入觸發(fā)檢測區(qū)域");}private
void
OnTriggerStay(Collider
other){Debug.Log(other.gameO+"處于觸發(fā)檢測區(qū)域");}private
void
OnTriggerExit(Collider
other){Debug.Log(other.gameO+"離開觸發(fā)檢測區(qū)域");}}3.案例實(shí)踐創(chuàng)建一個Cube對象與一塊觸發(fā)區(qū)域,當(dāng)Cube對象分別在進(jìn)入、處于、離開觸發(fā)區(qū)域時調(diào)用觸發(fā)事件函數(shù)。案例代碼案例效果圖4.4.4連續(xù)碰撞檢測CCD在碰撞體組件CollisionDetection碰撞檢測模式有Discrete、Continuous、ContinuourDynamic、ContinuousSpeculative。CCD確??焖僖苿拥奈矬w與對象碰撞,而不會穿過這些對象。Unity提供以下
CCD方法:基于掃掠的
CCD、推斷性CCD。掃掠的
CCD基于掃掠的
CCD采用撞擊時間
(TOI)算法,通過掃掠對象的前向軌跡來計(jì)算對象的潛在碰撞(采用對象的當(dāng)前速度)。如果沿對象移動方向有接觸,該算法會計(jì)算撞擊時間并移動對象直至達(dá)到該時間。該算法可從該時間開始執(zhí)行子步驟,即計(jì)算
TOI之后的速度,然后重新掃掠,代價是需要經(jīng)歷更多的
CPU周期。推斷性
CCD推斷性
CCD的工作原理是基于對象的線性運(yùn)動和角運(yùn)動增大一個對象的粗篩階段軸對齊最小包圍盒
(AABB)。該算法是一種推測性的算法,因?yàn)闀x取下一物理步驟中的所有潛在觸點(diǎn)。然后將所有觸點(diǎn)送入解算器,因此可確保滿足所有的觸點(diǎn)約束,使對象不會穿過任何碰撞。4.4.4連續(xù)碰撞檢測CCD操作步驟案例效果圖3.案例實(shí)踐Unity中創(chuàng)建連續(xù)碰撞檢測場景,測試不同檢測方式效果變化。在Hierarchy面板創(chuàng)建Cube對象并擺放如圖所示或?qū)?yīng)章節(jié)的預(yù)制體CCD_cj拖入場景中即可。為藍(lán)色“Cube”對象添加Rigidbody剛體組件,ConstantForce恒定力組件并設(shè)置Force為(0,0,50000)。為藍(lán)色“Sphere”對象添加Rigidbody剛體組件。設(shè)置“Sphere”和“Cube”對象Rigidbody剛體組件的
CollisionDetection模式為Discrete,運(yùn)行游戲,可以看到Cube快速移動消失,Sphere對象沒有受到影響。設(shè)置“Sphere”和“Cube”對象Rigidbody剛體組件的CollisionDetection模式為Continuous,運(yùn)行游戲,可以看到
Cube對象被綠色墻壁阻擋,Sphere對象沒有受到影響。設(shè)置“Sphere”和“Cube”對象Rigidbody剛體組件的CollisionDetection模式為ContinuousDynamic,運(yùn)行游戲??梢孕∏虮籆ube對象撞擊到墻上。4.4.5射線碰撞檢測與繪制碰撞檢測還可以通過繪制射線來進(jìn)行檢測,在虛擬世界環(huán)境中繪制一條從一個點(diǎn)向一個方向發(fā)射的一條沒有終點(diǎn)的線,檢測這條射線所碰撞到含有碰撞體的對象。1.Debug繪制線在指定的起始點(diǎn)與結(jié)束點(diǎn)之間繪制一條直線。當(dāng)游戲正在運(yùn)行并且啟用輔助圖標(biāo)繪圖時,將在
Editor的游戲視圖中繪制直線??梢詰?yīng)用于子彈的發(fā)射軌跡的繪制,函數(shù)曲的表達(dá)等。函數(shù)說明DrawLine在指定的起始點(diǎn)與結(jié)束點(diǎn)之間繪制一條直線DrawRay在世界坐標(biāo)中繪制一條從start到start+dir的直線public
static
void
DrawLine
(Vector3
start,
Vector3
end,
Color
color=
Color.white,float
duration=
0.0f,
bool
depthTest=
true);參數(shù)說明參數(shù)說明start直線起始點(diǎn)end直線結(jié)束點(diǎn)color直線顏色duration直線可見時長/秒depthTest否都被對象遮擋public
static
void
DrawRay
(Vector3
start,
Vector3
dir,
Color
color=
Color.white,float
duration=
0.0f,
bool
depthTest=
true);4.4.5射線碰撞檢測與繪制using
UnityEngine;public
class
DebugDrawLine
:
MonoBehaviour{public
Color
color;
public
float
duration;public
Transform
cube;
public
Transform
sphere;public
Transform
capsule;void
Awake(){color=Color.red;
duration
=1.0f;}void
Start(){Debug.DrawLine(Vector3.zero,Vector3.one,Color.red,5);}void
Update(){Vector3
start=cube.position;
Vector3
end=sphere.position;Vector3
dir=capsule.position-cube.position;Color
colorD=color;
float
durationD=duration;Debug.DrawLine(start,end,colorD,durationD);Debug.DrawRay(start,dir,colorD,durationD);}}案例代碼案例效果圖4.4.5射線碰撞檢測與繪制2.Physics物理射線Debug類只能在Scene面板中繪制射線,不能夠進(jìn)行射線碰撞檢測。Unity引擎的Physics類中提供射線碰撞檢測的方法可以在游戲中真實(shí)的產(chǎn)生一條線,可以應(yīng)用于判斷子彈是否打中敵人,發(fā)出的光線是否有照射到物體等,檢測人物跳躍距離地面的高度等。函數(shù)說明Raycast向場景中所有碰撞體發(fā)射一條射線RaycastAll向場景中投射射線并返回所有命中對象,不保證順序RaycastNonAlloc向場景中投射射線,并將命中對象存儲到緩沖區(qū)中參數(shù)說明參數(shù)說明origin射線起點(diǎn)direction射線方向maxDistance射線檢測最大距離layerMask層遮罩queryTriggerInteraction是否檢測觸發(fā)器hitInfo返回射線檢測碰撞信息ray光線起點(diǎn)和方向4.4.5射線碰撞檢測與繪制using
UnityEngine;public
class
RaycastDemo
:
MonoBehaviour{public
float
maxDistance;void
Awake(){maxDistance=2.0f;}void
FixedUpdate(){Vector3
origin=this.transform.position;Vector3
direction=this.transform.up;float
maxDistanceR=maxDistance;if(Physics.Raycast(origin,direction,maxDistanceR)){print("射線檢測到碰撞對象");}Vector3
dir=direction*maxDistanceR;Debug.DrawRay(origin,dir,Color.red,1);}}3.案例實(shí)踐使用Debug類中DrawLine和DrawRay繪制兩條相交的直線。案例代碼案例效果圖4.4.5射線碰撞檢測與繪制3.RaycastHit射線碰撞信息Raycast只能進(jìn)行碰撞檢測并不能獲取到碰撞對象的信息,可以看到在Raycast的第2和第4個重載函數(shù)中需要傳入RaycastHit,而RaycastHit類用于獲取射線投射碰撞到對象的信息結(jié)構(gòu),先了解一下可以獲取到碰撞對象的信息見下表。變量說明變量說明collider命中的Colliderdistance射線到原點(diǎn)距離normal射線命中表面法線point碰撞點(diǎn)世界坐標(biāo)rigidbody碰撞對象剛體組件transform碰撞對象Transform4.4.5射線碰撞檢測與繪制using
UnityEngine;public
class
RaycastHitDemo
:
MonoBehaviour{public
float
maxDistance;public
GameObject
hitObj;void
Awake(){maxDistance=2.0f;}void
FixedUpdate(){RaycastHit
hit;Vector3
origin=this.transform.position;Vector3
direction=this.transform.up;float
maxDistanceR=maxDistance;if(Physics.Raycast(origin,direction,out
hit,maxDistanceR)){print(hit.collider.gameO);print(hit.distance);hitObj=hit.transform.gameObject;hitObj.GetComponent<MeshRenderer>().material.color=Color.red;}else{if(hitObj!=null)hitObj.transform.GetComponent<MeshRenderer>().material.color=Color.white;
}Vector3
dir=direction*maxDistanceR;Debug.DrawRay(origin,dir,Color.red,1);}}案例代碼案例效果圖4.4.5射線碰撞檢測與繪制4.Camera相機(jī)射線雖然Physics中提供了多種射線碰撞檢測方法,但都是游戲內(nèi)對象發(fā)出射線,無法實(shí)現(xiàn)用戶通過屏幕進(jìn)行交互發(fā)出射線。Camera類中提供攝像機(jī)發(fā)出射線以及鏡頭坐標(biāo)與游戲空間位置進(jìn)行轉(zhuǎn)換的相關(guān)函數(shù),可以應(yīng)用于虛擬環(huán)境下物體的拾取,碰撞檢測等功能。函數(shù)說明ScreenPointToRay返回從攝像機(jī)通過屏幕點(diǎn)的光線ScreenToViewportPoint將position從屏幕空間變換為視口空間ScreenToWorldPoint將position從屏幕空間變換為世界空間ViewportPointToRay返回從攝像機(jī)通過視口點(diǎn)的光線ViewportToScreenPoint將position從視口空間變換為屏幕空間ViewportToWorldPoint將position從視口空間變換為世界空間4.4.5射線碰撞檢測與繪制0f,using
UnityEngine;public
class
ScreenPointToRayDemo
:
MonoBehaviour{void
Update(){if
(Input.GetMouseButtonDown(0)){RaycastHit
hit;var
ray
=Camera.main.ScreenPointToRay(Input.mousePosition);if
(Physics.Raycast(ray,
out
hit)){if
(hit.rigidbody
!=
null){hit.rigidbody.AddForceAtPosition(ray.direction
*
200.hit.point);}Debug.Log(hit.transform.position);}}}}案例代碼案例效果圖使用Camera類中ScreenPointToRay方法實(shí)現(xiàn)屏幕交互點(diǎn)發(fā)出射線與游戲內(nèi)對象實(shí)現(xiàn)交互功能物理引擎高級系統(tǒng)設(shè)置第五節(jié)蒙皮網(wǎng)格過濾器布料系統(tǒng)角色控制器物理全局管理面板物理調(diào)試可視化4.5.1蒙皮網(wǎng)格過濾器Skinned
Mesh
Renderer蒙皮網(wǎng)格過濾器可以模擬出非常柔軟的網(wǎng)格體,不但在布料中充當(dāng)非常重要的角色,同時還支撐了人形角色的蒙皮功能,通過運(yùn)用該組件,可以模擬出許多與皮膚類似的效果。屬性功能Cast
Shadows網(wǎng)格是否接受光源的投射陰影。Receive
Shadows網(wǎng)格是否顯示其他物體投射到自身上的陰影。Motion
Vectors是否將線運(yùn)動矢量渲染到攝像機(jī)運(yùn)動矢量紋理中。Materials網(wǎng)格渲染時使用的材質(zhì)的列表。Light
Probes基于探針的光照插值模式Quality定義蒙皮時每個頂點(diǎn)用的最大骨骼數(shù)。骨骼數(shù)越多,渲染器質(zhì)量越高M(jìn)esh使用此屬性可定義該渲染器使用的網(wǎng)格Bounds用于判定網(wǎng)格是否超出屏幕外的包圍體Reflection
Probes如果有反射探針,是否將對象反射紋理設(shè)為內(nèi)置著色器uniform變量4.5.2布料系統(tǒng)布料是Unity
3D中的一種特殊組件,它可以隨意變換成各種形狀,例如桌布、旗幟、窗簾等。布料系統(tǒng)包括交互布料與蒙皮布料兩種形式。屬性功能屬性功能StretchingStiffness布料的拉伸剛度Friction布料與角色碰撞時的摩擦力BendingStiffness布料的彎曲剛度Use
Gravity是否施加重力Use
Tethers施加約束防止過渡拉伸Damping運(yùn)動阻尼系數(shù)External
Acceleration施加在布料上的恒定外部加速度Random
Acceleration施加在布料上的隨機(jī)外部加速度World
Velocity
Scale受到世界空間移動會影響布料頂點(diǎn)的程度World
Acceleration
Scale受到世界空間加速度會影響布料頂點(diǎn)的程度Collision
Mass
Scale碰撞粒子的質(zhì)量增加量Sleep
Threshold布料的睡眠閾值Capsule
Colliders與Cloth實(shí)例碰撞的CapsuleCollider的數(shù)組Sphere
Colliders與Cloth實(shí)例碰撞的SphereCollider的數(shù)組4.5.2布料系統(tǒng)3.案例實(shí)踐利用Cloth布料系統(tǒng)制作一面旗子,通過約束的方式繪制固定點(diǎn),并更改Accelerati數(shù)值嘗試風(fēng)吹動效果。組件效果圖案例效果圖4.5.3角色控制器CharacterController角色控制器主要用于第三人稱或第一人稱游戲主角的控制。角色在使用角色控制器后,其物理模擬計(jì)算將不再使用剛體組件,掛載的剛體組件將失去效果。角色控制器不會受力的影響,只可以通過Move和SimpleMove函數(shù)來控制運(yùn)動,但能夠受到碰撞
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024聘用司機(jī)保障及激勵機(jī)制的勞動合同3篇
- 2025年度版權(quán)出版合同終止協(xié)議3篇
- 2024版版權(quán)轉(zhuǎn)讓協(xié)議書3篇
- 2025年度溫泉度假村水池建設(shè)與運(yùn)營合同3篇
- 二零二五年度有機(jī)食品供應(yīng)鏈合作協(xié)議書3篇
- 2024鋁合金模板租賃與工程量清單編制合同范本3篇
- 二零二五年度旅游區(qū)餐飲服務(wù)外包合同2篇
- 2025版鋼結(jié)構(gòu)工程鋼筋組勞務(wù)分包及防腐合同3篇
- 2024綠化項(xiàng)目苗木采購協(xié)議模板一
- 二零二五年度水利工程水鉆打孔服務(wù)合同模板9篇
- 安寧療護(hù)中的醫(yī)患溝通-
- GB 1886.174-2024食品安全國家標(biāo)準(zhǔn)食品添加劑食品工業(yè)用酶制劑
- 20以內(nèi)退位減法口算練習(xí)題100題30套(共3000題)
- 無人機(jī)遙感技術(shù)與應(yīng)用
- 2023年物探工程師年度總結(jié)及下一年計(jì)劃
- 電工(三級)理論知識考核要素細(xì)目表
- 4馬克思主義宗教觀
- 2023年阿拉善教育系統(tǒng)教師考試真題及答案
- 全國優(yōu)質(zhì)課一等獎職業(yè)學(xué)校教師信息化大賽建筑類《混凝土的和易性》說課課件
- 泰山石膏(包頭)有限公司企業(yè)標(biāo)準(zhǔn)
- 初中英語知識大匯總(374張)
評論
0/150
提交評論