2016-09-30 1 views
0

프리 프레임으로 2 개의 Sphere GameObject가 있습니다. 그들은 강체가 부착되어 있습니다. 나는 그들이 표면에 얹혀지기를 원하지만 서로 충돌 할 때 서로 상호 작용하기를 원한다. (서로를 밀어 붙이고, 서로 튀고, 멍청하다.) 그러나 게임보기에서 프리 팹을 드래그하면 rigidbody "중력 사용"체크 상자가 꺼지고 객체가 떠있게됩니다! 나는 이것을 원하지 않는다. 그래서 나는 "중력을 사용한다". 이제 그들은 현장에 배치되지만 오랜 시간이 걸려 바닥에 떨어지게됩니다. 그리고 나는 그 주위를 끌고 갈 때 여전히 주위에 떠있을 수 있습니다. 어떻게 그들을 표면에 머물게하지만 서로 상호 작용하게합니까?GameObject Prefabs floating away

내가

(Get-the-GameObject).GetComponent<Rigidbody>().velocity = Vector3.zero; 

같은 일을 시도하지만 아무것도하지 않습니다.

그림에서 바닥에 구를 놓았지만 멀리 떠있는 것을 볼 수 있습니다! 물리 에디터에서 중력은 -9.81의 Y- 컴포넌트로 설정됩니다.

편집 : 내 구체의 비늘을 약 5 정도로 작게 만들었고 바닥에 떨어 뜨려 왼쪽으로 미끄러 져 들어가기 시작합니다. 바닥은 ... 지금 주위에 슬라이딩되는 이유가 궁금 그래서 어떤 방법으로 기울어되지

편집 :

분야는 사용자가 원하는 색상 상자를 클릭하고 그것을 끌어 인스턴스화 책상 공간과 석방. 일단 풀려 나면 떠 다니기 시작합니다. 여기에 해당 코드가 있습니다.

void OnMouseDown() 
{ 
    clone = (GameObject)Instantiate(prefab_to_instatiate, hit.point, Quaternion.identity); 
} 

void OnMouseDrag() 
{ 
    // Code to make an atom follow the mouse cursor 
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 

    RaycastHit hit2; 
    if(Physics.Raycast(ray, out hit2, Camera.main.farClipPlane)) 
    { 
     float oldY = transform.position.y; 
     clone.transform.position = new Vector3(hit2.point.x, oldY, hit2.point.z); 
    } 
} 

enter image description here

편집 2 : 나는 비디오를 제공하는 경우 무슨 일이 일어나고 있는지 설명하는 가장 좋은 방법입니다. 여기에 링크 : https://vimeo.com/185419058

나는 원자가있는 상자를 클릭하고, 마우스 버튼을 눌러서 책상 영역으로 끌어 놓았다가 놓습니다. 그러나 마우스를 움직이지 않아도 마우스를 드래그하면 동영상에서 미친 듯이 튀어 오르는 원자를 볼 수 있습니다. 그런 다음, 내가 풀어 줄 때, 그것은 미끄러지기 시작합니다. 이 미친 효과를 모두 얻지 않고 클릭하고 드래그하여 위치에 배치하기 만하면됩니다. 이것은 내가 만든 모든 원자 위에 강체를 제거하면 내가 원하는 방식으로 작동한다. 그러나 나는 원자들이 서로 근접 할 때 상호 작용하기를 원하기 때문에 강체를 사용할 수 있기를 바란다.

+0

월드 스케일에 상대적인 오브젝트의 스케일은 무엇입니까? 만약 그들이 거대하다면, 중력의 영향은 조금 "떠 다니는"것처럼 보일 것입니다. – Serlite

+0

내 구체의 범위는 40-50입니다. – noblerare

+0

구체의 이동을 제어하는 ​​다른 스크립트가 있습니까? 구체의 장면 계층/속성을 볼 수 있습니까? – Serlite

답변

2

Physics 엔진이 제어하는 ​​개체를 제어하려고하기 때문에. 제국에 2 명의 왕이있는 것처럼 전쟁이나 갈등이있을 것입니다.

PhysX 엔진은 모든 FixedUpdate(), 0.02 초 기본 설정을 업데이트하고 모든 프레임에서 OnMouseDrag()가 실행됩니다.

OnMouseDrag는 마우스가 내려가는 동안 모든 프레임이라고합니다. 에서 https://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDrag.html

당신의 OnMouseDrag()transform.position을 사용하여 위치를 설정하고, 그 이외의 물리학 방법입니다. Rigidbody.MovePosition() 또는 Rigidbody.position을 사용해 보시기 바랍니다. 아직 시도하지는 않았지만, 유니티가 너트이기 때문에 종종 내 자신의 물리 시뮬레이션을 쓰는 것을 선호합니다.

https://docs.unity3d.com/ScriptReference/Rigidbody-position.html

https://docs.unity3d.com/ScriptReference/Rigidbody.MovePosition.html

그 문제가 해결되지 않으면 OnMouseDrag() 충돌을 피하기 위해 유효하고 마우스를 놓을 때, 그것을 되돌릴 동안은 rigidbody, rigidbody.enabled = false을 해제 시도 할 수 물리 엔진에 제어권을 되돌립니다.

+0

'Rigidbody.MovePosition'을 사용하는 것이 저에게 효과적이지 않았지만,'rigidbody'을 끄고, transform.position' moving worked! 참고 : 'rigidbody'를 비활성화하면 isKinematic을 true로 설정하고 그 반대의 경우도 마찬가지입니다. 이제 모든 것이 작동합니다! 나는 클릭하여 새로운 원자를 인스턴스화하고, 적절한 위치로 드래그하고, 놓는다. 그리고 그것은 멋지게 쓰러지고 거기에 남아있다. 나를위한 완벽한 대답. – noblerare

+0

그래, 물건을 움직이는 동안 rigidbody를 무력하게하는 것을 잊었다는 것은 강체가없는 collider가 정적 collider (움직이지 않을 것이다)라고 가정하기 때문에 시스템에 심각한 과열을 일으킬 것이다. 토글 키네마 틱이 더 좋다 : D –

+0

@noblerare 그래서 이들은 원자이다! 좋은! 제목을 공개했을 때 알려주세요.) –