이번 블로그에서는 런게임에서 캐릭터의 좌우 이동과 무한 도로를 구현해보았다
캐릭터는 제자리에서 달리고 있고, 런 게임 특성상 왼쪽, 가운데, 오른쪽 이렇게 3군데로 이동할 수 있다
왼쪽, 가운데, 오른쪽을 판별할때 사용하기 위한 열거형 RoadLine을 생성한다
-> 가독성도 좋아짐
left= -1
middle= 0
right= 1 로 설정
(Input.GetKeyDown(KeyCode.___);
KeyCode.LeftArrow (왼쪽 방향키)와 KeyCode.RightArrow (오른쪽 방향키)를 입력받는다
현재 있는 곳의 값을 가리키는 int Pos 변수의 값을 변경시킨다
이미 왼쪽에 도착했거나, 오른쪽에 도착했으면 더이상 갈 수 없다. -> Pos 변수의 값을 RoadLine에 들어있는 값으로 갱신

키 입력 방식은 동일하지만, 열거형을 직접적으로 사용하였다
만약 현재 RoadLine 타입의 roadline 변수가 LEFT나 RIGHT가 아닐 경우에만 이동
-> 위 코드에서는 따로 int형 변수를 사용하였는데, 그럴 필요없이 열거형 타입의 변수를 생성해서 사용하였다

일반적인 게임 오브젝트의 이동 방식으로는 transform.position을 사용하여 이동한다
-> 하지만 리지드바디가 들어있는 오브젝트는 rigidbody.position으로 이동해야한다
-> (연산량 차이)
캐릭터와 장애물이 충돌하기 위해서는 두 오브젝트에 '콜라이더'를 필수로 넣어야한다
둘 중 하나의 오브젝트에는 리지드바디를 넣어야하는데, 어디에 넣어야할까?
-> 📒캐릭터
두 충돌 오브젝트 중 리지드 바디를 넣는 부분에서 궁금증이 생겼다
왜냐, 리지드 바디는 연산량이 많이 들어가기 때문에, 움직이는 오브젝트에 연산량이 많아지니까 멈춰있는 장애물에 넣어야한다고 생각했다
근데 보통의 게임은 캐릭터가 벽이나 바닥, 장애물 오브젝트들과 모두 부딪히는 경우가 많기 때문에 캐릭터에 넣는다고 한다
-> 📒이게 아니면 캐릭터를 제외한 바닥, 벽, 장애물에 모두 리지드 바디를 넣어야하는데... 이게 더 비효율적이죠
입력받는 함수안에 이동도 같이 넣었다
-> 보통 키 입력은 Update()에서, 움직임은 FixedUpdate()에 작성한다
-> 특히, 리지드바디가 부착된 게임 오브젝트의 이동은 정교해야하기 때문에 Fixed에서!

따로 함수를 만들어서 FixedUpdate()에서 호출함

캐릭터에 부착된 콜라이더는 오뚝이 형식으로 되어있다
-> 이동하다보면 넘어갈수도 있는 것...
이럴땐 리지드 바디의 속성에서 Constraints를 조정해주자 -> 회전값을 잠그면 더이상 넘어가지 않는다


특정 위치 생성 후 콜라이더와 리지드바디 부착 (interactzone)
-> 이 벽은 도로와 충돌 판정을 할 것이기 때문에 리지드 바디가 부착되어있어야함! (도로는 이동상태, 벽은 정지상태)

벽에 부착할 스크립트 생성
-> 두 코드 모두 사용가능하다 (같은 의미)


도로는 계속 이동중이고, 모든 도로들은 interactzone에 닿으면 제일 뒤의 도로로 이동해야한다
-> 도로들 마다 다 같은 로직을 수행하네??
RoadManager 스크립트는 도로의 이동과 위치 변경을 담당한다
RoadManager에서 도로의 위치 변경을 해줄 함수를 작성한다Road를 담는 자료구조를 리스트로 사용하였기 때문에 인덱스로 쉽게 접근하여 제거, 추가가 가능하다
다른 방식 (두 코드 모두 작동 가능하다)

Publisher)이벤트를 선언하고, 필요할 때 이를 발생시키는 역할
-> Road 스크립트에서 이벤트를 선언하였으면 주최자이다
-> 이벤트를 발생시키고, 연결된 함수들(구독자)이 실행된다

Subscriber)주최자가 발생시킨 이벤트에 반응하여 특정 동작을 실행
-> road 와 충돌하면 road.Activate() 함수 호출
-> 호출된 함수 안에는 이벤트 발생이 들어있음 (이벤트 발생!)
-> 이벤트에 연결되있는 함수들이 호출된다




