2D Вид Сверху Прыжок Слизня

Вопрос или проблема

Я пытаюсь создать игру с верхним видом, где главным героем является слизь. Я хочу, чтобы, когда игрок щелкает мышкой, слизь прыгала в это место и действительно выглядела как прыжок.

Если вы хотите, чтобы я добавил больше информации, пожалуйста, дайте мне знать.

Я пробовал использовать Vector2.MoveTowards в основном для оси x и немного для оси y, а затем использовать синусоиду, чтобы попытаться получить движение прыжка, но у меня не получается.

Vector2 moveTo = Vector2.MoveTowards(transform.position, targetPos, 5 * Time.deltaTime);

        transform.position = new Vector2(moveTo.x, /*moveTo.y +*/ Mathf.Sin((transform.position.x - startXPos) / (targetPos.x - startXPos)));

Ответ или решение

Чтобы реализовать прыжок слайма в 2D топ-даун игре, вы можете использовать комбинацию перемещения и синусоидального движения для создания эффекта "прыжка". Важно создать плавный переход между начальной и целевой позицией, а также добавить вертикальное движение, чтобы имитировать эффект прыжка.

Вот пошаговое руководство по реализации этой механики:

  1. Создайте переменные для хранения состояния прыжка:
    Вам нужно будет определить, когда слайм прыгает, его целевую позицию и начальную позицию по оси Y, чтобы воспроизвести эффект прыжка.

    private Vector2 targetPos;
    private bool isJumping = false;
    private float jumpHeight = 1.0f; // Высота прыжка
    private float jumpDuration = 0.5f; // Длительность прыжка
    private float jumpStartTime;
  2. Обработайте клик мыши:
    При клике мыши вы должны установить целевую позицию и инициировать прыжок.

    void Update() {
       if (Input.GetMouseButtonDown(0)) {
           targetPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
           targetPos.z = 0; // Убедитесь, что Z координата равна 0, так как игра 2D
           StartJump();
       }
    
       if (isJumping) {
           JumpTowardsTarget();
       }
    }
  3. Начало прыжка:
    Запустите прыжок, сохраняйте время начала прыжка и устанавливайте состояние isJumping в true.

    void StartJump() {
       jumpStartTime = Time.time;
       isJumping = true;
    }
  4. Логика движения прыжка:
    В методе JumpTowardsTarget используйте интерполяцию для вычисления текущей позиции и синусоидальную функцию для добавления вертикального движения.

    void JumpTowardsTarget() {
       float elapsedTime = (Time.time - jumpStartTime) / jumpDuration;
       if (elapsedTime >= 1) {
           isJumping = false; // Завершить прыжок
           transform.position = targetPos; // Убедитесь, что слайм достиг целевой позиции
           return;
       }
    
       // Линейная интерполяция по оси X
       float newX = Mathf.Lerp(transform.position.x, targetPos.x, elapsedTime);
       // Генерация вертикального движения по синусоидальной функции
       float newY = Mathf.Sin(elapsedTime * Mathf.PI) * jumpHeight; // Использование функции Sin для прыжка
    
       transform.position = new Vector2(newX, newY);
    }
  5. Общая структура кода:
    Объедините всё вместе в одном скрипте.

    using UnityEngine;
    
    public class SlimeJump : MonoBehaviour {
       private Vector2 targetPos;
       private bool isJumping = false;
       private float jumpHeight = 1.0f; 
       private float jumpDuration = 0.5f; 
       private float jumpStartTime;
    
       void Update() {
           if (Input.GetMouseButtonDown(0)) {
               targetPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
               targetPos.z = 0; 
               StartJump();
           }
    
           if (isJumping) {
               JumpTowardsTarget();
           }
       }
    
       void StartJump() {
           jumpStartTime = Time.time;
           isJumping = true;
       }
    
       void JumpTowardsTarget() {
           float elapsedTime = (Time.time - jumpStartTime) / jumpDuration;
           if (elapsedTime >= 1) {
               isJumping = false; 
               transform.position = targetPos; 
               return;
           }
    
           float newX = Mathf.Lerp(transform.position.x, targetPos.x, elapsedTime);
           float newY = Mathf.Sin(elapsedTime * Mathf.PI) * jumpHeight; 
    
           transform.position = new Vector2(newX, newY);
       }
    }

Этот код выполнит прыжок слайма к заданной позиции при клике мыши, придавая ему реалистичное вертикальное движение. Вы можете отрегулировать переменные jumpHeight и jumpDuration, чтобы достичь нужного визуального эффекта для вашего слайма.

Оцените материал
Добавить комментарий

Капча загружается...