ABOUT ME

-

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

    안녕하세요.

     

    오늘은

    간단한 큐브에 받아온 에셋 이미지를 입혀서

     

    돌이 굴러가는 형태의 장애물을 만든 과정을 살펴보시며

     

    추가적으로 Restart기능의 버튼을 살펴보겠습니다.

    (현재는 RESTART 기능밖에 없지만 왼쪽에 Title Scene의 버튼을 만들 예정입니다.)

    (아직 TITLE Scene는 작업이 완성되지 않았기에 보류 중입니다.)

     


    우선 Cube를 살펴보겠습니다.

     

    이 Cube형태의 장애물은 굴러가는 형태로 구현을 할 것이며

     

    또한 CubeRun이라는 Name을 지어 주었습니다.

     

    rigidBody의 AddTorque를 사용하여 회전을 해주었으며

     

    Player와 충돌 시 플레이어는 넉백 효과를 받게 됩니다.


    바로 코드를 살펴보겠습니다.

     

    CubeRun스크립트입니다.

     

    cubeRigidBody : 큐브가 갖고 있는 리지드 바디입니다.

     

    rotationPower : 회전할 파워입니다.

     

    cubeScale : 큐브의 스케일을 변화시켜 좀 더 역동적인 동작을 연출했습니다.

     

    addTime : 큐브가 DeathZone에 닿으면 사라지고 난 뒤

    Invoke 함수에서 실행될 시간입니다.(생성)

     

    orizinPos : 큐브의 초기 위치 값입니다.

    orizinPos : 큐브의 초기 회전 값입니다.

     

    OnEnable함수입니다.

     

    OnEnable함수는 Start함수나 Awake함수와 다르게

     

    최초 1회만 실행되는 것이 아닌 활성화 시 매 실행되는 함수입니다.

     

    cube의 RigidBody의 AddTorque를 사용하기 위하여

     

    RigidBody를 가져와 주며

     

    StartCoruntine로 코 루틴 함수 GainRunTime()와 GainRun()를 실행시켜 줍니다.

     

    orizinPos / orizinRot : 초기 위치와 초기 회전 값을 받아와 주며

     

    rotationPower : 회전 파워를 랜덤 값으로 받아와 주었습니다.

    (규칙적인 칼근무의 장애물 형태를 구현한 것이 아닌, 랜덤 속도를 받아와

    각기 다른 연출이 되는 것 같은 효과를 주기 위함입니다.)

     


    OnEnable에서 StartCorutine로 실행되는 코 루틴 함수 GainRunTime과 GainRun입니다.

     

    우선 아래 코 루틴 함수인 GainRun 코 루틴 함수를 보자면

     

    rotationPower(회전 파워 값) cubeScale(큐브 스케일)의 값을 +=연산자를 통해 누적시켜 줍니다.

     

    또한 큐브가 생각 이상으로 커질 것을 막아 주려고 if문의 조건문을 걸어주었습니다.

     

    transform.localScale = Vector3.one * cubeScale로

     

    transform(큐브)의 스케일을 조절을 해줌과

     

    cubeRigidBody.AddTorque 큐브에 RigidBody의 AddTorque를 이용해 회전을 시켜 주었습니다.

     

    포스 모드는 Acceleration으로 

     

    무게를 무시하며 연속적인 힘을 주었습니다.

     


    여기까지는 동작이 잘 되지만

     

    제가 원하는 것은 큐브가 굴러가다가 사라 질시 재생성되어

     

    똑같은 운동을 하게끔 하는 것이었습니다.

     

     

    즉, 랜덤 값으로 이동하며 피해야 하는 큐브의 모습을 원하였습니다.


    첫 번째로 큐브가 사라질 경우를 생각해 보았습니다.

     

    벽이 있다거나 혹은 특정 오브젝트가 있다면

     

    그 위치와 충돌 시 비활성화해주면 되는 부분이었지만, 현재 맵이 완성되어 있는 것이 아니기에

     

    원리는 같지만 좀 다른 방법으로 이용해 보기로 했습니다.

     

    Cube의 OnCollisionEnter함수입니다.

     

    현재 cube는 Ground에서 굴러가고 있으며, 

    이 Ground가 아닐 시를 받아와 주었습니다.

     

     

    이 Ground가 아닌 다른 충돌체가 충돌했을 시 

     

    현재 진행되는 코 루틴 함수들을 중지시켜주며

     

    rotationPower와 cubeScale을 초기 값으로 변경해 주었습니다.

     

    이후 Invoke 함수로 일정 시간 + 랜덤 값의 시간을 지연 후 AddCube함수를 실행시켜 주었습니다.


    여기서.. 상당히 애먹었던 부분이

     

    큐브의 회전 값이 자꾸 달라진다는 것이었습니다.

     

    스피드야.. 랜덤 값을 부여해 주었으니 그렇겠거니.. 생각을 해도

     

    회전 값이 달라지는 이유는 도저히 찾을 수가 없었습니다.


    단순히 Invoke함수로 cube의 위치를 초기 위치로 잡아주고 활성화시켜주면 되겠다... 생각했던

     

    제 실수였습니다.

    BUT 해결을 했으니 글을 올리고 있지 않겠습니까 허허

     

    문제는 RigidBody.AddForce나 addTorque를 사용 시

     

    여러 번 사용하게 되면 이전 값과 합해서 적용이 되는 이유였습니다.

     

    즉 초기화! 를 안해준 문제였습니다.

     

    (별거 아닌 것 같지만 시간을 은근히 잡아먹은 문제,,)

     

    그리 하여 AddCube의 함수에

     

    초기 스케일, 위치, 회전 값을 초기화해주며

     

    cubeRigidBody.angularVelocity = Vector3.zero

     

    초. 기. 화를 꼭 해주고

     

    Cube를 활성화해주는 코드를 완성했습니다.

     

     

    00 : 33초

    원했던 결과를 얻을 수 있었습니다 ㅎㅎ

     

    다음 글도 이어서 현재 만든 스테이지에 가기 위한 장애물들을 살펴보겠습니다!!

     

    감사합니다.

     

     

    댓글

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