ABOUT ME

-

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

    (영상 2개)

    안녕하세요

     

    오늘은 2번째 Stage인 회전하는 원형 판에 몬스터를 피해 지나가는 형태와

    지난번에 만들었던 bridge를 약간 변화시켜 주어

    연출해준 효과를 같이 살펴 보시겠습니다.

     


    우선! 이 bridge를 먼저 보시겠습니다.

     

    바로 코드부터 가시죠!

     

    BridgeOff라는 스크립트를 새로 생성하여 작성하였습니다.


    현재 제가 원하는 동작 구현은

     

    플레이어가 bridge위로 올라가게 되면

     

    bridge는 깜빡깜빡 거리며 사라질 것 같은 분위기를 연출해 주고

     

    일정 시간이 지나면 bridge는 비활성화가 됩니다.

    (플레이어가 위에 있다면 콜라이더가 사라져 추락하게 됩니다.)

     

    또한 일정 시간이 지나면 다시 bridge는 활성화가 됩니다.


    time : bridge가 사라질 시간입니다.

     

    bridgeAni : bridge가 실행할 애니메이션입니다.

     

    Start함수에서 애니메이터 컴포넌트를 bridgeAni에 받아와 주었으며

     

    OnCollisionEnter

     

    충돌이 있을 시에서 구현을 해 주었습니다.

     

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

     

    StartCorutine으로 코 루틴 함수 BtidgeOffTime을 실행시켜 주었습니다.

    (스크립트상 오타가 나서 BridgeOffTime으로 수정하였습니다.)

     

    또한 애니메이션의 트랜지션의 조건값을 충족시켜 트랜지션의 방향이 흐르게 해 주었습니다.

     

    -bridge의 애니메이터 화면입니다-

     

    애니메이터에 있는 Bidge 애니메이션을 보겠습니다.

    (오타가 나서 Bridge애니메이션의 이름으로 변경했습니다.)

    (오타가 왜 이렇게 많지,,,,)

    간단히 bridge오브젝트의 Mesh Rennderer를 Enabled를 이용해 껐다 켜주는 애니메이션입니다.

    (시각적으로 사라졌다 보였다를 반복해 주기 위함입니다.)


    이번엔 코 루틴 함수를 보겠습니다.

     

    간단히 bridge가 사라질 시간은 time변수로 해결하였습니다.

     

    time변수에 Time.deltaTime의 값을 누적시켜 1초씩 더해주었으며

     

    3초 이상일 경우엔 코루틴 함수 중지와 함께 오브젝트는 비활성화됩니다.

     

    또한 애니메이터의 BridgeStart -> Bridge의 반대 조건인 Bridge -> BridgeStart로 가기 위하여

     

    "Meet"의 파라미터 값을 false로 바꿔주었으며

     

    Invoke(함수를 지연 후 실행시켜줌)를 이용하여 3초 뒤 BrtidgeOn함수를 실행시켜 주었습니다.

    (오타.... BridgeOn 함수명으로 변경하였습니다............)

    Invoke에서 실행되는 BtigeOn함수입니다.

    간단히 게임 오브젝트를 활성화를 시켜주는 모습입니다.

     

    00 : 11초

    다음으로 돌아가는 원형 판을 알아보겠습니다.

    발판이 되는 원형 판은 계속 돌아가게 만들 것입니다.

     

    Circle이라는 스크립트를 생성하여 작성해 주었습니다.

     

    circleRotSpeed : Circle이 회전할 스피드입니다.

     

    Update문이 아닌 코 루틴 함수에서 대신했습니다.

    (최적화에 대해서 자세히는 모르지만.. 학습하기론 안 쓰는 Start함수나 Update함수는 지워주면 좋고..

    Update함수는 가급적 안 쓰려고 한다고 들은 기억이 있습니다.

    (정확한 건 아닙니다. 자세히 알게 되면 설명 첨부하여 올리겠습니다.))

     

    OnEnable함수에서 코 루틴 함수를 실행시켜 주며

     

    코루틴 함수에서 While문으로 transform(Circle)을 회전시켜 주는 코드입니다.

     

    두 번째로 원형 판에 올라와 있는 장애물들입니다.

     

    이 장애물들은 간단히 오브젝트 배치 후

     

    태그와 레이어를 조절해 주었습니다.

    이후 이 태그를 PlayerMovement의 OnCollisionEnter에서 실행해 주어

     

    그에 맞는 동작을 하게 해 주면 됩니다.

    PlayerMovement의  OnCollisionEnter의 코드중 일부

    이 코드는 몇 번 나왔기에 여기서는 생략하겠습니다.


    마지막으로 알아볼 Golem입니다.

     

    간단한 긴 막대기를 피하는 방식으로 구현을 하려고 했는데,

     

    뭔가 식상한 감이 없지 않아 있기에 Golem을 넣어 봤습니다.

     

    Golem을 제어하기 위해 GolemFSM(유한 머신)이라는 스크립트를 생성하여 작성해 주었습니다.

     

    GolemState : 골렘의 상태 값입니다.

     

    golemState : GolemState를 제어하기 위해 만든 변수입니다.

     

    findPlayerDis : 골렘이 플레이어를 찾았거리입니다.

    (플레이어가 거리 내에 없다면, 골렘은 Idle 애니메이션을 재생합니다.)

     

    attackStep : 골렘의 공격 단계입니다.

    (골렘은 왼손과 오른손을 랜덤으로 사용하게 됩니다. 변칙적인 연출이 가능합니다)

     

    curTime : 공격 딜레이의 조건을 맞춰줄 현재 시간입니다.

    AttackDealyTime : 공격 딜레이 시간입니다.

     

    player : 플레이어입니다.

    (플레이어의 위치를 확인하기 위함입니다.)

     

    golemAni : 골렘이 갖고 있는 애니메이터입니다.

     

    golemRotSpeed : 골렘도 회전 스피드 값입니다.

    (골렘도 회전을 합니다. 원판이랑은 별개의 회전을 합니다.)

     

    GolemFSM 스크립트의 코드입니다.

     

    원판이랑 같이 골렘도 생성이 되면 회전을 시켜주었습니다.

     

    Start함수에서는 각 필요한 컴포넌트를 받아와 주었으며

     

    golemState(골렘의 상태)를 Idle로 받아와 주었습니다.

    (즉 골렘의 초기 상태는 Idle입니다.)

     

    Update함수에서는 간단히 golemState(골렘의 상태)를 판단해

     

    switch문으로 상태에 맞는 함수를 실행시켜 줍니다.

    Idle함수는 간단합니다.

     

    초기 상태 값이 Idle이기에 이 상태 값을 유지하고 있다가

     

    Distance로 거리를 측정하여 findPlayerDis 즉 골렘에서 플레이어의 거리가

     

    findPlayerDis 범위 안에 있다면?

     

    골렘의 현재 성태는 (golemState) = Attack이 됩니다.

     

    golemState 상태가 Attack일 때 실행할 Attack함수입니다.

     

    이 함수에서는 한번 더 조건을 검색해 줍니다.

     

    여전히 골렘에서 플레이어까지의 거리가 findPlayerDis범위 안에 존재한다면?

     

    우선 attackStep을 랜덤 값으로 받아 줍니다.

    랜덤 값은 0 혹은 1 이 됩니다.

     

    정수형이 아닌 실수 값으로 한다면 뒤에 값을 포함하고

    정수형으로 한다면 뒤에 값에서 -1을 해줘야 합니다.

    (간단한 거지만 자칫 깜빡하고 실수를 범해 코드를 다시 볼 경우가 생기실 수도..?)

     

    curTime += Time.deltaTime

     

    curTime의 Time.deltaTime의 값을 누적시켜 주어 1초씩 더해 주었으며

     

    만일 curTime이 AttackDealyTime이상이 되었다면, 공격을 할 수 있음을 의미하며

     

    Switch로 attackStep에 맞는 공격을 실행해 주었습니다.

     

    (중요한 점은 curTime은 0으로 초기화를 해줘야 다시 0부터 시작할 수 있다는 점입니다.)

    만일 findPlayerDis의 범위 밖이라면

     

    골렘의 상태는 다시 Idle로 변환해 주는 코드입니다.

     

     

    01 : 03초

    짧은 영상을 보시면서

     

    오늘은 이만 마치도록 하겠습니다.

     

    감사합니다.

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

    CCI - 14 - 맵 디자인 (작성중)  (0) 2022.05.19
    CCI - 13 - 장애물 3  (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