Как перемещать инстансы движением Vector3, а не трансформировать? - PullRequest
1 голос
/ 25 июня 2019

У меня есть код, который переносит позиции экземпляра Sphere из вершин 1-й сетки в вершины 2-й сетки.

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

Как я могу изменить код, чтобы правильно заставить экземпляры Sphere двигаться со скоростью, возможно, Vector3 (или что-то еще, что заставило бы физику Unity работать правильно), а не просто перемещаться с помощью установки явных позиций преобразования?

вот код.У меня есть эти переменные:

public List<TransformData> meshVertices1 = new List<TransformData>();
public List<TransformData> meshVertices2 = new List<TransformData>();

, которые затем заполняются такими данными, как:

meshVertices1.Add(new TransformData(position, rotation, scaleVector));
meshVertices2.Add(new TransformData(position, rotation, scaleVector));

, затем я создаю экземпляры сфер на основе данных выше:

spheres = new GameObject[24]; 
for (int i = 0; i < mesh.vertexCount; i++)
{
    spheres[i] = Instantiate(spherePrefab, meshVertices1[i].position, Quaternion.identity, transform);
}

и, наконец, добавьте Lerp для позиций экземпляра сферы в методе Update:

for (int i = 0; i < 24; i++)
{
    spheres[i].transform.localPosition = Vector3.Lerp(meshVertices1[i].position, meshVertices2[i].position, t);
}

Спасибо.Одной из вещей, которые я пробовал, было изменение метода обновления, чтобы он говорил:

Vector3 convert = spheres[i].transform.InverseTransformPoint(transform.localPosition); convert = Vector3.Lerp(meshVertices1[i], meshVertices2[i].position, t);

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

1 Ответ

0 голосов
/ 25 июня 2019

Один из подходов - получить ссылку на Rigidbody каждой сферы и вызвать Rigidbody.MovePosition (убедитесь, что это сделано в FixedUpdate):

for (int i = 0; i < 24; i++)
{
    Rigidbody rb = spheres[i].GetComponent<Rigidbody>();
    rb.MovePosition(Vector3.Lerp(meshVertices1[i].position, meshVertices2[i].position, t));
}

В интересах производительности вы можете создать список Rigidbody каждой сферы один раз, а затем выполнить цикл по этому списку, чтобы вам не приходилось вызывать GetComponent 24 раза каждый кадр.

...