ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CCI - 07 - 적 & 펫 스킬 적용
    팀업 프로젝트/C.C.I

    안녕하세요

     

    오늘은 적(야옹이)과 함께 펫이 스킬을 사용하면

     

    근처의 콜라이더를 추출 해 잠시 일시 정지하게 만들어주는 기능을 함께 보겠습니다.

     

    음.. 우선 제가 처음에 만들었을 때는 야옹이를 입혀놓지 않고

     

    단순 큐브로 태그만 지정해 주어서

     

    테스트를 했었는데.. 현재는 야옹이가 담겨져 있으니

     

    앞 뒤 흐름이 잘 맞진 않더라도.. 제작 했던 순서대로 천천히 나아가 보겠습니다.

     


    우선 펫의 스킬을 사용하면 콜라이더를 추출하는 코드부터 살펴보겠습니다.

     

    우선 첫 번째로 콜라이더를 추출할 스크립트를 새로 만들었습니다.

     

    FoxColExtract의 스크립트를 생성하여 제작했으며.

     

    선언 변수는 간단합니다.

     

    listCols : 추출한 콜라이더들을 담을 list입니다.

     

    colExtractRadius : 추출할 범위입니다.

     

    player : 플레이어입니다.

    (여기서 플레이어에 접근해준 이유는, 처음에는 펫을 중점으로 해당 범위 안에 있는 콜라이더를 추출하려고 했는데

    플레이어의 이동에 따라 뒤에 따라오는 펫의 중점이기에 범위가 일정하지 않은 문제가 있었습니다.

    물론 이러한 구현을 원하시는 분들도 계시겠지만, 제가 원하는 건 플레이어의 일정 범위 내에 있는 콜라이더 추출이었습니다. 플레이어를 중점으로 받아오기 위한 선언입니다.)

     

    Start 함수에서는 널 연산자를 한번 사용해 봤습니다.

     

    player = GameObject.Find("Player")?. transform

    의 "? "을 추가해 

     

    Null이 아니라면 transform을 받아와 줍니다.

     

    콜라이더를 추출하는 기능의 함수인 FoxColExtract_ 함수입니다.

     

    콜라이더의 추출은 OverlapSphere를 이용해 추출을 해 주었으며

     

    인자는 (중심, 범위 , 그리고 비트 연산자를 사용하여 10번 레이어)

     

    를 지정해 주었습니다.

     

    여기서 10번 레이어 = 고양이에게 지정을 해주었으며.

     

    즉 플레이어 중심 + 범위 내에 있는 + 10번 레이어의 콜라이더를 추출

    하는 코드가 되었고

     

    이 콜라이더들을 Collider [] cols로 받아왔습니다.

     

     

    이후 cols!= null : 추출한 콜라이더가 비어있지 않다면

     

    아래 foreach가 실행됩니다.

     

    foreach는 cols를 검사하며

     

    이 검사한 cols들은 col로 받아와

     

    listCols에 Add 해 주었습니다.

     


    여기서 태그를 "CatEnemy"로 지정해 준 이유는

     

    저 혼자 만이 아닌 다른 분들도 접근이 가능하게 만들었으며

     

    레이어로 장애물이라고 지정을 해 둔 뒤

     

    태그를 바꿔서 타 원하는 기능의 함수 구현을 하기 위함입니다.

     

    다음 코드는 col의 게임 오브젝트가 비활성화 / 활성화

     

    를 나누어 0번 자식을 활성 / 비활성화를 해주는 모습이며

     

    activeSelf로 확인을 활성/비활성화를 확인해 준 이유는 적 이 사라지거나

     

    혹은 collider가 꺼진 상황을 대비하였습니다.

     

     

    col.GetComponent <CatFSM>(). FoxSkill_CatNavStop()의 

     

    FoxSkill_CatNavStop()은 바로 살펴볼 CatFSM의 스크립트 안에 구현된 함수입니다.

     

    간단히 코 루틴으로 인해 speed = 0에서 원래 스피드 값으로 바꿔 주어

     

    이 스킬을 맞으면 멈춰 있는 동작을 구현하였습니다.

     


    이어서 많은 적 중 하나인 고양이를 보겠습니다.

     

    Cat Enemy를 제어하기 위해

     

    CatFSM 스크립트를 생성해 주었습니다.

    CatState의 열거형 상수로 인해 CatEnemy의 상태를 3가지로 선언해 주었습니다.

    Idle : 대기

    Move : 이동

    Return : 복귀

    이후 이 상태 값을 제어해 주기 위해 catState의 변수를 선언해 주었습니다.

     

    catMoveSpeed : CatEnemy의 움직임 속도입니다.

    FindPlayerRadius : 플레이어를 찾을 범위입니다.

    orizinPos : 초기 위치 값입니다.

    orizinRot : 초기 회전 값입니다.

     

    player : 플레이어입니다.

     

    catNav : CatEnemy의 NavMeshAgent를 받아올 변수입니다.

    catAni : CatEnemy의 Animator를 받아올 변수입니다.

    Start 함수입니다.

     

    여기서 변경 부분이 있는데,

     

    매 번 플레이어를 public으로 선언하여 가져오거나

    GameObject.Find로 찾는 데에는 이름이 변경되거나

    혹은 오브젝트가 연결되어 있지 한 거나 하면 오류가 발생하는 문제가 있었습니다.

     

    그렇기에 각 오브젝트 중 자주 사용하는 플레이어를 ManagerObject의 스크립트에 넣어 두어서

     

    씬의 단 하나의 싱글톤 패턴인 Manager에 접근하여 ManagerObject에 있는

    플레이어에게 접근을 해 주었습니다.

     

    CatState의 초기 상태는 Idle로 지정해 주었고

     

    각 NavMeshAgent와 Animator를 받아와 주었으며

     

    catNav의 스피드를 인스펙터에서 지정한 catMoveSpeed로 변경해 주었습니다.

    (인스펙터 창에서 속도를 변경하면 catNav의 스피드가 변경됩니다.)

     

    복귀하였을 시 돌아갈

    초기 위치 값(orizinPos) / 초기 회전 값(orizinRot)을 받아 주는 모습입니다.

     

    Update함수입니다.

     

    이번에도 switch로 catState(상태)의 값에 따른 함수 실행을 구현해 주었으며.

     

    switch의 case에서 바로 작성하지 않고

     

    따로 함수를 만들어 실행해 주었습니다.

     

    Update함수에 코드가 길어지면 왠지 모를 가독성도 떨어지게 되고

     

    뭔가 더 복잡하게 느껴지는 느낌적인 느낌이..

     

    CatEnemy의 상태가 Idle 일 때 switch문에서 실행되는

     

    Idle 함수입니다.

     

    Idle일 때의 함수 동작의 코드는 간단합니다.

     

    평상시에는 대기 모션으로 있다가.

     

    Vector3.Distance로 거리를 체크해 transform(catEnemy)의 위치에서 플레이어의 거리의 계산이

     

    FindPlayerRadius보다 작다면

     

    즉 FindPlayerRadius의 범위 안에 플레이어가 들어왔다면?

     

    catState의 상태는 Move로 변경되며

     

    SetTrigger를 이용해 "IdelToMove"의 파라미터의 트리거 값을 실행시켜줍니다.

     

    CatEnemy의 상태가 Move일 때 실행될 Move 함수입니다.

     

    transform(CatEnemy)가 orizinPos로부터 의 거리가 FindPlayerRadius의 범위보다 크다면

     

    catState의 상태는 Return으로 변경됩니다.

     

    또한 초기 위치로부터의 거리뿐만이 아닌

     

    transform(CatEnemy)가 플레이어의 위치로부터 떨어져 있는 거리가 FindPlayerRadius의 범위보다 크다면

     

    catState는 Return이 됩니다.

     

    즉 초기 위치로 부터 지정된 범위뿐만이 아닌

     

    플레이어와 일정 거리가 떨어져도 복귀하는 동작이 구현되었습니다.

     

    move함수의 마지막 if문을 보자면

     

    transform(CatEnemy)가  플레이어의 위치로부터 떨어져 있는 거리가 FindPlayerRadius의 범위 안에 있다면?

     

    catNav의 destination(목적지)를 플레이어로 지정해 주어 이동되게 해 줍니다.

     

    마지막 상태인 Return 상태 일 시 실행되는 Return함수입니다.

     

    간단히 자기 자신과 초기 위치를 검사하여 거리가 0.1보다 크다면

     

    목적지를 orizinPos로 이동시켜주며

     

    멈춰야 할 거리인 stoppinDistance는 0으로 해주는 모습입니다.

     

    반대로 0.1f의 안에 있다면.

     

    네비의 isStopped(멈추겠냐?) = true(네)

    ResetPath(경로 초기화)

    를 해 준 뒤

     

    초기 위치와 회전 값으로 바꿔 주며 

     

    Idle로 돌아가는 코드입니다.

     


    CatEnemy는 현재 공격이나 따른 동작을 하지 않고.

     

    플레이어와 부딪히게 되면 플레이어에게 피격 모션을 동작하게 구현할 것입니다.

     

    00 : 34초

    다음 글에서는 플레이어가 적에게 피격(충돌) 됐을 시

     

    동작하는 구현에 대해서 알아보겠습니다.

     

    감사합니다.

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

    CCI - 09 - 맵 디자인 & Death zone  (0) 2022.05.14
    CCI - 08 - 플레이어 피격모션  (0) 2022.05.14
    CCI - 06 - 펫 스킬 (쿨타임)  (0) 2022.05.13
    CCI - 05 - 펫!!  (0) 2022.05.13
    CCI - 04 - Hp  (0) 2022.05.13

    댓글

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