Unity3d raycast没有显示命中率

Unity3d raycast没有显示命中率,unity3d,unityscript,unity3d-2dtools,Unity3d,Unityscript,Unity3d 2dtools,我有一个光线投射,但是它会像预期的那样穿过敌人,但是它不会击中其他任何东西。如果我移除面具,它会击中敌人层。如果我移除图层并使用raycastall,它只会击中敌人 如果我使用raycast,它会穿过一堵墙,击中玩家,但不会显示为击中,事实上,我得到了错误 NullReferenceException: Object reference not set to an instance of an object EnemyAI.OnTriggerEnter2D (UnityEngin

我有一个光线投射,但是它会像预期的那样穿过敌人,但是它不会击中其他任何东西。如果我移除面具,它会击中敌人层。如果我移除图层并使用raycastall,它只会击中敌人

如果我使用raycast,它会穿过一堵墙,击中玩家,但不会显示为击中,事实上,我得到了错误

    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);。如果我移除它,什么也不会发生。没有错误,也没有命中

这是密码

    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);
            }

    }

看来有两件事在起作用。首先,根据,Raycast 2D还将检测光线开始处的碰撞器。如果你不使用雷卡斯塔尔,那么源敌人将在你的射线进入世界之前阻止它。为了防止出现这种情况,可以使用图层遮罩。可以肯定的是,层遮罩表示要命中的层,而不是要忽略的层。因此,为了确保敌人层是您唯一忽略的层,您可以使用以下方法:

var layerMask = Physics2D.DefaultRaycastLayers & ~LayerMask.GetMask("Enemies");
然后在光线投射中使用此遮罩

第二,你不打别的东西肯定是有原因的。如果你以错误的方式应用了layermask,那么你会过滤掉任何对墙或玩家的点击。看起来你们都有一个敌方标签和一个敌方图层,所以一定要弄清楚这一点。但是,如果您使用了没有遮罩的raycastAll,但仍然没有命中任何对象,那么请确保您的对象满足所有要求。当然,他们必须有2D对撞机。如果它们有碰撞器,请确保它们不是触发器,或者在编辑->项目设置->physics2d中启用了“光线投射命中触发器”

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

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

您的脚本附加到哪个对象?它看起来像是敌人,你试图弄清楚敌人是否在玩家进入射程时有视线。对吗?如果是这样,不要使用敌人图层掩码。Raycastall对你没有帮助,因为它只会沿着光线返回更多结果,而不是第一次命中(如果有的话)。如果我移除敌人图层,则raycast会命中他自己。问题是除了敌人之外,Raycastall没有返回任何结果。有没有办法看到带有图层遮罩的DrawLine或DrawRay?在他们的文档中似乎不是参数