我的 2D 角色根本不跳
My 2D Character is not jumping at all
我的角色有问题,根本不跳。我是 Unity 的新手,但我确保将脚本应用到播放器并调整速度,我没有接触 Rigidbody 2D。如果有人可以帮助我解决问题,将不胜感激。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
public float moveSpeed;
public float jumpSpeed;
public bool grounded = false;
private Rigidbody2D rb;
void Start() {
rb = GetComponent<Rigidbody2D>();
}
void Update () {
transform.Translate (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0, 0);
if (grounded)
{
if (Input.GetButtonDown ("Jump"))
{
rb.AddForce (Vector2.up * jumpSpeed);
grounded = false;
}
}
}
void OnCollisionEnter2D (Collision2D coll){
if (coll.transform.tag == "Ground")
{
grounded = true;
}
}
}
玩家游戏对象的检查员window
地面游戏对象的检查员window
你的问题是你没有这样标记地面游戏对象。所以在 OnCollisionEnter2D
中角色检测到碰撞,但 if (coll.transform.tag == "Ground")
永远不会是真的。所以这意味着字符不能是 grounded
因为接地是检查玩家是否按下跳跃键的第一个条件。永远不可能跳下去
if (grounded)
{
if (Input.GetButtonDown ("Jump"))
{
rb.AddForce (Vector2.up * jumpSpeed);
grounded = false;
}
}
要解决此问题:您需要这样标记地面游戏对象。如果您不确定如何操作,请在 Tag 菜单上创建(如果尚不存在)一个名为 Ground 的新标签。然后在同一菜单中将 Ground Tag 分配给 Ground GameObject。如果您需要视觉参考,您可以在这里了解如何操作:
https://docs.unity3d.com/Manual/Tags.html
编辑:如果一切都失败了,您可以试试这个脚本。它应该工作。前段时间我用过我自己,我清理了代码,只留下你需要在 x 和 y 轴上移动角色的东西。希望包含您需要的一切:
public class CharacterController2D : MonoBehaviour {
// LayerMask to determine what is considered ground for the player
public LayerMask whatIsGround;
// Transform just below feet for checking if player is grounded
public Transform groundCheck;
// store references to components on the gameObject
Transform transform;
Rigidbody2D rigidbody;
bool isGrounded = false;
float vy;
float vx;
public float jumpForce = 600f;
void Awake () {
transform = GetComponent<Transform> ();
rigidbody = GetComponent<Rigidbody2D> ();
}
void Update()
{
// determine horizontal velocity change based on the horizontal input
vx = Input.GetAxisRaw ("Horizontal");
vy = rigidbody.velocity.y;
// Check to see if character is grounded by raycasting from the middle of the player
// down to the groundCheck position and see if collected with gameobjects on the
// whatIsGround layer
isGrounded = Physics2D.Linecast(transform.position, groundCheck.position, whatIsGround);
if(isGrounded && Input.GetButtonDown("Jump")) // If grounded AND jump button pressed, then allow the player to jump
{
DoJump();
}
// Change the actual velocity on the rigidbody
rigidbody.velocity = new Vector2(_vx * MoveSpeed, _vy);
}
//Make the player jump
void DoJump()
{
// reset current vertical motion to 0 prior to jump
vy = 0f;
// add a force in the up direction
rigidbody.AddForce (new Vector2 (0, jumpForce));
}
}
所以要考虑的事项:
您无需标记地面,而是创建一个图层,其中包含您需要的所有内容
考虑地面。这将包括可能的平台角色
可能会跳过。将该层作为参数传递给脚本中的
检查员
您需要在角色脚下放置一个空的GameObject。
您将把编辑器中的 GameObject 拖放到
groundCheck public 变量。
您将使用 Physics2D.Linecast
而不是 OnTriggerEnter
将从角色的位置到其下方的一条线
脚(你应该在哪里放置 Transform 中提到的
上一步),如果在中间有一个元素
groundLayer,表示角色会被接地
如果有任何不清楚的地方或发现错误,请告诉我。
如前所述,您的问题显然是您没有标记地面物体 :)
提示:当我遇到这样的问题时,我喜欢做的是使用 unitys Debug.Log() 来定位问题所在。它会让您在控制台中轻松了解哪些代码是 运行,哪些不是。尝试执行以下操作:
void 更新 () {
transform.Translate (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0, 0);
if (grounded)
{
Debug.Log("Is grounded");
if (Input.GetButtonDown ("Jump"))
{
Debug.Log("Jump clicked");
rb.AddForce (Vector2.up * jumpSpeed);
grounded = false;
}
}
}
我的角色有问题,根本不跳。我是 Unity 的新手,但我确保将脚本应用到播放器并调整速度,我没有接触 Rigidbody 2D。如果有人可以帮助我解决问题,将不胜感激。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour {
public float moveSpeed;
public float jumpSpeed;
public bool grounded = false;
private Rigidbody2D rb;
void Start() {
rb = GetComponent<Rigidbody2D>();
}
void Update () {
transform.Translate (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0, 0);
if (grounded)
{
if (Input.GetButtonDown ("Jump"))
{
rb.AddForce (Vector2.up * jumpSpeed);
grounded = false;
}
}
}
void OnCollisionEnter2D (Collision2D coll){
if (coll.transform.tag == "Ground")
{
grounded = true;
}
}
}
玩家游戏对象的检查员window
地面游戏对象的检查员window
你的问题是你没有这样标记地面游戏对象。所以在 OnCollisionEnter2D
中角色检测到碰撞,但 if (coll.transform.tag == "Ground")
永远不会是真的。所以这意味着字符不能是 grounded
因为接地是检查玩家是否按下跳跃键的第一个条件。永远不可能跳下去
if (grounded)
{
if (Input.GetButtonDown ("Jump"))
{
rb.AddForce (Vector2.up * jumpSpeed);
grounded = false;
}
}
要解决此问题:您需要这样标记地面游戏对象。如果您不确定如何操作,请在 Tag 菜单上创建(如果尚不存在)一个名为 Ground 的新标签。然后在同一菜单中将 Ground Tag 分配给 Ground GameObject。如果您需要视觉参考,您可以在这里了解如何操作:
https://docs.unity3d.com/Manual/Tags.html
编辑:如果一切都失败了,您可以试试这个脚本。它应该工作。前段时间我用过我自己,我清理了代码,只留下你需要在 x 和 y 轴上移动角色的东西。希望包含您需要的一切:
public class CharacterController2D : MonoBehaviour {
// LayerMask to determine what is considered ground for the player
public LayerMask whatIsGround;
// Transform just below feet for checking if player is grounded
public Transform groundCheck;
// store references to components on the gameObject
Transform transform;
Rigidbody2D rigidbody;
bool isGrounded = false;
float vy;
float vx;
public float jumpForce = 600f;
void Awake () {
transform = GetComponent<Transform> ();
rigidbody = GetComponent<Rigidbody2D> ();
}
void Update()
{
// determine horizontal velocity change based on the horizontal input
vx = Input.GetAxisRaw ("Horizontal");
vy = rigidbody.velocity.y;
// Check to see if character is grounded by raycasting from the middle of the player
// down to the groundCheck position and see if collected with gameobjects on the
// whatIsGround layer
isGrounded = Physics2D.Linecast(transform.position, groundCheck.position, whatIsGround);
if(isGrounded && Input.GetButtonDown("Jump")) // If grounded AND jump button pressed, then allow the player to jump
{
DoJump();
}
// Change the actual velocity on the rigidbody
rigidbody.velocity = new Vector2(_vx * MoveSpeed, _vy);
}
//Make the player jump
void DoJump()
{
// reset current vertical motion to 0 prior to jump
vy = 0f;
// add a force in the up direction
rigidbody.AddForce (new Vector2 (0, jumpForce));
}
}
所以要考虑的事项:
您无需标记地面,而是创建一个图层,其中包含您需要的所有内容 考虑地面。这将包括可能的平台角色 可能会跳过。将该层作为参数传递给脚本中的 检查员
您需要在角色脚下放置一个空的GameObject。 您将把编辑器中的 GameObject 拖放到 groundCheck public 变量。
您将使用
Physics2D.Linecast
而不是 OnTriggerEnter 将从角色的位置到其下方的一条线 脚(你应该在哪里放置 Transform 中提到的 上一步),如果在中间有一个元素 groundLayer,表示角色会被接地
如果有任何不清楚的地方或发现错误,请告诉我。
如前所述,您的问题显然是您没有标记地面物体 :)
提示:当我遇到这样的问题时,我喜欢做的是使用 unitys Debug.Log() 来定位问题所在。它会让您在控制台中轻松了解哪些代码是 运行,哪些不是。尝试执行以下操作:
void 更新 () {
transform.Translate (Input.GetAxisRaw ("Horizontal") * moveSpeed * Time.deltaTime, 0, 0);
if (grounded)
{
Debug.Log("Is grounded");
if (Input.GetButtonDown ("Jump"))
{
Debug.Log("Jump clicked");
rb.AddForce (Vector2.up * jumpSpeed);
grounded = false;
}
}
}