Перемещение мяча к случайным координатам в Unity - PullRequest
0 голосов
/ 09 декабря 2018

Дело в том, что у меня есть этот исследовательский проект, в котором мне нужно смоделировать эксперимент с отслеживанием.

У меня есть шарик в коробке (который, мы надеемся, может быть реализован в виде комнаты виртуальной реальности в будущем)и шар перемещается в случайные координаты.

Я также планирую добавить еще один объект, на который пользователь может щелкнуть (или в случае VR использовать джойстик), чтобы двигаться и следовать за мячом.

Координаты каждого движения мяча и координаты каждого движения объекта должны быть выведены в файл.

Сейчас у меня возникают трудности с отправкой мяча в случайные координаты.

Мяч называется «Player», а файл - «PlayerController».Две проблемы заключаются в том, что, используя версию Random для Unity, я последовательно получаю одинаковые координаты при каждом запуске, и мяч не прекращает двигаться.

Мой код прилагается ниже.Кроме того, если у кого-то из вас есть идеи о том, как реализовать остальную часть моего проекта, предложения, безусловно, приветствуются!

Большое вам спасибо!

using System.Collections;
using System.Collections.Generic;
using System.IO;

using UnityEngine;

public class PlayerController : MonoBehaviour {
    private float movementDuration = 2.0f;
    private float waitBeforeMoving = 2.0f;
    private bool hasArrived = false;
    private Coroutine moveCoroutine = null;


    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {
        if (!hasArrived)
        {
            hasArrived = true;



            Vector3[] v = new Vector3[20];




            for (int i=0; i<v.Length; i++)
            {
                Random.InitState(System.DateTime.Now.Millisecond);

                v[i] = new Vector3(Random.Range(-10.0f, 10.0f),
                Random.Range(-10.0f, 10.0f),
               Random.Range(-10.0f, 10.0f));

                moveCoroutine = StartCoroutine(MoveToPoint(v[i]));
            }


        }
        if (Input.GetMouseButtonDown(0))
            StopMovement();
    }

    private IEnumerator MoveToPoint(Vector3 targetPos)
    {
        float timer = 0.0f;
        Vector3 startPos = transform.position;

        while (timer < movementDuration)
        {
            timer += Time.deltaTime;
            float t = timer / movementDuration;
            t = t * t * t * (t * (6f * t - 15f) + 10f);
            transform.position = Vector3.Lerp(startPos, targetPos, t);

            yield return null;
        }

        yield return new WaitForSeconds(waitBeforeMoving);
        hasArrived = false;
    }

    private void StopMovement()
    {
        if (moveCoroutine != null)
            StopCoroutine(moveCoroutine);
    }

    public void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("sphereTag"))
            StopMovement();
    }

1 Ответ

0 голосов
/ 10 декабря 2018

Мяч не прекращает двигаться, потому что вы установили значение hasArrived в false в конце своей сопрограммы, поэтому он каждые две секунды снова срабатывает.

Координаты менялись каждый раз, но я не знаю, в чем проблематы сталкиваешься там.Может быть что-то с Random.InitState ()

То, как вы настраиваете свой цикл, каждый вектор в массиве подается в свою собственную сопрограмму, но все это происходит практически мгновенно, так как до этого нет задержкивдаваясь в следующую итерацию вашего цикла for.Если вы пытаетесь перебрать все 20 точек, вам следует вместо этого вызвать одну сопрограмму с циклом for и встроенной задержкой внутри:

bool hasArrived;
private float movementDuration = 2.0f;
private float waitBeforeMoving = 2.0f;

void Update()
{
    if (!hasArrived)
    {
        hasArrived = true;
        StartCoroutine(MoveToPoints());
    }
}

private IEnumerator MoveToPoints()
{
    Vector3[] v = new Vector3[20];

    for (int i = 0; i < v.Length; i++)
    {
        float timer = 0.0f;
        Vector3 startPos = transform.position;
        v[i] = new Vector3(Random.Range(-10.0f, 10.0f),
                Random.Range(-10.0f, 10.0f),
                Random.Range(-10.0f, 10.0f));

        while (timer < movementDuration)
        {
            timer += Time.deltaTime;
            float t = timer / movementDuration;
            t = t * t * t * (t * (6f * t - 15f) + 10f);
            transform.position = Vector3.Lerp(startPos, v[i], t);
            yield return null;
        }
        yield return new WaitForSeconds(waitBeforeMoving);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...