Я только начал изучать, как сделать простую 2D-платформерную игру в Unity, и я посмотрел Blackthornprod 2D-платформерское видео о движении , чтобы узнать, как заставить персонажа двигаться и прыгать.До сих пор я был в состоянии понять большую часть видео, однако я столкнулся с некоторой проблемой с частью «Прыжки».
Теперь, насколько я понимаю в его видео, чтобы сделать прыжок персонажа, мне нужноопределить, касается ли персонаж земли или нет.Для этого мне нужно создать маленький круг под ногами игрока, чтобы увидеть, не перекрывает ли он землю, вот так
Итак, вот код:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float JumpForce; // jumping force
private bool isGrounded; //if the player is touching the ground
public Transform GroundCheck; //object that contains the position of the
//"circle"
public LayerMask GroundLayer; //the layer that the "circle" collide with
public float radius; //radius of the circle
public float BaseNumOfJumps; //maximum number of jumps
private float NumOfJumps; //current number of jumps
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
NumOfJumps = BaseNumOfJumps;
}
void FixedUpdate()
{
//check the collision between the "circle" and the ground
isGrounded = Physics2D.OverlapCircle(GroundCheck.position,
radius,GroundLayer);
//here is the horizontal movement update part, but they are
//irrelevant so I cut them off
}
void Update()
{
//if the player touches the ground, reset the number of jumps
if (isGrounded)
{
NumOfJumps = BaseNumOfJumps;
}
//when jumping, decrease the number of jumps
if (Input.GetKeyDown(KeyCode.UpArrow) && NumOfJumps > 0)
{
rb.velocity = Vector2.up * JumpForce;
NumOfJumps--;
}
}
}
Здесь, где началась проблема, фактическое максимальное количество прыжков всегда выше, чем введенное мной значение.Так, например, если я поставлю BaseNumOfJumps = 2, то я могу прыгнуть 3 раза вместо 2, аналогично, если BaseNumOfJumps = 1, тогда я могу прыгнуть 2 раза и т. Д.
Через некоторое время я узналчто из-за того, что размер круга всегда немного больше, чем у фактического игрока, когда я прыгаю, был момент между тем, когда ноги игрока находятся в воздухе, но круг все еще перекрывается с землей, что сбрасываеттекущее количество прыжков (также называемое NumOfJumps в моем коде) и позволяющее моему персонажу сделать еще один прыжок, чем число, введенное в BaseNumOfJumps. Я не знаю, было ли это правдой или нет , но здесь было то, что я себе представлял . В этом комментарии к видео также описана та же проблема.
Хотя Blackthornprod уже упоминал это значение как «дополнительные прыжки», поэтому, если я введу «1» в этом значении, я прыгну дважды, «2», и я прыгаю 3 раза и т. Д. Я все еще сталкивался с некоторыми трудностями в согласовании количества прыжков.Что если мой персонаж просто соскользнет с земли, не прыгнув как этот ?Круг не столкнется с землей, и я смогу прыгнуть с точным количеством прыжков, которые я ввел в BaseNumOfJumps, короче:
Если максимальное количество прыжков, которые я ввел, равно 2, я смогуна (опять же, это всего лишь мое предположение, поэтому я могу ошибаться ):
Какойконечно создать некоторую несогласованность.Я искал другие учебники о прыжках и столкновениях, но большинство из них либо используют другие формы проверки столкновений (например, OnCollisionStay, OnCollisionEnter), либо используют тот же метод, который я использовал, но не углубился в объяснение этого (так что в основном они одинаковы)как в видео Blackthornprod)
Итак, как я могу решить эту проблему, как я могу изменить радиус «круга», чтобы он уходил от земли в тот же момент, когда ноги игрока уходят, когда они прыгают?Или я должен использовать другие формы проверки столкновений, как я уже упоминал ранее, и если да, то в чем их отличие и какая из них наиболее эффективна?
Это мой первый вопрос, я знаю, что он довольно длинный и запутанный.так как я не знаком с английским языком, но я буду очень признателен, если кто-нибудь сможет помочь.