统一的二维光线投射不起作用
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,但我在大学教编程,如果你愿意学习,我很乐意提供帮助:)
这是我一直在处理的代码:
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,但我在大学教编程,如果你愿意学习,我很乐意提供帮助:)