ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CCI - 13 - 장애물 3
    팀업 프로젝트/C.C.I

    안녕하세요!!

    오늘은 그간 문제가 있어서 동작이 안됐던 부분이 해결되어서 기분이 좋은 날입니다.

     

    하지만 동작 구분은 해결됐지만 이유는 아직 명확히 깨닫지 못했습니다.

    (이게 더 중요한데...)

    우선.. 제가 만들고자 했던 부분은

     

    1. 이동하는 Ground

     

    2. 이동하는 Ground에서 장애물 피하기

     

    두 가지입니다.

     

    시행착오라고 말씀드려야 하나.. 모두 데이터 화를 해 놓진 않았지만..

     

    하나씩 살펴보시면서 생각나는 문제점들과 해결 방법에 대해서 같이 올리겠습니다.

     


     

    우선 첫 번째로 제가 원했던 구현은 상/하로 움직이는 Ground였습니다.

     

    00 : 20초

    상/하 뿐만이 아닌 좌/우 도 움직이게 원했고

     

    이것을 인스펙터 창에서 조절이 가능하게 하길 원했습니다.


    동작 부분을 구현하기 위한 스크립트부터 같이 살펴보겠습니다.

    그라운드를 이동하기 위해 GroundMove 스크립트를 생성하여 작성해 주었습니다.

     

    x, y, z : 추 후 이용되는

    transform(ground). position 값을 받을지 지정된 값을 받을지 체크할 불 변수입니다.

     

    ground_X, ground_Y, ground_Z : 각 그라운드가 이동할 지정 값을 담을 변수들입니다.

     

    groundSpeed : 그라운드의 이동 스피드 값입니다.

     

    isArrive : 그라운드가 지정 목적지에 도착했는지 체크할 불 변수입니다.

     

    orizinPos : 초기 위치 값입니다.

    destiPos : 목적지 위치 값입니다.

     

    dir : 그라운드가 이동할 방향입니다.

     

    playerToGround : 이건 좀 나중에 생긴 문제 때문에 작성한 코드인데,

    플레이어가 그라운드 위의 어느 방향에 위치해있는지 알려줄 값입니다.


    Start함수입니다.

     

    orizinPos에 초기 위치 값을 할당해 주었으며

     

    destiPos(목적지)의 위치를 new Vector3의 3항 연산자를 통해 받아 주었습니다.

     

    즉 불 변수가 체크되어 있을 땐 그라운드의 현재 포지션 값

    불 변수가 체크되어 있지 않을 땐 지정된 값

     

    으로 변경해 주는 코드입니다.

     

    (이렇게 해두면 지정된 값만 불변수의 체크를 해제하여 이동시킬 수 있습니다.)

     


    Ground의 이동은 FixedUpdate에서 해 주었습니다.

     

    첫 번째로.. 이 부분을 처음엔 Update에서 실행해 주었었는데..

     

    플레이어가 이동시엔 괜찮다가, 그라운드에 올라타기만 하면 부르르르르 떨리는 현상이 나타나는 문제가 있었습니다.

     

    처음에는 플레이어의 이동 문제가 있는지.. Physic Material이 문제인지..

    다양한 시도를 해봤었는데요.

     

    이유는 물리가 적용된 2개의 오브젝트가 충돌한 문제였습니다.

     

    물리 관련 이동 호출은 FixedUpdate에서 해야 한다는 것이었습니다.

     

    (네. 이렇게 지식 +1을 획득하였습니다.)

     


    이후 값들을 제어해 주기 위해 curPos, desPos, oriPos를 선언해 주었습니다.

     

    (여기서는 문제가 발생했었는데, 원래 처음에는 변수를 선언을 안 해주고

    바로 orizinPos의 값과 destiPos의 값을 사용했었습니다.

    하나 아직 원인은 찾지 못했지만, 이 값들이 사용이 안되었습니다..

    그리 하여 변수를 생성해 주는 모습입니다. 원인을 찾는다면 꼭 추가로 올리겠습니다.)


    if문으로 거리를 측정하여 isArrive(도착했는지 체크할 불 변수)를 true/false를 제어해 주었으며

     

    거리를 측정하는 데에는 Distance함수를 사용하였습니다.

     

     

    이후 이 isArrive로 if문을 통해 그라운드를 이동시켜 주었습니다.

     

    이동하는 함수는 MoveTowards(시작 지점, 목적지)를 정해주는 함수로 방향을 과 스피드를 정해 주었으며

    transform.position = dir로 이동을 시켜주는 모습입니다.

     


    하지만 테스트를 해보던 중 문제점들이 좀 추가 발견이 되었는데요.

     

    첫 번째에 이어 두 번째로.. 플레이어가 그라운드를 타고 올라갈 때에는 괜찮았지만

     

    내려올 때는 통통 튀는 모습이 연출되었습니다.

     

     

    그라운드의 바운스 문제인지.. 플레이어의 RigidBody가 너무 가벼워서 그런 건지

     

    무게를 바꿔봐도 Physic Material를 추가해 봐도 해결이 안 되었었습니다.

     

     

    또한 그라운드의 이동 속도를 낮추면 조금 나아지는 기미가 보이긴 했지만,


    원하는 해결책이 아니였습니다.

     

    여러 가지 전문적인 방법이 있겠지만.

     

    저는 RigidBody의 Collision Detection으로 해결을 하였습니다.

    (특정 원하는 값을 보고 해결한 것이 아니고, 플레이해보며 이것저것 만져보다가 

    그라운드가 아래로 이동시 통통 튀는 문제가 한 번만 발생하고 나머지는 발생을 안 했습니다.

    조금 알아본 결과 추측성 CCD로 물리 단계에서 접촉 가능한 모든 컨택트를 가져오는 알고리즘이라고 하는데..

    네, 제가 두 번째로 해결해야 할 숙제입니다.)


    세 번째로.. 플레이어가 x, z 축으로 이동하는 그라운드에 올라탔을 시

     

    그라운드 위에 있음에도 그라운드를 따라가지 못하고 독단적인 위치에 가만히 있는 문제였습니다.

     

    당연한 얘기지만, 원하는 동작 구현이 아니였습니다.

     

    이 문제로도 많은 시도를 해 봤었는데요

     

    이 문제의 해결책은 찾았습니다.

     

    바로 OnCollisionStay로 

     

    충돌체가 머무를 시 실행되는 이벤트 함수로 해결을 하였습니다.

     

    OnCollisionStay함수입니다.

     

    충돌체(collision)의 게임 오브젝트 태그가 "Player"일 시에는

     

    그리고 그 collision(player)의 RigidBody를 받아와 velociy(속도)가 0 일시에는

     

    player의 위치를 현재 그라운드의 위치 - playerToGround로 해 주었습니다.

     

    이 playerToGround는 

    Update문에서 받아와 현재 그라운드의 위치 - player의 위치를 누적 저장해 주었습니다.

     

    즉, 현재 그라운드위의 플레이어가 위치해 있는 방향 그대로를

     

    속도가 없을 시 움직이게 해 주었습니다.

     


    그라운드의 이동도 완성되고 나니 좀 더 다양한 패턴을 주고 싶어서

    GroundMove의 길목에 이러한 별을 세워 누워서 플레이어가 못 지나가게 BoxCollider를 입혀 주었습니다.

     

    (자꾸 문제만 올려서 죄송합니다..)

    네 번째.. 현재 이 상태에서 플레이어가 움직이는 그라운드를 타고 이동을 할 시

    BoxCollider를 그냥 무시해 버리는 현상이 생겼습니다.

     

    OnCollisionEnter로 충돌 체크를 해봤지만, 또 충돌 체크는 되었습니다.

     

    저는 이 문제가 GroundMove에서 플레이어의 위치를 강제로 움직이게 해 줘서 생기는 문제인 것 같아서

     

    다른 방도를 찾아보던 중, 같이 하는 팀원분 중 한 분이 MeshCollider를 입혀도 그러는지 물어보셨고

     

    전 "똑같지 않을까요? 흠.."이라는 말과 함께 MeshCollider를 입혀봤는데

     

    움직이는 그라운드 위에 있어도 충돌이 되는 것이었습니다.

    (정확히 말하자면 BoxCollider도 충돌 판정알람은 일어났지만 실질적인 충돌은 안됩니다..) 

     

    MeshCollider는 충돌 연산량이 많다고 들어서 잘 안 쓰던 콜라이더인데..

     

    같은 Collider인데도.. 왜 다를까 하는 숙제가 하나 더 +1 되었습니다.

     

    글을 쓰면서도 서치 하면서 찾아보고 있긴 한데 흠.........


    우선 오늘 작업한 진행 과정을 영상으로 보시겠습니다.

     

     

    01 : 14초

    오늘은 여기까지 글을 마치며

     

    다음 글에서 뵙도록 하겠습니다.

     

     

     

    감사합니다.

    ☆다들 좋은 하루 되세요★

    '팀업 프로젝트 > C.C.I' 카테고리의 다른 글

    CCI - 14 - 맵 디자인 (작성중)  (0) 2022.05.19
    CCI - 12 - 장애물 2  (0) 2022.05.17
    CCI - 11 - 장애물  (0) 2022.05.16
    CCI - 10 - 플레이어 이동구현_2 & 화면회전  (0) 2022.05.15
    CCI - 09 - 맵 디자인 & Death zone  (0) 2022.05.14

    댓글

김효겸 / Tel. 010-7735-0580 / E-mail. dollzzang2@hanmail.net