2014-07-05 5 views
0

Unity3d에서 전방에 하나의 캐스터 휠이있는 2 개의 바퀴 달린 자동차를 만들었습니다. 어떤 작업을 위해 차를 움직 인 후에, Unity3d를 통해 "STOP"버튼을 누른 후 초기 위치로 되돌리고 싶습니다. 나는 그렇게하기 위해 다음을했다. createdRobot 자동차 기반 게임 오브젝트입니다Unity3d 자동차 game 객체를 파괴하고 다시 인스턴스화하지 않고 초기 위치로 가져 오는 방법은 무엇입니까?

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; 

는 createdRobotL 및 createdRobotR은 각각 내 왼쪽과 오른쪽 바퀴 게임 오브젝트입니다. 두 바퀴는 구성 가능한 조인트를 통해 받침대와 연결됩니다.

이제 FixedUpdate에서 위의 작업을 수행 할 때마다 자동차가 초기 위치로 이동하지만 앞면이 위로 뒤집 힙니다. 나는 많이 봤지만 적절한 해결책을 찾지 못했습니다.

내 createdRobot, createdRobotL, createdRobotR은 강체가 아닌 Robot이라는 다른 게임 개체의 하위 항목입니다.

이제 로봇을 파괴하고 조립식에서 인스턴스를 사용하여 다시 만들면 위에서 설명한 방법을 수행하는 대신 내 차가 예상대로 올바르게 재설정되지만이 방법으로는 로봇에서 원하지 않는 모든 것을 재설정합니다.

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

위의 것을 수행하면 내 차가 초기 위치로 올바르게 오게됩니다. 하지만 누군가가 나에게 자동차를 초기 위치로 되돌려 놓는 방법을 알려주지 않으면 다시 시작해야합니다.

감사합니다.

답변

1

강체에 힘을가하도록 강제하는 것은 물리에 의해 유도되기 때문에 항상 까다로운 작업입니다. ,

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;

+0

나는 텔레포트하기 전에 이미 기본 리그를 기구학으로 설정하고 있습니다. 순간 이동하면기구 학적으로 설정하지 않고 몸 전체가 움직이지 않고 현재 위치에서 멈췄습니다. 내가 더 많은 것을 탐구하면서, 내가 발견 한 것은 내 기본 부품 디자인 오리엔테이션이 "UPSIDE DOWN"에 영향을 미칠 수 있다는 것입니다. 장비를 특정 위치에 고정시킨 후 회전 장치를 사용하는 방법을 알고 계십니까? – Niks

+0

Instantiate가 내부적으로 어떻게 작동하는지 알 수있는 방법이 있습니까? – Niks

+0

Well Instantiate는 원래의 프리 팹의 구성 요소와 속성으로 새로운 GameObject를 생성하기 때문에 파괴 된 객체의 이전 상태에 대해 전혀 알지 못하므로 새로 만들어집니다. destroy + instantiate를 사용하는 것은 분명히 해킹이며 적절한 해결책은 아닙니다. – benblo