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-04-25.

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

Author24 — интернет-сервис помощи студентам

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
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() { yield return new WaitForSeconds(3); var step = returnSpeed * Time.deltaTime; transform.position = Vector2.MoveTowards(transform.position, target.position, step); }

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

Вот такой штукой запускаю объект:
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 всё получилось. Большое спасибо, пойду новую проблему решать

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

Текущее время: 29 апр 2024, 11:13

Движение объектов Vector2.Lerp / MoveTowards

Общие вопросы о Unity3D
Сообщений: 2 • Страница 1 из 1

Движение объектов Vector2.Lerp / MoveTowards

Jags 24 авг 2022, 10:22

Мне нужно двигать объекты из массива цепочкой. Вроде бы и работает, но не так как нужно. Во-первых, первый while работает отлично, а вот второй — работает частично. Такое ощущение, что проблема в координатах, хотя они правильные. Когда я это делал, запутался в том, каким образом их нужно двигать. Либо просто position , либо localPosition . Почему? Должно работать по localPosition , что логично, но при таком раскладе отрабатывает неправильно, то есть, ему нужно давать координаты по position
, что равно anchoredPosition . В общем, как и написал выше, первый работает нормально, второй тупо не идет по координатам. Ни по position , ни по localPosition .
Зарнее спасибо.

Синтаксис:
Синтаксис: [ Показать ]
Используется csharp

private IEnumerator MoveObject ( Button button, bool isShow, int number )
{
while ( isShow )
{
button. transform . localPosition = Vector2. MoveTowards ( button. transform . localPosition , startPos [ number ] , Time. deltaTime * speed ) ;
yield return null ;
}
while ( ! isShow )
{
button. transform . localPosition = Vector2. MoveTowards ( button. transform . localPosition , endPos [ number ] , Time. deltaTime * speed ) ;
yield return null ;
}
}

Jags UNец Сообщения: 24 Зарегистрирован: 23 июн 2022, 23:11

Re: Движение объектов Vector2.Lerp / MoveTowards

Jags 24 авг 2022, 10:43

Вот альтернатива, слава богу работает как надо, но, если использовать Lerp вместо MoveToward , задать низкую скорость — не доводит до нужных координат, тупо дергает. Ибо принцип работы у них разный, скорость у них тоже разная, для достижения определенного результата.

Синтаксис:
Синтаксис: [ Показать ]
Используется csharp

private IEnumerator MoveObject ( Button button, bool isShow, int number )
{
if ( isShow )
{
while ( button. transform . localPosition . x < - 40 )
{
button. transform . localPosition = Vector2. MoveTowards ( button. transform . localPosition , startPos [ number ] , Time. deltaTime * speed ) ;
yield return null ;
}
}
else if ( ! isShow )
{
while ( button. transform . localPosition . x > — 197 )
{
button. transform . localPosition = Vector2. MoveTowards ( button. transform . localPosition , endPos [ number ] , Time. deltaTime * speed ) ;
yield return null ;
}
}
}

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

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