큐브 면 위를 이동하는 개체는 단지 앞방향으로만 이동되며,  transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime); 

특정 collider를 만나 센서의 trigger 조건에 부합하면 개체의 회전을 변경하여 다음 방향을 컨트롤하게 됩니다. 


개체의 방향이 변경되는 경우의 수는 다음과 같습니다.


<holeBlock> 


  • 텔레포트 이후 -> 해당 holeblock 으로 이동  -> 이동 지점 holeblock이 바라보는 단일 방향
  • 텔레포트 실패 -> 이동 전 지점 holeblock이 바라보는 단일 방향 ==  들어왔던 방향과 반대방향 (back으로 이동)
<rotatorBlock>


  • 안쪽 면 모서리 부근을 지날 때 -> 물체가 향하는 방향의 down 방향 (단일 방향)

<PlaneBlock 의 방향 요소>


  • planeBlock(우회전)을 만나면 물체가 향하는 방향의 right 방향  (단일 방향)
  • planeBlock(우회전)을 만나면 물체가 향하는 방향의 left 방향  (단일 방향)


  • Slash  ---> ? 단일 방향이 아니다 -> 물체가 들어가는 진입 방향에 따라 달라진다.)
  • backSlash  ---> ? 단일 방향이 아니다 -> 물체가 들어가는 진입 방향에 따라 달라진다.)


case 5 까지는 목표가 되는 쿼터니언 회전이 단일 방향이므로 Quaternion.LookRotation(회전해야 할 단일 방향) <- 이것으로 쉽게 다음 방향을 

예측할 수 있습니다. 하지만 결국 6,7과 같은 경우에 대하여 변하는 방향에 대한 처리를 원하는대로 해주기 위해서는 진입 시 오브젝트가 가지는 방향성을 기술하여 표현할 수 있어야 하고 이것은 boolean 변수 2개를 추가하여 각 변화에 대한 모형을 4가지 타입별로 제시해야 함을 의미합니다.



움직이는 오브젝트 객체는 큐브 공간에서 매우 많은 충돌 조건에 노출되어 있고 빈틈없이 모든 일들을 처리해야 하므로 회전운동에 관여하는

모든 trigger 조건은 효율을 높이기 위한 방편으로 compareTag가 아닌 layer로 감지할 수 있도록 하였습니다. 

또한 한 프레임이 돌아가는 찰나에 block 요소들의 충돌 조건을 움직이는 개체쪽에서 감지하게 될 텐데 이 감지를 구별하는 

조건을 한곳에 모아두지 않고 각 타입별 조건을 전용 센서에서만 담당하도록 Sensor 역할의 자식객체를 하위에 여러개로 분업화해

부하를 최대한 분담하도록 하자는 논리로 설계하였습니다. 



TriggerSensor.회전 충돌 감지 (모든 상속 센서는 이동 코루틴 메서드와 회전 코루틴 메서드를 사용)

부모센서 클래스에는 해당 중심 좌표까지 물체를 이동하도록 하는 포지션 이동 코루틴 메서드와

해당하는 회전으로 물체를 회전하도록 하는 트랜스폼 로테이션 코루틴 메서드가 구현되어 있습니다. 

코루틴 진입 이전에 mover의 translate 이동은 잠시 제한될 것이며 모든 과정이 끝났을 때 다시 이동을 재개합니다.



toggle code

RotatorSensor  -

Quaternion.LookRotation(bodyTransform.TransformDirection(Vector3.down), bodyTransform.forward); 

- 아래로 회전 할 때 객체의 위 방향은 직전의 앞방향이 기준이 됩니다.



toggle code

HoleSensor

Quaternion.LookRotation(bodyTransform.TransformDirection(Vector3.back), bodyTransform.up); 180도 뒤로 회전할 곳을 바라보고 회전합니다. 



toggle code

PlaneSensor  plane면상에서 방향을 결정하는 directionItem 을 만났을때 -> (시계방향 반시계방향 Slash, BackSlash) 각 경우에 대한 회전 방향 결정 메서드


구현 메서드의 실제 동작 모형 예시




+ Recent posts