放大RayCast大小的最佳方法

时间:2015-08-12 17:22:12

标签: unity3d

我在地板上画了一个圆圈。应检测通过该圆圈的所有内容。以下代码正在运行:

void Update () {
    RaycastHit hit;
    Ray landingRay = new Ray (transform.position, Vector3.up);

    // This debug does not seem to work:
    Debug.DrawRay (transform.position, Vector3.up * 50);

    if( Physics.Raycast(landingRay, out hit) ){
        Debug.Log("raycast is working!");
    }
}

但是,我认为RayCast仅位于我绘制的Sprite的中心(1),因此它不会覆盖整个圆圈(2):

current and wanted raycasts

有没有最佳方式来执行此操作?或者我应该在同一个脚本中编写几个RayCast?

3 个答案:

答案 0 :(得分:2)

我建议只在球体上放置一个球体或胶囊对撞机(在触发模式下)并在OnTriggerEnter()处理碰撞。这应该比光线投射更有效。

您可以在此处查看有关该主题的official video tutorial

答案 1 :(得分:1)

您要做的是SphereCast

RaycastHit hit;
float radius = 5f;
float distance = 50f;
Ray landingRay = new Ray (transform.position, Vector3.up);
if (Physics.SphereCast(landingRay, radius, out hit, distance)
{
    // Do something
}

答案 2 :(得分:0)

每帧发射许多光线投影并不是最佳选择。您可以做的是使用圆的中心,并使用Physics2D.OverlapCircleAllPhysics2D.OverlapCircleAllNonAlloc来检查哪些碰撞器在圆圈范围内。

实施例

将CircleDetector.cs附加到具有圆形精灵的游戏对象

public class CircleDetector : MonoBehaviour {

    public float radius = 2;  //This is the radius of the circle Sprite

    void Update () {
        var affectedColliders = Physics2D.OverlapCircleAll(transform.position, radius);
        if(affectedColliders.Length > 0) {
            Debug.Log(string.Format("There were {0} Game Objects within the circle", new object[] { affectedColliders.Length }));
        }
    }
}