(Doc) Fracturing & Destruction Scripting
本篇文章、圖片出處來自 Fracturing & Destruction Scripting
軟體版本與本翻譯文件可能會有落差,本翻譯文件僅供參考。
本譯文為本站譯者原創翻譯內容,文字著作權歸本站所有。
未經授權,請勿任意轉載、改作或商業使用。
Fracturing & Destruction Scripting(碎裂與破壞:腳本控制)
這裡說明你可以透過腳本使用的公開方法(exposed methods)。
除了碰撞通知(collision notifications)之外,你主要會接觸到 2 個類別:
- FracturedObject:掛有 FracturedObject 元件的 GameObject。
- FracturedChunk:當計算碎裂(fracturing is computed)後,由 FracturedObject 產生的每個碎塊(chunk)。 每個碎塊的 GameObject 都會掛有一個 FracturedChunk。
FracturedObject methods(FracturedObject 方法)
void Explode(Vector3 v3ExplosionPosition, float fExplosionForce)
將整個物件爆炸成碎塊(chunks)。
- v3ExplosionPosition:爆炸的來源點。
- fExplosionForce:爆炸強度。
void Explode(Vector3 v3ExplosionPosition, float fExplosionForce, float fRadius, bool bPlayExplosionSound, bool bInstanceExplosionPrefabs, bool bAlsoExplodeFree, bool bCheckStructureIntegrityAfter)
因為提供了影響半徑(influence radius),所以只會部分爆炸物件(partial explode)。
- v3ExplosionPosition:爆炸來源位置。
- fExplosionForce:爆炸強度。
- fRadius:爆炸半徑。只有在此半徑內的碎塊會受到爆炸影響。
- bPlayExplosionSound:是否播放爆炸音效(sound clip)? 此音效在元件面板(component panel)的 Events 區段中設定。
- bInstanceExplosionPrefabs:是否實例化(instance)爆炸 prefabs? 這些 prefabs 多半是爆炸粒子效果,並同樣在元件面板的 Events 區段設定。
- bAlsoExplodeFree:是否也讓自由碎塊(free chunks;也就是已經從物件脫離的碎塊)同樣受到爆炸影響?
- bCheckStructureIntegrityAfter:若此物件具有連結資訊(透過檢視器中的 "Connection Information" 參數), 且爆炸後需要檢查是否有可能塌陷的碎塊,則將此值設為 true。
void CollapseChunks()
將整個物件塌陷,並把所有碎塊設為自由(free)。
void ResetChunks()
將所有碎塊重設回最初、未破壞的位置。 唯一條件是:在呼叫之前沒有任何碎塊被刪除。
FracturedChunk methods(FracturedChunk 方法)
static FracturedChunk ChunkRaycast(Vector3 v3Pos, Vector3 v3Forward, out RaycastHit hitInfo)
回傳從位置 v3Pos 朝向 v3Forward 方向做 raycast 時所相交的碎塊;
如果沒有任何碎塊相交則回傳 null。
hitInfo 會包含 raycast 的資訊(請參考 Unity 的 RayCastHit 參考文件)。
void Impact(Vector3 v3Position, float fExplosionForce, float fRadius, bool bAlsoImpactFreeChunks)
用來通知一個撞擊(impact)(子彈、飛彈,或任何一般物件)擊中「仍附著於結構」的某個碎塊。 通常做法是:從武器進行 raycast 來確認視線上是否有碎塊;武器開火且命中時呼叫此方法。 這會以以下參數產生爆炸:
- v3Position:撞擊位置(由 raycast 提供)。
- fExplosionForce:爆炸強度。
- fRadius:爆炸半徑。半徑內所有碎塊也會一起脫離並爆炸。
- bAlsoImpactFreeChunks:若自由碎塊在半徑內,也會一併爆炸。
void DetachFromObject(bool bCheckStructureIntegrity = true)
讓碎塊從結構上脫離。 若 bCheckStructureIntegrity 為 true,會執行結構完整性檢查(structure integrity check), 以確認是否還有更多碎塊需要塌陷 (只有在檢視器中設定了 "Connection Information" 參數時才使用此功能)。
Collision notifications(碰撞通知)
如果你在檢視器面板中,對應的 Events 區段設定了 "Call Method Name" 與 "Call GameObject" 參數, 那麼當碎塊脫離或發生碰撞時,你會收到通知。 這可用於自訂處理:當 prefab 實例化或音效片段不足以滿足需求時,你可以自行擴充邏輯。
被呼叫的方法會接收到一個 FracturedChunk.CollisionInfo 物件,例如:
void OnChunkNotification(FracturedChunk.CollisionInfo info)
{
https:// Do something fancy here
}
重要! 與另外兩個事件不同,區段 "On Every Chunk Detach Event" 的事件不會接收任何參數。 這個事件會在每次碎塊從物件脫離時觸發,無論原因為何。 而 "Chunk Detach From Öbject Due To Physics Collision" 事件只會在剛體(rigidbody)與物件碰撞時觸發; 若是腳本呼叫(FracturedObject.Explode(), FracturedObject.CollapseChunks(), FracturedChunk.Impact(), FracturedChunk.DetachFromObject()...)所造成的脫離,則不會觸發此事件。
FracturedChunk.CollisionInfo parameters(FracturedChunk.CollisionInfo 參數)
- chunk(type FracturedChunk): 接收到碰撞、且即將脫離或碰撞的碎塊(依照你要求的通知類型而定)。
- collisionInfo(type Collision): Unity 3D 提供的碰撞資訊。 例如你可以用它取得接觸點(contact points)或法線(normals)。
- bIsMain(bool): 只在你要求「脫離通知」時使用。 對於非主碎塊,這個值用來表示該碎塊是否為主碎塊(被命中的那個), 或是因為鄰近關係而一起脫離的碎塊(由於 FracturedObject.ChunkConnectionStrength < 1)。
- bCancelCollisionEvent(bool): 若設為 true,會取消碰撞事件,使其不執行任何動作。