如何通过Vector3移动而不是通过Transform移动实例?

时间:2019-06-25 18:12:20

标签: c# unity3d velocity

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

球体实例通过使用变换数据位置的Lerp移动。问题在于,显然以这种方式移动实例无法很好地与Unity的Physics配合使用,因此与球体实例碰撞的其他对象不会与它们正确碰撞。

如何更改代码以正确地使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);

但是在击打时,它只是使球体实例全部掉落到地板上并滚动。而我希望实例移动并停留在第二网格顶点的形成中。

1 个答案:

答案 0 :(得分:0)

一种方法是引用每个球体的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次。