raycast没有显示命中

时间:2014-11-10 17:04:15

标签: unity3d unityscript unity3d-2dtools

Raycast going through wall and hitting player.  Says hit is null

我有一个光线投射,然而它会通过它想象的敌人,但它没有其他任何东西。如果我移除面具,它会击中敌人层。如果我删除图层并使用raycastall它只会击中敌人。

如果我使用光线投射,它会通过墙壁清晰并击中播放器,但不会显示为点击,实际上我会收到错误

    NullReferenceException: Object reference not set to an instance of an object
    EnemyAI.OnTriggerEnter2D (UnityEngine.Collider2D other) (at Assets/Scripts/EnemyAI.cs:32)

第32行是Debug.Log(hit.transform.gameObject);.如果我删除它,根本没有任何事情发生。没有错误,没有命中。

Heres是代码

    void OnTriggerEnter2D(Collider2D other){
        if (other.gameObject.tag == "Player") {
            myStats.inRange = true;

        Vector2 direction = other.transform.position - transform.position;
            hit = Physics2D.Raycast(transform.position, direction, myCircle.radius + 1, LayerMask.GetMask("enemies"));
            Debug.Log("Radius size is " + (int)myCircle.radius);
            Debug.Log("donthit value " + LayerMask.GetMask("Enemies"));
                Debug.Log("direction " + (myStats.player.transform.position - transform.position));
            Debug.DrawRay(transform.position, other.transform.position - transform.position, Color.white);
            Debug.DrawLine(transform.position, myStats.player.transform.position, Color.white);
            //Destroy(hit.transform.gameObject);
            Debug.Log (hit.transform.gameObject);
        if(hit != null && hit.transform.gameObject != null){
            if (hit.transform.gameObject.tag == "INDESTRUCTIBLE") {          
                Debug.Log("WALL");
                //  Destroy the Tag "Enemy" here
            }
            if (hit.transform.gameObject.tag == "Player") {          
                Debug.Log("player");
                //  Destroy the Tag "Enemy" here
            }

            Debug.Log("Tag name is " + hit.collider.tag);
        }

                Debug.DrawRay(transform.position, myStats.player.transform.position - transform.position, Color.white);
            }

    }

1 个答案:

答案 0 :(得分:1)

所以看来这里有两件事情在起作用。首先,根据the documentation,Raycast 2D还将检测射线开始处的对撞机。如果你不使用raycastAll那么源敌人会在你的光线进入世界之前停止它。为了防止这种情况,您可以使用图层蒙版。可以肯定的是,图层蒙版表示您想要点击的图层,而不是您要忽略的图层。因此,为了确保敌人图层是您忽略的唯一图层,您可以使用它:

var layerMask = Physics2D.DefaultRaycastLayers & ~LayerMask.GetMask("Enemies");

然后在你的光线投射中使用这个掩码。

其次,必须有一个原因,你没有打其他任何东西。如果您以错误的方式应用了图层蒙版,则可以过滤掉墙壁或播放器上的所有点击。看起来你们都有敌人的标签和敌人的一层,所以一定要直截了当。但是如果你使用没有面具的raycastAll并且仍然没有击中任何东西,那么请确保你的对象满足所有要求。他们当然必须有2D对撞机。如果他们有碰撞器,请确保它们不是触发器,或者在编辑 - >中启用了“Raycasts命中触发器”。项目设置 - > physics2d。

最后要检查的是你的光线是否足够远。我注意到你的调试绘图并不能完美地反映你的光线投射。用它来绘制实际的光线:

Debug.DrawLine(transform.position, transform.position + direction * (myCircle.radius + 1) / direction.magnitude, Color.white);