Вопрос или проблема
Я пытаюсь создать игру с верхним видом, где главным героем является слизь. Я хочу, чтобы, когда игрок щелкает мышкой, слизь прыгала в это место и действительно выглядела как прыжок.
Если вы хотите, чтобы я добавил больше информации, пожалуйста, дайте мне знать.
Я пробовал использовать 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 топ-даун игре, вы можете использовать комбинацию перемещения и синусоидального движения для создания эффекта "прыжка". Важно создать плавный переход между начальной и целевой позицией, а также добавить вертикальное движение, чтобы имитировать эффект прыжка.
Вот пошаговое руководство по реализации этой механики:
-
Создайте переменные для хранения состояния прыжка:
Вам нужно будет определить, когда слайм прыгает, его целевую позицию и начальную позицию по оси Y, чтобы воспроизвести эффект прыжка.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; // Убедитесь, что Z координата равна 0, так как игра 2D StartJump(); } if (isJumping) { JumpTowardsTarget(); } }
-
Начало прыжка:
Запустите прыжок, сохраняйте время начала прыжка и устанавливайте состояниеisJumping
в true.void StartJump() { jumpStartTime = Time.time; isJumping = true; }
-
Логика движения прыжка:
В методе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); }
-
Общая структура кода:
Объедините всё вместе в одном скрипте.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
, чтобы достичь нужного визуального эффекта для вашего слайма.