与地面的统一碰撞不起作用(菜鸟)
Unity collision with ground doesnt work (noob)
所以我刚开始使用 unity 并希望我的玩家只有在接触地面时才能跳跃。我给了我的地面一个“地面”标签并检查,如果玩家正在使用“地面”标签接触游戏对象,那么接地布尔将被设置为真。不知何故我的碰撞不起作用。
public class PlayerMovement : MonoBehaviour
{
[SerializeField] float speed = 10;
private Rigidbody2D body;
private Animator animate;
private bool grounded;
private void Awake()
{
body = GetComponent<Rigidbody2D>();
animate = GetComponent<Animator>();
}
private void Update()
{
float horizontalInput = Input.GetAxis("Horizontal");
body.velocity = new Vector2(horizontalInput * speed, body.velocity.y);
if (horizontalInput > 0.01f)
transform.localScale = new Vector3(7, 7, 7);
else if (horizontalInput < -0.01f)
transform.localScale = new Vector3(-7, 7, 7);
if (Input.GetKeyDown(KeyCode.Space) && grounded == true)
Jump();
animate.SetBool("Run", horizontalInput != 0);
animate.SetBool("grounded", grounded);
}
private void Jump()
{
body.velocity = new Vector2(body.velocity.x, speed);
animate.SetTrigger("Jump");
grounded = false;
}
private void OncollisionEnter2D(Collision2D collision)
{
Debug.Log("Collision detected");
if (collision.gameObject.tag == "Ground")
grounded = true;
Debug.Log("ground is being touched");
}
}
我认为让这个过程的某些步骤输出日志消息是个好主意,但我的日志在测试后仍然是空的。
OnCollisionEnter2D
将是您打算写的内容的正确拼写。因此,将 OncollisionEnter2D
更改为 OnCollisionEnter2D
,因为大小写很重要。
因为我们已经在这里并且它不会造成伤害,我还建议您使用 CompareTag
而不是 tag == string
因为它由于内存分配较少而性能稍好(如你可以在这里阅读:https://learn.unity.com/tutorial/fixing-performance-problems#5c7f8528edbc2a002053b595),所以习惯CompareTag
:
是个好习惯
if(collision.gameObject.CompareTag("MyTag"))
为了完成这个答案,我想指出您可能需要考虑修复您的 auto-completion 建议(在 Visual Studio 和 Visual Studio 代码:IntelliSense 中)万一它不起作用。有了这个工具的帮助,你再也不会拼错这样的东西了,因为在你开始写的时候就会提示正确的名字。
所以我刚开始使用 unity 并希望我的玩家只有在接触地面时才能跳跃。我给了我的地面一个“地面”标签并检查,如果玩家正在使用“地面”标签接触游戏对象,那么接地布尔将被设置为真。不知何故我的碰撞不起作用。
public class PlayerMovement : MonoBehaviour
{
[SerializeField] float speed = 10;
private Rigidbody2D body;
private Animator animate;
private bool grounded;
private void Awake()
{
body = GetComponent<Rigidbody2D>();
animate = GetComponent<Animator>();
}
private void Update()
{
float horizontalInput = Input.GetAxis("Horizontal");
body.velocity = new Vector2(horizontalInput * speed, body.velocity.y);
if (horizontalInput > 0.01f)
transform.localScale = new Vector3(7, 7, 7);
else if (horizontalInput < -0.01f)
transform.localScale = new Vector3(-7, 7, 7);
if (Input.GetKeyDown(KeyCode.Space) && grounded == true)
Jump();
animate.SetBool("Run", horizontalInput != 0);
animate.SetBool("grounded", grounded);
}
private void Jump()
{
body.velocity = new Vector2(body.velocity.x, speed);
animate.SetTrigger("Jump");
grounded = false;
}
private void OncollisionEnter2D(Collision2D collision)
{
Debug.Log("Collision detected");
if (collision.gameObject.tag == "Ground")
grounded = true;
Debug.Log("ground is being touched");
}
}
我认为让这个过程的某些步骤输出日志消息是个好主意,但我的日志在测试后仍然是空的。
OnCollisionEnter2D
将是您打算写的内容的正确拼写。因此,将 OncollisionEnter2D
更改为 OnCollisionEnter2D
,因为大小写很重要。
因为我们已经在这里并且它不会造成伤害,我还建议您使用 CompareTag
而不是 tag == string
因为它由于内存分配较少而性能稍好(如你可以在这里阅读:https://learn.unity.com/tutorial/fixing-performance-problems#5c7f8528edbc2a002053b595),所以习惯CompareTag
:
if(collision.gameObject.CompareTag("MyTag"))
为了完成这个答案,我想指出您可能需要考虑修复您的 auto-completion 建议(在 Visual Studio 和 Visual Studio 代码:IntelliSense 中)万一它不起作用。有了这个工具的帮助,你再也不会拼错这样的东西了,因为在你开始写的时候就会提示正确的名字。