0

我在 Unity3d 中制作了一辆前面有一个脚轮的两轮汽车。在为某些任务移动汽车后,我想在通过 Unity3d 按下“停止”按钮后将其带回初始位置。为此,我做了以下事情。

createdRobot.rigidbody.angularVelocity = Vector3.zero;
createdRobot.rigidbody.velocity = Vector3.zero;
createdRobotL.rigidbody.angularVelocity = Vector3.zero;
createdRobotL.rigidbody.velocity = Vector3.zero;
createdRobotR.rigidbody.angularVelocity = Vector3.zero;
createdRobotR.rigidbody.velocity = Vector3.zero;
createdRobot.transform.rotation = Task1ResetPosition.rotation;
createdRobot.transform.position = Task1ResetPosition.position;
createdRobotL.transform.rotation = Task1ResetPosition.rotation;
createdRobotL.transform.position = Task1ResetPosition.position;
createdRobotR.transform.rotation = Task1ResetPosition.rotation;
createdRobotR.transform.position = Task1ResetPosition.position;

其中 createdRobot 是汽车基础游戏对象, createdRobotL 和 createdRobotR 分别是我的左右轮游戏对象。两个轮子通过可配置接头与底座连接。

现在,每当我在 FixedUpdate 中执行上述操作时,我的汽车都会回到初始位置,但它是以正面朝上的形式翻转的。我google了很多,但没有找到合适的解决方案。

我的 createdRobot、createdRobotL、createdRobotR 是另一个名为 Robot 的游戏对象的子对象,它不是刚体。

现在,如果我销毁机器人并使用预制件中的实例再次创建,而不是执行上述重置方法,我的汽车正在按预期正确重置,但是这种方法会重置机器人中我不想要的所有内容。

GameObject.Destroy(GameObject.FindGameObjectWithTag("Robot_Tag"));
Instantiate(Robot,Task1ResetPosition.position,Task1ResetPosition.rotation);  

做上面的事情,就是让我的车正确地回到初始位置。但是,如果有人告诉我如何在不再次实例化的情况下将汽车带回初始位置,那将是可观的。

谢谢。

4

1 回答 1

0

强迫刚体做事总是很棘手,因为它们应该由物理驱动。对于您的每个钻机部件,我会尝试这样的事情(未经测试):

part.rigidbody.Sleep();
part.rigidbody.velocity = Vector3.zero;
part.rigidbody.angularVelocity = Vector3.zero;
part.rigidbody.position = Vector3.zero;
part.rigidbody.rotation = Quaternion.identity;
part.rigidbody.WakeUp(); // might have to delay one frame there...

首先,访问 RB 的位置/旋转而不是变换。然后,如果这还不够,请强制它进入睡眠然后唤醒。此外,您可以尝试在传送时将其设置为运动学:part.rigidbody.isKinematic = true/false;

于 2014-07-05T13:19:16.837 回答