Unity 2D 平台跳跃问题
Unity 2D Platformer Jumping Issue
我可以使用 Axis.RawInput 让我的精灵跳跃。当 RawInput 大于 0 时,此输入还用作触发跳跃动画的参数。这个问题是当您释放键时,精灵会立即回落。如何在按下或按住按键时执行固定跳跃,然后让精灵以固定速率下降,同时触发动画?
这就是我现在的 PlayerMover 脚本中的内容。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMover : MonoBehaviour
{
public Animator anim;
public Vector3 velocity = Vector3.zero;
public float runSpeed = 0f;
public float jumpSpeed = 0f;
private SpriteRenderer sp;
public float maxJump = 4f;
private void Awake()
{
sp = GetComponent<SpriteRenderer>();
}
void Update()
{
runSpeed = Input.GetAxisRaw("Horizontal");
jumpSpeed = Input.GetAxisRaw("Vertical");
anim.SetFloat("Jump", jumpSpeed);
anim.SetFloat("Speed", Mathf.Abs(runSpeed));
}
private void FixedUpdate()
{
Move(runSpeed, jumpSpeed*4);
}
void Move(float horizontal, float vertical)
{
if(horizontal > 0 || horizontal > 0 && vertical >0)
{
anim.SetBool("Idle", false);
sp.flipX = false;
}
else if(horizontal < 0 || horizontal <0 && vertical >0)
{
anim.SetBool("Idle", false);
sp.flipX = true;
}
else
anim.SetBool("Idle", true);
velocity.x = horizontal;
velocity.y = vertical;
transform.position += velocity * Time.fixedDeltaTime;
}
}
我读过关于使用类似
的内容
if(Input.GetKeyDown(GetKeyCode("Space"){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
为了移动,但只要按下 Space 就允许额外的跳跃。
如果你想使用类似的东西:
if(Input.GetKeyDown(GetKeyCode("Space"))){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
但是当玩家已经在空中时需要阻止他们跳跃,只允许他们在已经在地板上时这样做。所以:
if(Input.GetKeyDown(GetKeyCode("Space")) && isOnFloor()){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
其中 isOnFloor()
是一些检查您的角色是否在地板上的函数。根据您的游戏实现,这可以通过多种方式完成,但最常见的一种是检查玩家角色是否与任何东西发生碰撞,如果是,则该碰撞对象是否在他们下方。 This stackexchange thread 提供了一些代码示例来说明如何实现这一点。
为了使用这个
if (Input.GetKeyDown(GetKeyCode("Space"))
{
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
您需要检查您的玩家是否与地面发生碰撞,因此您可以使用 bool isGrounded
之类的布尔值来检查您是否正在接触地面,为此您可以在 OnCollisionStay()
与地面碰撞时确认它是真的。您可以使用标签来检查与您碰撞的对撞机是否在地面上。然后你跳的时候要说isGrounded = false;
然后再落地才算真的
if (Input.GetKeyDown(GetKeyCode("Space") && isGrounded == true)
{
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
isGrounded = false;
}
我可以使用 Axis.RawInput 让我的精灵跳跃。当 RawInput 大于 0 时,此输入还用作触发跳跃动画的参数。这个问题是当您释放键时,精灵会立即回落。如何在按下或按住按键时执行固定跳跃,然后让精灵以固定速率下降,同时触发动画?
这就是我现在的 PlayerMover 脚本中的内容。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMover : MonoBehaviour
{
public Animator anim;
public Vector3 velocity = Vector3.zero;
public float runSpeed = 0f;
public float jumpSpeed = 0f;
private SpriteRenderer sp;
public float maxJump = 4f;
private void Awake()
{
sp = GetComponent<SpriteRenderer>();
}
void Update()
{
runSpeed = Input.GetAxisRaw("Horizontal");
jumpSpeed = Input.GetAxisRaw("Vertical");
anim.SetFloat("Jump", jumpSpeed);
anim.SetFloat("Speed", Mathf.Abs(runSpeed));
}
private void FixedUpdate()
{
Move(runSpeed, jumpSpeed*4);
}
void Move(float horizontal, float vertical)
{
if(horizontal > 0 || horizontal > 0 && vertical >0)
{
anim.SetBool("Idle", false);
sp.flipX = false;
}
else if(horizontal < 0 || horizontal <0 && vertical >0)
{
anim.SetBool("Idle", false);
sp.flipX = true;
}
else
anim.SetBool("Idle", true);
velocity.x = horizontal;
velocity.y = vertical;
transform.position += velocity * Time.fixedDeltaTime;
}
}
我读过关于使用类似
的内容if(Input.GetKeyDown(GetKeyCode("Space"){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
为了移动,但只要按下 Space 就允许额外的跳跃。
如果你想使用类似的东西:
if(Input.GetKeyDown(GetKeyCode("Space"))){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
但是当玩家已经在空中时需要阻止他们跳跃,只允许他们在已经在地板上时这样做。所以:
if(Input.GetKeyDown(GetKeyCode("Space")) && isOnFloor()){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
其中 isOnFloor()
是一些检查您的角色是否在地板上的函数。根据您的游戏实现,这可以通过多种方式完成,但最常见的一种是检查玩家角色是否与任何东西发生碰撞,如果是,则该碰撞对象是否在他们下方。 This stackexchange thread 提供了一些代码示例来说明如何实现这一点。
为了使用这个
if (Input.GetKeyDown(GetKeyCode("Space"))
{
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
您需要检查您的玩家是否与地面发生碰撞,因此您可以使用 bool isGrounded
之类的布尔值来检查您是否正在接触地面,为此您可以在 OnCollisionStay()
与地面碰撞时确认它是真的。您可以使用标签来检查与您碰撞的对撞机是否在地面上。然后你跳的时候要说isGrounded = false;
然后再落地才算真的
if (Input.GetKeyDown(GetKeyCode("Space") && isGrounded == true)
{
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
isGrounded = false;
}