Триггер, когда игровой объект движется над указанной c позицией - PullRequest
1 голос
/ 30 апреля 2020

В моем проекте у меня есть вертикальный набор номера с номерами от 0 до 9. Я могу перетаскивать этот набор вверх и вниз (позиция x заблокирована). Когда я опускаю его, он проверяет свою текущую позицию. Если он находится между двумя числами, например 3 и 4, он переместится (анимация движения) к ближайшему числу.

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

Я пытался переместить циферблат с помощью Vector3.MoveTowards(curPos, toPos, speed);, а в Update () я проверил, моя текущая позиция равна моей триггерной позиции. Но, как и ожидалось, это не работает. Мой объект перемещается по положению триггера, но так как он никогда точно не равен ему, он не запускает мой звук щелчка.

Воспроизведение звука, когда я сбрасываю , на циферблате нет проблем , Но как мне это сделать, пока я перетаскиваю это?

1 Ответ

1 голос
/ 30 апреля 2020

Вот мое решение. Если вы прикрепите этот скрипт к игровому объекту (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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...