Вот мое решение. Если вы прикрепите этот скрипт к игровому объекту (GO), GO переместится в позицию щелчка. Если он перемещается по одной из позиций триггера (triggerPositions
) на оси Y, в этом примере y = 1, 2 или 5, консоль возвращает «TRIGGER».
Это работает как это, после нажатия на экран, мы сохраняем позицию щелчка (toPos
) и сохраняем текущую позицию (curPos
). Если текущая позиция не равна последней позиции (lastPos
), то мы проверяем, переместился ли GO через позицию триггера, проверяя, меньше ли последняя позиция GO нашей позиции триггера (tp
). ) И позиция триггера меньше нашей текущей позиции? (мы также проверяем противоположный случай) THEN "TRIGGER!" , потому что он прошел позицию триггера.
Мы сохраняем нашу последнюю позицию как нашу текущую позицию и затем перемещаем GO. Повторите.
tp
может быть любым значением вспышки. С моим решением вы можете добавить столько позиций триггера, сколько вы будете sh, добавляя или удаляя значения в массиве triggerPositions
.
using UnityEngine;
public class MoveTowardsClick : MonoBehaviour
{
[SerializeField] private float speed = 0.1f;
[SerializeField] private Vector2 toPos = new Vector2(0, 0);
[SerializeField] private Vector2 curPos = new Vector2();
[SerializeField] private Vector2 lastPos = new Vector2();
private void Start()
{
curPos = transform.position;
lastPos = curPos;
}
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
toPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
curPos = transform.position;
if(curPos != lastPos)
{
float[] triggerPositions = new float[3] { 1, 2, 5 };
foreach (float p in triggerPositions)
{
if ((lastPos.y < p && p <= curPos.y) ||
(lastPos.y > p && p >= curPos.y))
{
// Do something when moving over trigger position
Debug.Log("TRIGGER!");
}
}
}
lastPos = curPos;
this.transform.position = Vector3.MoveTowards(curPos, toPos, speed);
// or move with this.transform.position = toPos;
}
}