Skip to content

Week_3: basic gate prefabs

hongsam14 edited this page Sep 30, 2021 · 4 revisions

지난주 변경점에 대한 고찰.

  1. 저번주의 멘토링 결과 inport와 outport의 필요성에 대해 부정적인 결론을 도출하였다. -> 하지만 이번주에 고심해본 결과 여러 종류의 gate와 연결이 될때, 동일한 컴포넌트를 가져오고 싶었고 그로인해 공통의 gatebehaviour 혹은 input output port 스크립트가 필요하다는 결론을 내렸다.
  2. 연결 게이트끼리 오브젝트를 지정하는 방법에 대하여 저번주에는 직접 오브젝트를 지정하는 방식을 택하였다. 하지만 사전에 오브젝트를 지정해서 연결시키기가 너무 불편하다는 단점을 발견하였다. -> 지난 주에는 rigidbody2d 옵션을 continuous에 always awake로 설정하여 OnTriggerStay2D를 작동시켰다. 하지만 이 것이 필요없다는 판단의 근거는 런타임상에서 게이트를 조작할 일이 없다는 것이었다. -> OnTriggerEnter2D를 사용한다면 어떨까. -> OnTriggerEnter2D를 사용하여 프로그램이 시작할때 collision한 오브젝트를 받아온다.(어짜피 런타임상에서 게이트 이동에 대한 조작은 없을 것이기 때문에

Unity Rigidbody2D

https://docs.unity3d.com/ScriptReference/Rigidbody2D.html https://docs.unity3d.com/kr/current/Manual/class-Rigidbody2D.html

일반적으로 Unity 에디터의 Transform 컴포넌트는 게임 오브젝트 및 자식 게임 오브젝트가 씬 내에 배치, 회전 및 스케일되는 방식을 정의합니다. 컴포넌트가 변경되면 다른 컴포넌트를 업데이트하며, 이에 따라 컴포넌트가 렌더링되는 포지션이나 콜라이더가 배치되는 포지션 등이 업데이트될 수 있습니다. 2D 물리 엔진은 콜라이더를 움직이고 서로 상호작용하도록 할 수 있으며, 따라서 물리 엔진에서 콜라이더의 이러한 움직임을 Transform 컴포넌트에 다시 전달하기 위한 메서드가 필요합니다. 이러한 움직임 및 콜라이더와의 연결이 Rigidbody 2D 컴포넌트의 용도입니다. Rigidbody 2D 컴포넌트는 트랜스폼을 오버라이드하고 리지드바디 2D에 의해 정의된 포지션/회전으로 업데이트합니다. Unity에서는 모든 컴포넌트의 모든 프로퍼티를 노출하므로 Transform 컴포넌트를 직접 수정하여 리지드바디 2D를 오버라이드할 수도 있지만, 그렇게 할 경우 게임 오브젝트가 서로 통과하는 것과 같은 문제 및 예측할 수 없는 움직임이 발생합니다.

-> Rigidbody2D component를 추가하면 물리엔진의 제어 하에 놓이게 된다. 그 자체로 sprite가 중력에 영향을 받고 force를 사용하여 script에서 영향을 받는다는 것을 의미한다. 이러한 동작은 전적으로 Unity physics system에서 비롯됩니다.

같은 게임 오브젝트나 자식 게임 오브젝트에 추가되는 모든 Collider 2D 컴포넌트는 해당 리지드바디 2D에 암시적으로 연결됩니다. 콜라이더 2D가 리지드바디 2D에 연결되면 같이 움직입니다. 콜라이더 2D는 트랜스폼이나 콜라이더 오프셋을 사용하여 직접 이동시키면 안 됩니다. 대신 리지드바디 2D를 움직여야 합니다. 이에 따라 성능이 개선되고 정확한 충돌 검사가 가능합니다. 같은 리지드바디 2D에 연결된 콜라이더 2D는 서로 충돌하지 않습니다. 즉, 리지드바디 2D와 동기화되어 모두 함께 움직이고 회전하는 단일 복합 콜라이더와 같이 효과적으로 작동하는 콜라이더 세트를 만들 수 있습니다.

-> collider를 rigidbody2d를 사용 안하고도 동작시킬 수 있는가? https://answers.unity.com/questions/604578/2d-collision-detection-without-rigid-body.html

body type

  1. dynamic: 다른 bodytype와 모두 충돌하고 중력과 힘의 영향을 받는다. dynamic type은 다른 모든 타입과 충돌한다. 동적 특성 및 주변의 모든 것과 상호작용을 하므로, 성능대비 비용이 가장 높은 타입이다. 위치나 회전값을 스크립트에서 동적으로 변경하는 오브젝트에는 적합하지 않음. (Dynamic 리지드바디 2D의 포지션이나 회전을 설정하기 위해 Transform 컴포넌트를 사용하지 말아야 합니다. 시뮬레이션은 속도에 따라 Dynamic 리지드바디 2D를 재배치합니다. 스크립트에 의해 적용되는 힘을 통해 직접 변경하거나 충돌과 중력을 통해 간접적으로 변경할 수 있습니다.)
  2. kinematic: 시뮬레이션 상태에서, 사용자 제어 하에 움직인다. kinematic은 중력에 영향을 받지 않으므로 dynamic에 비하여 시스템 리소스가 덜 필요하다. (Kinematic 리지드바디 2D는 여전히 속도를 통해 움직이지만 속도가 힘이나 중력의 영향을 받지 않습니다. Kinematic 리지드바디 2D는 다른 Kinematic 리지드바디 2D나 Static 리지드바디 2D와 충돌하지 않고 Dynamic 리지드바디 2D와만 충돌합니다. Static 리지드바디 2D(아래 참조)와 마찬가지로, Kinematic 리지드바디 2D는 충돌 시 (질량이 무한하여)움직일 수 없는 오브젝트처럼 작동합니다. 바디 타입에는 질량 관련 프로퍼티를 사용할 수 없습니다)
  3. static: Static 리지드바디 2D는 시뮬레이션 상태에서 전혀 움직이지 않도록 디자인되었습니다. 다른 오브젝트와 충돌하는 경우 Static 리지드바디 2D는 (질량이 무한하여) 움직일 수 없는 오브젝트처럼 작동합니다. 또한 리소스를 가장 덜 사용하는 바디 타입입니다. Static 바디는 Dynamic 리지드바디 2D와만 충돌합니다. Static 리지드바디 2D는 움직이지 않도록 디자인되었기 때문에 서로 충돌할 수 없습니다.