Как я могу создать копию иерархии игровых объектов, которая имитирует все позиции, движения и т. Д. Оригинала? Как голограмма оригинала? - PullRequest
1 голос
/ 22 октября 2019

Я создаю 3-ю бильярдную игру в виртуальной реальности с использованием Unity3d.

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

Я попытался создать экземпляр корня бильярдной иерархии, просто чтобы выяснить, будет ли он создавать экземпляр оригинального gameObject (запускает его методы Start ()), что вполне логично, но не то, что я пытаюсь сделать.

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

Итак, если игрок ударяет по мячу и он перемещается в оригинале, он должен отображать то же самое. в миниатюре.

Я подумал, что можно было бы перевести позиции шаров (и вращение стола и т. д.) в каждом кадре в миниатюру. но это швы очень не оптимально.

var midPoint = (leftHand.transform.position + rightHand.transform.position) / 2;
var miniature = Instantiate(gameObject, midPoint, transform.rotation);
miniature.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);

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

1 Ответ

1 голос
/ 22 октября 2019

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

Начиная с Unity 2018.2, вы можете создавать физические сцены и моделировать их вручную.

Дляэта проблема вам потребуется:

  1. Остановить физические симуляции.
  2. Создать новую сцену для независимого физического моделирования.
  3. Скопируйте физически значимые объекты и компоненты в сцену предварительного просмотра.
    • Множество способов сделать это, но в основном коллайдеры, твердые тела и объекты, для которых вам нужны визуалы, средства визуализации.
    • Вы можете использовать кэширование, чтобы избежать их создания каждый раз.
    • Теоретически, вы также можете иметь симуляцию на главной сцене, но тогда вам нужно сделать кинематические все вещи, которые вы не хотите имитировать, и есть некоторые ошибки.
  4. Затем смоделируйте вручную.
    • Получить PhysicsScene из сцены предварительного просмотра: var physicsScene = physicsPreviewScene.GetPhysicsScene();
    • Имитация: physicsScene.Simulate();

Так что, если не избегать компонентов, не связанных с физикой в ​​копиях, вы не можете избежать дубликатов;только уменьшите их влияние с помощью объединения и / или кэширования.


Другой метод состоит в том, чтобы использовать кастинг (в данном случае сферическое вещание) для моделирования физики макета, выполняя многократное приведение с помощью velocity, acceleration (например, гравитация) и Time.fixedDeltaTime, и реагирование на перехват / попадание в виде столкновения с Vector3.Reflect или чем-то подобным. Но это только даст вам приблизительное представление о том, как будет реагировать физика, и не будет фактическим (точным) физическим моделированием, подобным тому, как это будет иметь несколько PhysicsScenes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...