如何通过 Vector3 移动而不是变换来移动实例?

How to move Instances by Vector3 movement rather than Transform?

我有代码将 Sphere 实例位置从第一个网格的顶点到第二个网格的顶点。

球体实例通过使用变换数据位置的 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);
}

最后在 Update 方法中为球体实例位置放置 Lerp:

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

谢谢。我尝试的其中一件事是将 Update 方法更改为

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

但是在点击播放时它只是让球体实例全部掉到地板上并滚来滚去。而我希望实例移动并保持在第二个网格顶点的形成中。

一种方法是获取每个球体的 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 次框架。