у меня есть проблема с игрой на Unity. Я решил сделать небольшую игру типа платформера, есть проблема с прыжком, если очень много раз нажимать на кнопку прыжка он просто просто улетает вверх(прыгает по воздуху), нужно это как-то исправить.
Вот сам код.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Her : MonoBehaviour
{
Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
jump();
}
}
void FixedUpdate()
{
rb.velocity = new Vector2(Input.GetAxis("Horizontal") * 12f, rb.velocity.y);
}
void OnCollisionEnter2D(Collision2D p)
{
if (p.gameObject.tag == "ReloadLevel")
{
RestartLevel();
}
}
void RestartLevel()
{
Application.LoadLevel(Application.loadedLevel);
}
void jump()
{
rb.AddForce(transform.up * 12f, ForceMode2D.Impulse);
}
}
В комментарии написали, что можно добавить проверку коллизии с поверхностью (стоит ли персонаж на земле), но проблема иногда все равно будет заметна, особенно если персонаж будет бегать и прыгать на неровной поверхности. Пусть обьект, который будет прыгать будет называтся Person, а вспомогательный обьект будет называтся JumpTracker. Для того, что бы решить проблему нужно добавить обьект JumpTracker и расположить его прямо на грани, где будет Person встречатся с землей. Обьект JumpTracker нужно в 2-4 раза меньше, чем обьект Person (высота y, ширина x, глубина z), также добавить на него коллайдер и поставить галочку isTrigger. Нужно создать скрипт JumpTrackerScript, где будет метод OnTriggerStay(collider collider) (или как там) и if (collider.gameObject.transform.tag == "ground") { isGround = true; } Как-то так, возможно много неточностей с моей стороны.
Если заглянуть в этот вопрос: Правильная реализация передвижения персонажа
можно увидеть интересную реализацию проверки IsGrounded через
private bool _isGrounded
{
get {
var bottomCenterPoint = new Vector3(_collider.bounds.center.x, _collider.bounds.min.y, _collider.bounds.center.z);
//создаем невидимую физическую капсулу и проверяем не пересекает ли она обьект который относится к полу
//_collider.bounds.size.x / 2 * 0.9f -- эта странная конструкция берет радиус обьекта.
// был бы обязательно сферой -- брался бы радиус напрямую, а так пишем по-универсальнее
return Physics.CheckCapsule(_collider.bounds.center, bottomCenterPoint, _collider.bounds.size.x / 2 * 0.9f, GroundLayer);
// если можно будет прыгать в воздухе, то нужно будет изменить коэфициент 0.9 на меньший.
}
}
если нужен 2йной прыжок нужно сделать так же, только с задержкой между прыжками во времени. Что бы нельзя было зажать кнопку прыжка и взлетать. То есть проверяем на isGrounded, делаем прыжок если все ок и засекаем время до следующего возможного прыжка. А после второго прыжка делать возможным только снова по IsGrounded.
Так же нужно реализовать счетчик прыжков что бы нельзя было всегда летать. То есть 2 прыжка, а потом уже не прыгать пока персонаж не попадет снова на землю.
Нашёл ответ на свой вопрос, вродь) Вот https://stackoverflowcom/questions/1297264/using-custom-fonts-on-a-label-on-winforms
Не могу понять почему не создаётся объект классаОба класса объявлены в одном пространстве имён
На своём сайте я использую Mathquill, который для корректного изображения встраивает стили в код страницыНапример:
Как можно сделать функционал, похожий на комментарии, но это будет вопрос-ответ вместо комментария? те