如何在不破坏和再次实例化的情况下将Unity3d车载游戏对象置于初始位置?

时间:2014-07-05 11:35:58

标签: unity3d unityscript gameobject

我在Unity3d前面制造了一辆带有一个脚轮的2轮车。在移动汽车完成某项任务后,我想通过Unity3d按“STOP”按钮后将其恢复到初始位置。这样做我做了以下几点。

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是由汽车基础gameObject,createdRobotL和createdRobotR分别是我的左右轮游戏对象。两个车轮都通过可配置的接头与底座连接。

现在,无论何时我在FixedUpdate中进行上述操作,我的汽车都会进入初始位置但是它正面朝上翻转。我用Google搜索了很多,但没有找到合适的解决方案。

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

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

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

做上述事情,是让我的车正常到达初始位置。但是,如果有人告诉我如何在没有再次实例化的情况下将汽车带回初始位置那么这将是可观的。

感谢。

1 个答案:

答案 0 :(得分: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;