Создание нового списка во время выполнения в Unity - PullRequest
0 голосов
/ 06 ноября 2019

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

Буду признателен за подсказки и подсказки любого типа. Спасибо.

Какой-то код, чтобы поделиться моими попытками со всеми значениями в одном списке:

Сопрограмма для записи всех позиций и поворотов в одном списке

IEnumerator Record()
    {
        for (; ; )
        {
            Debug.Log("Recording");

            /*Limit the maximum of values stored; that limits the seconds we can go back in time*/
            if (pointsInTime.Count > Mathf.Round(rewindableObjects.Count*(1f/(Time.fixedDeltaTime/Time.timeScale)) * maxRewindTime))
            {

                for (int i = 1; i < rewindableObjects.Count; i++)
                {
                    pointsInTime.RemoveLast();
                }
            }

            foreach (GameObject go in rewindableObjects)
            {
                pointsInTime.AddFirst(new PointInTime(go.name, go.transform.position, go.transform.rotation, go.GetComponent<Rigidbody>().velocity));

            }
            yield return new WaitForSecondsRealtime(0.02f/Time.timeScale);
        }

Функция перемотки для сброса всех позиций и поворотов с течением времени

/*rewind*/
    void Rewind()
    {
        foreach(GameObject go in rewindableObjects)
        {
            if(pointsInTime.Count > 0)
            {
                PointInTime pointInTime = pointsInTime.First.Value;
                if (pointInTime.goName == go.name) //this is way to slow. Solves the problem with objects swapping positions, but looks like a diashow. Needed: Way to differantiate all values belonging to one object in a seperate list or sth. 
                {
                    go.transform.position = pointInTime.position;
                    go.transform.rotation = pointInTime.rotation;
                    go.GetComponent<Rigidbody>().velocity = pointInTime.velocity;   //not working because velocity is applyied, while the rigidbody is still kinematic!!!
                    pointsInTime.RemoveFirst();
                }

            }else StopRewind();
        }
    }
...