Unity Tracking Психофизические Эксперименты - PullRequest
0 голосов
/ 21 декабря 2018

Игрок и пользовательский куб в космосе:

img

Я хотел попросить идеи и помочь проекту, над которым я сейчас работаю.

ВВ этом проекте пользователь использует мышь для перемещения куба (называемого пользователем) для отслеживания случайных перемещений сферы (называемой игроком).Есть 20 случайных движений.Когда пользователь перемещает куб, он может перемещаться только в плоскости xy или плоскости xz, и режим переключается с помощью клавиши Shift.Впоследствии, 20 координат движений сферы и координаты куба (Пользователь) каждые 3 секунды.

Несмотря на эту функциональность, программа не работает хорошо.Управлять кубом крайне сложно.Иногда переключающие нажатия плохо регистрируются, поэтому переход от перемещения по плоскости xy к плоскости xz может быть затруднен.Это не лучший пользовательский опыт.Если куб выходит из поля зрения, вернуть его практически невозможно.Кроме того, мне было трудно понять, как связать куб и сферу в окружении бокса.

Я надеюсь, что в будущем я смогу настроить это для Oculus Rift на машине с Windows (я работаю на MacBook Pro), но на данный момент я просто пытаюсь получить этоПрототип закончен с разумной функциональностью пользователя.

Буду очень признателен за любые предложения или помощь.

Ниже приводится ссылка на весь проект на моем GitHub, а также основной код моегопроект.

Спасибо и счастливых праздников!

Ссылка: https://github.com/debarshikundu/TrackingExperiments

Класс PlayerController (управляет сферой):

using System.Collections;
using System.IO;

using UnityEngine;

public class PlayerController : MonoBehaviour
{

float movementDuration = 2.0f;
WaitForSeconds waitBeforeMoving = new WaitForSeconds(2f);
Vector3[] path = new Vector3[20];

void Start()
{
    StartCoroutine(MainRoutine());
}

IEnumerator MainRoutine()
{
    //generate new path:
    for (int i = 0; i < path.Length; i++)
    {
        float timer = 0.0f;
        Vector3 startPos = transform.position;
        float x = RandomNum(timer);
        float y = RandomNum(x);
        float z = RandomNum(y);
        path[i] = new Vector3(x, y, z);
    }

    //traverse path:
    for (int i = 0; i < path.Length; i++)
    {
        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, path[i], t);
            yield return null;
        }
        yield return waitBeforeMoving;
    }

    //print path:
    PrintPoints();
}

void PrintPoints()
{
    string filepath = Application.dataPath + "/Player.txt";
    if (File.Exists(filepath) == false)
    {
        File.WriteAllText(filepath, "The player blob visited these random coordinates: \n\n");
    }
    foreach (Vector3 vector in path)
    {
        File.AppendAllText(filepath, string.Format("{0}\n\n", JsonUtility.ToJson(vector)));
    }
}

float RandomNum(float lastRandNum)
{
    //Random value range can be changed in the future if necessary
    float randNum = Random.Range(-10.0f, 10.0f);
    return System.Math.Abs(randNum - lastRandNum) < float.Epsilon ? RandomNum(randNum) : randNum;
}

}

Класс UserController (дает пользователю возможность перемещать куб):

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

[RequireComponent(typeof(MeshCollider))]

public class UserController : MonoBehaviour {


bool shiftOn = false;

void OnMouseDrag()
{

    if (Input.GetMouseButton(0))
    {
        if(shiftOn)
        {
            //3D Drag, courtesy of Unity Forums
            float distance_to_screen =    Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
            transform.position = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen));
        }

        else
        {
            //Plane Drag
            float distance_to_screen = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
            Vector3 pos_move = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance_to_screen));
            transform.position = new Vector3(pos_move.x, transform.position.y, pos_move.z);
        }



    }

  }

void changeShift()
{
    shiftOn = !shiftOn;
}

// Use this for initialization
void Start()
{

}
    // Update is called once per frame
    void Update()
    {
        OnMouseDrag();
        if (Input.GetKey(KeyCode.LeftShift)||Input.GetKey(KeyCode.RightShift))
        {
        changeShift();
        }




    }



}

Класс CubeTracker (отслеживает координаты куба каждые 3 секунды и выводит в файл):

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

public class CubeTracker : MonoBehaviour {

private bool logging = true;

void Awake()
{
    StartCoroutine(LogPosition());
}

private IEnumerator LogPosition()
{
    while (logging)
    {
        PrintPoint(transform.position);
        yield return new WaitForSeconds(3f);
    }
}

void PrintPoint(Vector3 position)
{
    string filepath = Application.dataPath + "/User.txt";
    if (File.Exists(filepath) == false)
    {
        File.WriteAllText(filepath, "The player blob visited these random coordinates: \n\n");
    }
    File.AppendAllText(filepath, string.Format("{0}\n\n", JsonUtility.ToJson(position)));
}

}
...