我在 Unity 中有一個非常基本的播放器,我使用它撰寫了與物件碰撞的代碼,Physics.ComputePenetration(...)并且效果相對較好。問題是我想要更多關于玩家在哪里撞到對撞機的詳細資訊。
需要注意的一些事項:
首先,這個專案的想法是看看我是否可以CharacterController使用ComputePenetration. 我目前正在嘗試復制內置OnControllerColliderHit(...)函式,該函式允許我獲取發生命中的位置。
其次,我沒有使用SphereCollider. 如果我是,那么我所要做的就是獲取回傳的direction向量并將其乘以球體的半徑(以及其他一些事情)。但可悲的是,我正在使用 a CapsuleCollider(也許有一種方法可以做同樣的事情,但對于 a CapsuleCollider,但我一直找不到)。
我試過的:
我最初的想法是獲取玩家擊中的對撞機hitCollider,然后執行以下代碼片段:
Vector3 point = hitCollider.ClosestPoint(player.transform.position);
獲得命中對撞機上的最近點。從那里,我可以打電話
Vector3 finalPoint = player.collider.ClosestPoint(point);
讓玩家獲得最接近碰撞體最近點的點。這很令人困惑,但效果很好。然而,只有一個缺點:我計劃使用 ProBuilder 來完成我的很多關卡設計,并且你不能呼叫沒有設定為 trueClosestPoint的,這是 ProBuilder 中的大多數網格。MeshColliderconvex
我想到了其他一些事情,比如也許我可以反轉方向,然后做一些(不是那么)hacky 數學來獲得接觸點等,但似乎沒有什么可以作為一個成熟的解決方案。
結束思想:
我開始認為這在技術上是不可能的。如果你仔細想想,這是真的,因為當兩個物件相交時,沒有一個點可以定義它,而是整個體積都可以定義它。但是獲得該交易量的平均位置將(也許?)是解決方案。
有任何想法嗎?
先感謝您!
uj5u.com熱心網友回復:
對于其他好奇的人,我找到了解決方案。在檢測到碰撞Physics.ComputePenetration(...)之間時ourCollider,selectedCollider請確保先穿透,然后執行以下操作:
呼叫 a Physics.CapsuleCast(...),但要確保point1、point2和radius是比原始膠囊大小略小的值(可能是 0.001)。這是因為CapsuleCast會認為它與 相交,selectedCollider因此會直接穿過它,這是您不想要的。然后只需將您direction的負方向從Physics.ComputePenetration(...).
所以你的代碼最終看起來像這樣:
var origin = this.transform.position this.center;
var offset = new Vector3(0.0f, this.height / 2.0f - this.radius - someTinyValue, 0.0f);
if (Physics.CapsuleCast(
origin offset,
origin - offset,
this.radius - someTinyValue,
-direction,
out var hit))
{
// Do whatever with the `hit` variable
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/488293.html
上一篇:如何使用dotween緩出浮動?
