Как использовать сопрограмму (или любой другой метод), чтобы скользить спрайт по экрану при нажатии? - PullRequest
0 голосов
/ 08 апреля 2019

Я занимаюсь разработкой 2D-игры в Unity, и у меня возникла проблема.Я пытаюсь переместить спрайт из точки А в точку Б, когда пользователь нажимает.У меня есть Vector3 как для начальной точки, так и для цели.

Мне удалось получить желаемое изменение в положении, но только в одном кадре.Я хочу, чтобы спрайт действительно скользил, но я не смог.Я пытался использовать Coroutines, но безуспешно.

IEnumerator CubeSlider(Vector3 start, Vector3 target)
    {
        while(start.x != target.x)
        {
            start.x += 0.1f;
            yield return null;
        }    
    }

Я принимаю во внимание только x, потому что на оси y нет движения.Я также попытался использовать:

start = Vector3.MoveTowards(parameters here)

, но это не увенчалось успехом.

Я запустил и вызвал эту подпрограмму в моей функции "onMouseDown ()" сценария следующим образом:

StartCoroutine(CubeSlider(square1.transform.position, p3));

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

1 Ответ

0 голосов
/ 08 апреля 2019

Ваш первый подход неверен. Вы просто добавляете к этому значению с плавающей точкой другое значение с плавающей точкой. Вместо этого вам нужно использовать Vector2 или Vector3. Вы можете использовать свой подход, и в нем не будет ошибок, но это не повлияет на ваш gameObject. Если вы хотите переместить такой объект, вам нужно было использовать Vector2 или Vector3 в вашем цикле. Кроме того, вам понадобится вспомогательный метод, потому что значения между этими двумя векторами никогда не будут точно равны. Ниже приведен пример вашего первого подхода.

start.position += new Vector3(2f, 0f, 0f) * Time.deltaTime;

Поскольку я вижу, что вы передаете аргументы вашему Coroutine, если вы хотите переместить объект gameObject, к которому не прикреплен этот скрипт, передайте его Transform Component. Конечно, потому что это пример, я поместил все в 1 сценарий. Ниже приведен пример Unity Method .

public class Example : MonoBehaviour
{
    public Vector3 myTarget;
    public Transform myStart;

    void Start()
    {
        StartCoroutine(CubeSlider(myStart, myTarget));
    }

    IEnumerator CubeSlider(Transform start, Vector3 target)
    {
        while (start.position.x != target.x)
        {
            start.position = Vector3.MoveTowards(start.position, target, 2f * Time.deltaTime);

            yield return null;
        }

        Debug.Log("I reached my target. Done!");
    }
}

Если вам интересно, вы также можете увидеть мой другой ответ по этой теме, здесь .

...