所以这是我一直在研究的代码:
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),它仍会打印出“击中地面”。
我已经尝试过Physics和Physics2D,我已经尝试过LayerMasking,但是它不会起作用。我是Unity btw的初学者。
编辑:我打印Physics2D.Raycast(playerTransform.position, Vector3.down, 2f).collider
我结束了“播放器”,而不是“地面”,任何方法来解决这个问题?我尝试将距离增加到20和2000,但它仍然产生“玩家”。有什么想法吗?
编辑#2:我也尝试了LayerMasks,但仍无法正常工作。
答案 0 :(得分:1)
问题是你正在解析Physics2D.Raycast错误的参数。正如您在Unity文档中看到的那样,该函数采用Vector2而不是Vector3。
https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html
另外,在Unity中测试Raycast时,请始终将distance参数设置为Mathf.Infinity,直到完全设计完解决方案为止。这样可以省去调试中的麻烦。最佳做法是添加注释,说明它是一个临时距离值,并且应该稍后更改。
将来在论坛上发布您的问题时,请确保正确解释您的问题,因为我必须仔细查看您的代码才能找到目的。
我将不会评论你的代码设计,因为这是堆栈溢出而不是reddit,但是我在大学教授编程,如果你愿意接受,我很乐意提供帮助:)