提问者:小点点

光线投射未显示命中


我有一个光线投射,但是它穿过敌人,就像它应该做的那样,但是它没有击中其他东西。如果我移除面具,它会击中敌人层。如果我移除该层并使用光线投射,它只会击中敌人。

如果我使用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);
            }

    }

共1个答案

匿名用户

看来有两件事在起作用。首先,根据文件,Raycast 2D还将在射线开始时检测对撞机。如果你不使用光线卡斯特,那么源敌人会在你的光线进入世界之前阻止它。为了防止这种情况,你可以使用一个层蒙版。只是为了确定,图层蒙版表示你想要击中的图层,而不是你想要忽略的图层。因此,为了确保敌人层是你唯一忽略的层,你可以使用以下方法:

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

然后在你的光线投射中使用这个面具。

第二,你没打其他东西肯定有原因。如果你用错误的方式应用了层掩码,那么你会过滤掉任何对墙壁或球员的命中。看起来你们都有一个敌人标签和一个敌人层,所以一定要弄清楚。但是如果你在没有蒙版的情况下使用raycastAll,仍然没有击中任何东西,那么要确保你的对象满足所有的要求。当然,他们必须有2D对撞机。如果他们有碰撞器,确保他们要么不是触发器,要么在Edit->中启用了“Raycasts命中触发器”;项目设置->;物理2D。

最后一件要检查的事情是你的射线是否足够远。我注意到你的调试图没有完全反映你的光线投射。使用此图绘制实际光线:

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