[英]C# Unity Raycasting / BoxCast / SphereCast in a half sphere shape
上圖顯示了一個 boxcast,因為我試圖實現這一點是行不通的。 基本上,最好的方法是像我在 boxcast 屏幕截圖上繪制的那樣投射半個球體或四分之一球體。
我試圖為大炮建立一個瞄准敵人並射擊他們的系統,但是船右側的大炮不應該嘗試瞄准船左側的敵人,因此我認為這是一個合理的方法: boxcast 單面和 go 從那里。
唉,對於這個問題,boxcast 非常有限,因為敵人很容易在盒子外面,但仍然在船的右側。
有一個更好的方法嗎? boxcast 也受到限制,因為您只能設置 2 個維度,即它的立方體大小,然后是它的長度。 我不認為我可以使用 SphereCast,因為那也會瞄准左側的敵人。 或者有沒有辦法確定哪些敵人在前面,哪些在右邊,哪些在后面,哪些在左邊,並將它們放在Lists (rightEnemiesList, frontEnemiesList, leftEnemiesList, backEnemisList
)?
我該如何解決這個問題? 出於性能原因,我也不想在每一側使用 50 行光線投射。 更不用說我實際上計算了 4 面,所以我們在每一面都有大炮,而且在船的前后都有大炮來向前和向后射擊。
boxcast 的代碼,雖然它並沒有給這個問題增加太多:
var half = ship.mainGunCaliber.range * .5f;
var rotationY = hullParent.localEulerAngles;
rotationY = new Vector3(0, rotationY.y, 0);
Quaternion boxRot = Quaternion.Euler(rotationY);
RaycastHit[] hits = Physics.BoxCastAll(hullParent.transform.position + hullParent.transform.right,
Vector3.one * ship.length,
hullParent.transform.right,
boxRot,
half);
謝謝!
感謝 Daevin 為我指明了正確的方向,這就是我到目前為止所得到的。 它會根據他們相對於我們船的方向將敵人添加到正確的列表中,它並不完美,因為角度是從船的中心計算的。 如果目標太接近,這會產生一些奇怪的結果,而且我覺得這不是最優化的方法,所以如果你有更好的方法,請告訴我們!
foreach (Transform target in enemyTargets)
{
if (Vector3.Distance(transform.position, target.position) > ship.mainGunCaliber.range)
continue;
Vector3 toTarget = target.position - transform.position;
print(Vector3.SignedAngle(transform.forward, toTarget, Vector3.up));
if (Vector3.SignedAngle(transform.forward, toTarget, Vector3.up) >= bowMinAngle &&
Vector3.SignedAngle(transform.forward, toTarget, Vector3.up) <= bowMaxAngle)
{
if (!bowTargets.Contains(target))
{
RemoveFromOthers(target);
bowTargets.Add(target);
print("added target to Bow");
}
}
if (Vector3.SignedAngle(transform.forward, toTarget, Vector3.up) >= sbMinAngle &&
Vector3.SignedAngle(transform.forward, toTarget, Vector3.up) <= sbMaxAngle)
{
if (!sbTargets.Contains(target))
{
RemoveFromOthers(target);
sbTargets.Add(target);
print("added target to SB");
}
}
if (Vector3.SignedAngle(-transform.forward, toTarget, Vector3.up) >= aftMinAngle &&
Vector3.SignedAngle(-transform.forward, toTarget, Vector3.up) <= aftMaxAngle)
{
if (!aftTargets.Contains(target))
{
RemoveFromOthers(target);
aftTargets.Add(target);
print("added target to Aft");
}
}
if (Vector3.SignedAngle(transform.forward, toTarget, Vector3.up) >= psMinAngle &&
Vector3.SignedAngle(transform.forward, toTarget, Vector3.up) <= psMaxAngle)
{
if (!psTargets.Contains(target))
{
RemoveFromOthers(target);
psTargets.Add(target);
print("added target to PS");
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.