如何通过 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 次框架。
我有代码将 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 次框架。