使用光线投射防止破折号穿过墙壁

时间:2021-05-15 14:59:32

标签: c# visual-studio unity3d raycasting

目前,我想在 2D 游戏中为玩家做一个统一的冲刺。我在玩家的左右两侧使用游戏对象来使用光线投射来检查某个区域与墙壁的距离。如果它离墙太近,我需要它只冲那个距离(到墙)而不是整个距离(在墙后面/穿过墙)。

这是我在玩家移动中冲刺的代码(DashCheckLeft 距离玩家 -0.5)(DashCheckRight 距离玩家 0.5):

{
  "nodes": [
    {
      "id": 1,
      "firstName": "Bjoerne",
      "lastName": "Nessi",
      "birthDate": "11.09.81",
      "hobby": ["Gardening", "Catering", "Psychology"],
      "city": "Mingguang",
      "skills": ["CSS", "HCI", "MMI"],
    },
    ...
  ],
  "links": [
    {"source": 1, "target": 2}, ...
  ]
}

现在的问题是,显然我只是在缩短玩家和 DashChecks 之间的距离(0.5f)而不是预期的 3f,我相信这可能是因为光线投射以某种方式击中了玩家的对撞机,但是将我的播放器更改为“忽略光线投射”层会使其掉到地板上,也无法解决问题。

1 个答案:

答案 0 :(得分:0)

我解决了这个问题,并找到了答案。基本上,你的光线投射也在检测玩家的碰撞器。对此有一个简单的解决方法。您应该将第四个参数添加到您的光线投射中。第四个参数是 LayerMask。 LayerMask 就像一个标签,但您可以同时启用多个标签。这就是我将代码更改为的内容(我也做了一些额外的调整):

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    Rigidbody2D rb;
    public float dashDistance = 3f;
    public LayerMask floor;
    float distance;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
            RaycastHit2D left = Physics2D.Raycast(transform.position, -transform.right, dashDistance, floor);
            RaycastHit2D right = Physics2D.Raycast(transform.position, transform.right, dashDistance, floor);
            if (left.collider != null)
            {
                print("left");
                distance = Mathf.Abs(left.point.x - transform.position.x);
                distance = -distance;
            }
            else if (right.collider != null)
            {
                print("right");
                distance = Mathf.Abs(right.point.x - transform.position.x);
            }
            else
            {
                distance = dashDistance;
            }
            print(distance);

            Debug.Log("Dashed");
            Dash();
        }
        void Dash()
        {
            rb.position = new Vector2(rb.position.x + distance, rb.position.y);
        }
    }
}

(当我说“世界对象”时,我指的是构成地形的对象。例如地面或树木)您应该通过单击世界对象来添加一个新层。然后,您应该查看检查器的顶部,然后单击“图层 Default”下拉菜单,然后单击“添加图层...”按钮。然后在该列表上写一个新名称。返回世界游戏对象,然后单击相同的下拉菜单,然后选择您想要的世界图层。您应该确保所有世界对象都具有同一层。回到玩家对象,在检查器中,将“地板”变量设置为与世界相同的层。如果这没有意义,这里是如何设置图层的link