簡體   English   中英

C# Unity Raycasting / BoxCast / SphereCast 半球形

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM