Vector2 movetowards unity как работает
Перейти к содержимому

Vector2 movetowards unity как работает

  • автор:

Vector2.MoveTowards

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Submission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Your name Your email Suggestion * Submit suggestion

Declaration

public static Vector2 MoveTowards (Vector2 current , Vector2 target , float maxDistanceDelta );

Description

Moves a point current towards target .

This is essentially the same as Vector2.Lerp but instead the function will ensure that the distance never exceeds maxDistanceDelta . Negative values of maxDistanceDelta pushes the vector away from target .

using UnityEngine;

// 2D MoveTowards example // Move the sprite to where the mouse is clicked // // Set speed to -1.0f and the sprite will move // away from the mouse click position forever

public class ExampleClass : MonoBehaviour < private float speed = 10.0f; private Vector2 target; private Vector2 position; private Camera cam;

void Start() < target = new Vector2(0.0f, 0.0f); position = gameObject.transform.position;

cam = Camera.main; >

void Update() < float step = speed * Time.deltaTime;

// move sprite towards the target location transform.position = Vector2.MoveTowards(transform.position, target, step); >

void OnGUI() < Event currentEvent = Event.current; Vector2 mousePos = new Vector2(); Vector2 point = new Vector2();

// compute where the mouse is in world space mousePos.x = currentEvent.mousePosition.x; mousePos.y = cam.pixelHeight - currentEvent.mousePosition.y; point = cam.ScreenToWorldPoint(new Vector3(mousePos.x, mousePos.y, 0.0f));

if (Input.GetMouseButtonDown(0)) < // set the target to the mouse click location target = point; >> >

Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.

Copyright ©2024 Unity Technologies. Publication Date: 2024-05-06.

Mathf.MoveTowards

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Submission failed

For some reason your suggested change could not be submitted. Please try again in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Your name Your email Suggestion * Submit suggestion

Declaration

public static float MoveTowards (float current , float target , float maxDelta );

Parameters

current The current value.
target The value to move towards.
maxDelta The maximum change applied to the current value.

Description

Moves a value current towards target .

This function is similar Mathf.Lerp except that this function ensures the rate of change never exceeds maxDelta and that the current value is never greater than the target value. Negative values of maxDelta pushes the value away from target .

using UnityEngine;

public class Example : MonoBehaviour < float currStrength; float maxStrength; float recoveryRate;

void Update() < currStrength = Mathf.MoveTowards(currStrength, maxStrength, recoveryRate * Time.deltaTime); > >

Is something described here not working as you expect it to? It might be a Known Issue. Please check with the Issue Tracker at issuetracker.unity3d.com.

Copyright ©2024 Unity Technologies. Publication Date: 2024-05-06.

Vector2.MoveTowards в корутине

Суть: 2D бесконечный раннер, игрок не успел среагировать, препятствие «отодвинуло» персонажа. И дабы всю игру персонаж не бежал где-то сбоку, через время возвращать его назад на середину экран, тобеж на нулевую координату по X. У препятствий тег «Barrier». По коду, приведенному ниже, ничего не происходит. Сама корутина запускается (проверено посредством Debug.Log), а MoveTowards не срабатывает. Скрипт висит на персонаже.

public float returnSpeed; [SerializeField] private Transform target; public void Start() < target = transform; target.position = new Vector2(0f, 0f); >public void OnCollisionExit2D(Collision2D other) < if (other.gameObject.CompareTag("Barrier") && (transform.position.x < 0)) < StartCoroutine("ReturnPositionToZero"); >> private IEnumerator ReturnPositionToZero()

Отслеживать
Intelligent
задан 21 сен 2020 в 16:35
Intelligent Intelligent
15 4 4 бронзовых знака

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

  1. returnSpeed Нигде не инициализирован и равен нулю, а значит и step == 0.
  2. ReturnPositionToZero Выполнится всего один раз через 3 секунды и движение может быть незаметно(зависит от returnSpeed).

Нужно примерно так:

returnSpeed = 5;// подбери нужное число private IEnumerator ReturnPositionToZero() < yield return new WaitForSeconds(3);//хз зачем int iteration = 0;// просто что бы случайно не уйти в бесконечный цикл(тогда редактор просто зависнет, а игра упадет) float delta = 0.1f;// или любая дельта while (Vector2.Distance(transform.position,target.position) >delta && iteration < 100) < iteration++; var step = returnSpeed * Time.deltaTime; transform.position = Vector2.MoveTowards(transform.position, target.position, step); yield return new WaitForEndOfFrame();//ждем конца кадра >> 

Отслеживать
ответ дан 21 сен 2020 в 17:46
Valera Kvip Valera Kvip
2,677 11 11 серебряных знаков 24 24 бронзовых знака

Спасибо, сразу не срабатывало правда. Но сделал target не Transform’ом, а Vector2 и все работает. Только персонаж очень сильно дергается при возвращении в нулевую координату

Объект летит и летит

Вот такой штукой запускаю объект:
rb.AddForce(mousePos * grabForce, ForceMode2D.Impulse);
(rb — rigidbody, mousePos — куда стрелять (позиция мышки), grabForce — сила приложенная к объекту)
При включении OnCollisionEnter должна срабатывать такая штука:
transform.position = Vector2.MoveTowards(transform.position, grabPoint.position, speed * Time.deltaTime);
В скобках: Координаты объекта, координаты куда лететь, скорость с которой лететь постоянно.
По задумке, объект по нажатию вылетает и при столкновении возвращается на точку, готовится к новому выстрелу. Он дёргается к точке, но продолжает лететь по заданной заранее траектории.

Может ли быть проблема в том, что первая часть запущена в Update, а вторая в void OnCollisionEnter?
Или может AddForce работает как-то не так как я думал?
В общем помогите, пожалуйста.

#1
9:38, 19 окт 2021

мне кажется, тут, просто, логический провтык:
Update работает каждый кадр, т.е. что бы не случилось, rb.AddForce() срабатывает в любом случае
OnCollisionEnter — одноразовый эвент, т.е. в одном кадре сработал, в следующем нет
Из этого получается, что в момент срабатывания эвента коллизии, у вас работает и rb.AddForce() и инструкция OnCollisionEnter. При этом, transform.position = Vector2.MoveTowards имеет настолько незначительный результат (как для одного кадра), что кажется, будто он и не срабатывает.
Как вариант, сделайте корутин, который плавно выполняет логику смещения (чтоб выглядело красиво) и запускайте при срабатывании коллизии, либо увеличьте speed (так как это число, по сути, делится на FPS)

Update: перечитал. Дергается, но продолжант двигаться — мое сообщение не меняется, только упраздняется предложение о незначительности смещения

  • LzheDmitrey
  • Постоялец

#2
10:23, 19 окт 2021

R1pp3R
Надо придумать как отключить постоянное ускорение от AddForce.
Дать постоянную плавную скорость для возвращения к точке.

Использовать корутин звучит как опасная затея (первый раз с ним сталкиваюсь и выглядит он страшным).

В апдейт находится функция, потому что активируется нажатием лкм. Но стоит условие, что после одного нажатия повторение невозможно. Так какого черта сила продолжает действовать.

if (Input.GetButtonDown(«Fire1») && objInHand == true)
<
Debug.Log(«Пиф»); // Просто проверка
gr.GetComponent().Shoot(); //Тот самый Add.Force
objInHand = false;
>

#3
11:12, 19 окт 2021

LzheDmitrey
можно, закостылить, добавить булиновую проверку, и включать/выключать по мере необходимости. Если Input != 0 && bool var ==0 то выполнять ввод, иначе — не выполнять.
а с корутинами в любом случае придется разбираться,т.к. вешать всевозможные проверки на Update() — плохая практика

  • LzheDmitrey
  • Постоялец

#4
11:26, 19 окт 2021

R1pp3R
А зачем пихать ещё одну булеву переменную, если после выстрела, стрелять больше нельзя итак. Сила-то всё равно будет продолжать толкать объект.
Не могу понять почему Add.Force продолжает толкать объект нон-стоп. Я думал это разовая акция.

Корутин просто выглядит как грубый костыль

#5
11:38, 19 окт 2021

режим ForceMode2D.Impulse разве не работает по принципу взрыва? в одном фрейме импульс приложился, и в следующих обрабатывается результат?
Если это так, то у вас получается каждый фрейм прибавляется ускорение, а после прекращения выполнения, продолжает выполняться сила этого ускорения.
Попробуйте rb.AddForce(mousePos * grabForce)

  • LzheDmitrey
  • Постоялец

#6
11:49, 19 окт 2021

R1pp3R
Вот я тоже думал что это так работает, но сила продолжает толкать объект.

Пробовал так, тоже самое получается.

#7
11:56, 19 окт 2021

тогда, после удара, просто умножьте grabForce на -1 😀

  • LzheDmitrey
  • Постоялец

#8
12:05, 19 окт 2021

R1pp3R
Хорошая попытка, но не сработало

#9
12:11, 19 окт 2021

не совсем вкурсе, как в юньке организовано передвижение
transform.position = Vector2.MoveTowards(transform.position, grabPoint.position, speed * Time.deltaTime);
rb.AddForce(mousePos * grabForce, ForceMode2D.Impulse);

почему бы не использовать одинаковую ф-ию для придания движения?

п.с. transform.position = Vector2.MoveTowards и этот участок выглядит как одиночная установка позиции, а не постоянное смещение

п.п.с а если вместо transform.position = Vector2.MoveTowards поставить
rb.AddForce(Vector2(grabPoint.position — transform.position).Normalized * grabForce, ForceMode2D.Impulse);?

  • LzheDmitrey
  • Постоялец

#10
12:37, 19 окт 2021

R1pp3R
Уф. Вечером попробую и отпишусь что получилось

  • LzheDmitrey
  • Постоялец

#11
22:41, 19 окт 2021

R1pp3R
Не сработало. Но я пытаюсь переделать transform в addforce. Не могу нормально точку прописать, в сторону которой будет направлен этот addforce

  • LzheDmitrey
  • Постоялец

#12
23:16, 19 окт 2021

Поменяв Transform на AddForce всё получилось. Большое спасибо, пойду новую проблему решать

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *