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