0

Raycast 穿过墙壁并击中玩家。 说命中为空

我有一个光线投射,但它会像预期的那样穿过敌人,但它没有击中其他任何东西。如果我移除面具,它会击中敌人层。如果我删除图层并使用 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);。如果我删除它,什么都不会发生。没有错误,也没有命中。

这是代码

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

    }
4

1 回答 1

2

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

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

然后在你的光线投射中使用这个遮罩。

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

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

Debug.DrawLine(transform.position, transform.position + direction * (myCircle.radius + 1) / direction.magnitude, Color.white);
于 2014-11-12T12:32:23.043 回答