统一的二维光线投射不起作用

2D raycasting in unity doesn't work

这是我一直在处理的代码:

using System.Collections.Generic;
using UnityEngine;

public class MovePlayer : MonoBehaviour
{
    public float sidewaysForce;
    public float jumpingForce;

    public Rigidbody2D playerRigidbody;
    public Transform playerTransform;

    private Vector2 forceToAdd;
    private bool onGround;

    private LayerMask mask = 8;

    private void Start()
    {
        forceToAdd = new Vector2(0, 0);
    }

    void FixedUpdate()
    {
        // Basic left/right movement

        forceToAdd.x = 0;
        forceToAdd.y = 0;

        if (Input.GetKey(KeyCode.A))
        {
            forceToAdd.x = -sidewaysForce;
        }
        else if (Input.GetKey(KeyCode.D))
        {
            forceToAdd.x = sidewaysForce;
        }

        if (Input.GetKey(KeyCode.Space) && onGround == true)
        {
            forceToAdd.y = jumpingForce;
            onGround = false;
        }

        var something = Physics2D.Raycast(playerTransform.position, Vector2.down, 200000f, mask.value);

        Debug.Log(something.collider);

        playerRigidbody.AddForce(forceToAdd, ForceMode2D.Impulse);
    }
}

我的问题是:无论我将播放器向上移动多远,无论是 (0,5) 还是 (0, 2044),它仍然会打印出 "Hit ground."

我已经尝试了 Physics 和 Physics2D,我已经尝试了 LayerMasking,所有的东西,但它都不行。顺便说一句,我是 Unity 的初学者。

编辑: 我打印了 Physics2D.Raycast(playerTransform.position, Vector3.down, 2f).collider 结果是 "Player," 而不是 "Ground," 有什么办法可以解决这个问题吗?我尝试将距离增加到 20 和 2000,但它仍然产生 "Player,"。有什么想法吗?

编辑 #2: 我也试过 LayerMasks,但还是不行。

问题是您正在解析 Physics2D.Raycast 错误的参数。正如您在 Unity 文档中所见,该函数采用 Vector2 而不是 Vector3。

https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html

另外,为了在 Unity 中测试光线投射,请始终将距离参数设置为 Mathf.Infinity,直到您完全设计出解决方案。这将使您免于调试时的头痛。最好的做法是添加注释,说明它是一个临时距离值,以后应该更改。

以后在论坛上发布您的问题时,请确保您正确解释了您的问题,因为我真的必须查看您的代码才能找到目的。

我不会评论你的代码设计,因为这是堆栈溢出而不是 reddit,但我在大学教编程,如果你愿意学习,我很乐意提供帮助:)