我的角色问题根本没有跳跃。我是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;
}
}
}
Player GameObject的Inspector窗口
Ground GameObject的巡视窗口
答案 0 :(得分:0)
您的问题是您没有标记Ground GameObject。所以在OnCollisionEnter2D
中,角色会检测到碰撞,但if (coll.transform.tag == "Ground")
永远不会成立。所以这意味着角色不能是grounded
由于接地是检查玩家是否按下跳转键的第一个条件。它不可能跳过
if (grounded)
{
if (Input.GetButtonDown ("Jump"))
{
rb.AddForce (Vector2.up * jumpSpeed);
grounded = false;
}
}
要解决此问题:您需要将Ground GameObject标记为。如果您不确定如何操作,请在“标记”菜单上创建一个名为“地面”的新标记(如果它尚不存在)。然后在相同的菜单中将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 variable。
您将使用Physics2D.Linecast
代替OnTriggerEnter
将从角色的位置到其下方的一条线
脚(你应该放置在中提到的变换)
前一步)如果在中间有一个元素
groundLayer,这意味着角色将被接地。
如果有任何不清楚或者您发现了一些错误,请告诉我。
答案 1 :(得分:0)
如前所述,你的问题很遗憾,你遗失了标记地面物体的对象:)
小贴士:当我遇到这样的问题时,我喜欢做的是使用统一的Debug.Log()来找出问题所在。它会让您在控制台中轻松了解运行哪些代码,哪些代码不运行。请尝试执行以下操作:
void Update(){
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;
}
}
}