ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 03 깃허브 - UI & Slime State
    팀업 프로젝트/-Git Hub (임시)

    안녕하세요!

    00 : 46초

    현재 진행된 작업 중에는

     

    1. 인게임 내 ui항목 동기화.

     

    2. Slime의 상태 값

    기본 / 추적 / 공격 세 가지 상태 값에 따른 동작을 구현했습니다.

    (hit 및 die는 현재 진행 중입니다.)


    항목을 조금 더 보자면

    Level, Hp, Energy, Option, Exp 가 추가되었으며

    현재 Option 버튼을 제외한 나머지 항목은

    정해진 값에 따른 동기화가 완료되었습니다.

     

    우선 플레이어의 기본 스텟 값은

     

    Manager 스크립트에 선언을 해 주었습니다.

     

    접근 방식도 용이하고 플레이어는 여럿을 두지 않을 것이기에

     

    선언을 해 두었습니다.

     

    동기화 부분은 PlayerInfo 스크립트를 생성하여해 주었습니다.

     

    Update문이 아닌 코 루틴 함수의 

     

    While문에서 해결을 해 주었으며

     

    yield return null으로 1 프레임을 호출자에게 양보하라는 뜻으로

     

    Update문이 아닌 코 루틴 함수로 대체를 해 주었습니다.

     

    효과를 경험해 보지 않아.. 어떤 게 확실히 좋다라고 말하기는 어려운 감이 있지만..

     

    pc환경이 아닌 모바일 환경은 더욱더 Update함수를 사용 안 하려고 한다고 얼핏 들었습니다.


    이번엔 SlimeInfo입니다.

     

    간단한 기본 몬스터이기에 이름, 체력 두 가지를 받아 왔으며

     

    만일 몬스터가 죽게 되면 일정 시간 후 리스폰을 계획 중인데

     

    매 활성화 시 실행되는 OnEnable 함수에서 hp를 초기화시켜 주었습니다.

     

    플레이어의 스텟과 마찬가지로 코 루틴 함수 While을 통해 

     

    텍스트 및 value 값을 동기화해 주었습니다.


    이번엔 슬라임의 상태 값에 따른 움직임을 담당하는

     

    MonsterSlimeMovement 스크립트입니다.

     

    각 상태 값은

     

    비전투 중, 전투중, 복귀, 공격, 죽음

    으로 총 현재 5가지의 상태 값이 있습니다.

     

    moveSpeed_Combat : 전투 중 스피드입니다.

     

    moveSpeed_NonCombat : 비전투 중 스피드입니다.

     

    moveRange : 최대 움직일 수 있는 거리입니다.

    이 거리를 벗어나면 복귀합니다.

     

    findToPlayerRange : 플레이어가 이 범위 안에 들어오면 추적을 합니다.

     

    AttackRange : 공격 범위입니다.

     

    findToPlayerDis : 플레이어가 현재 자신으로부터 얼마나 떨어져 있는지 체크할 변수입니다.

     

    attackTime : 재 공격 시간입니다.

     

    time : Time.deltaTime을 곱해 주어 공격 시간을 맞춰줄 변수입니다.

     

    isMove : 움직임 중인지 체크할 불 변수입니다.

     

    orizinPos : 초기 위치입니다.

    orizinDis : 초기 위치로부터 떨어져 있는 거리를 나타낼 변수입니다.

     

    destinationPos : 목적지입니다.

    destinationDis : 목적지로부터 얼마나 떨어져 있는지 나타낼 변수입니다.

     

    nav, ani, player 각 필요 컴포넌트를 받아올 변수들입니다.

     

    attackObj : 공격 콜라이더를 담고 있는 오브젝트입니다.

    attackCol : 공격 콜라이더를 담고 있는 오브젝트의 콜라이더를 받아올 변수입니다.

     

    hashAttack : 플레이어와 마찬가지로 미리 해시값을 추출해 변수로 선언해 주었습니다.

    각 컴포넌트와 원하는 값을 초기화해주는 코드입니다.

     

    모두 중요하지만 StartCorutine으로 코 루틴 함수 SlimeAI를 실행 시켜 주어

     

    초기 상태 값인 NonCombat 값에 맞춰 동작을 구현해 주었습니다.

     

    SlimeAi 코루틴 함수입니다.

     

    while문으로 해결을 해 주었으며

     

    간단히 보자면 

     

    orizinDis : 슬라임이 초기 위치로부터 얼마나 떨어져 있는지 탐색한 값입니다.

    destinationDis : 슬라임이 목적지로부터 얼마나 떨어져 있는지 탐색한 값입니다.

    findToPlayerDis : 슬라임이 플레이어로부터 얼마나 떨어져 있는지 탐색한 값입니다.

     

    이후 Swith문을 통해

     

    상태 값에 따른 함수를 실행시켜 주었습니다.

     

    초기 상태인 NonCombat을 통해 

     

    Move_NonCombat 함수가 실행됩니다.

     

    처음으로 StoppingDistance를 0으로 돌려준 이유는 지정된 위치까지 정확히 움직이기 위함입니다.

     

    Attack 상태로 전환될 경우 StoppingDistance는 1.2f로 

     

    플레이어랑 붙지 않고 체크한 거리에 멈추게 됩니다.

     

    첫 번째 조건문은 정해준 목적지와의 거리가 1 이하라면

     

    isMove는 false로 아래 if문이 실행되게 하여 주고

     

    중복 방지를 위해 isMove를 true로 바꿔주는 모습입니다.

     

    목적지인 destinationPos를 RandomRange로 랜덤 값을 받아 

     

    이동을 시켜주는 모습입니다.

     

     

    만일 orizinPos로부터 의 슬라임의 거리가 최대 움직임 거리 moveRange 보다 이상이라면

     

    nav.destination을 초기 위치로 정해 주어 초기 위치로 돌아가게 해 줍니다.

     

    즉 자유롭게 일정 범위 안에서 돌아다니는 Slime이 됐습니다.

     

     

    단 마지막 조건문에서 슬라임으로부터 몬스터의 거리가 

     

    지정해준 값 안에 속해 있다면

     

    state(상태)는 State.Combat으로 전환됩니다.

     

    상태 값이 Combat 상태 라면 Move_Combat 함수가 실행됩니다.

     

    다른 값에서 올 경우 미끄러지는 이동을 하면 안 되니

    네비를 isStopped로 멈춰 주고 목적지를 초기화해 줍니다.

    ex ) attack 상태에서 범위 이상 벗어나 Combat 상태로 돌아왔을 시. 같은 경우

     

    첫 번째 조건문으로

     

    슬라임이 목적지로부터의 거리가 최대 움직일 수 있는 거리 이상이라면

     

    밑에 조건문은 실행하지 않고 바로 State.Return값으로 전환됩니다.

     

    두 번째 조건문으로

     

    슬라임이 플레이어로부터 거리가 

     

    추적할 수 있는 범위 내에 아직 속해 있다면, 플레이어를 향해 추적을 하게 됩니다.

     

    세 번째 조건문으로 

     

    슬라임이 플레이어로부터의 거리가 

     

    공격 범위 안에 속해 있다면, 상태 값은 Attack으로 전환됩니다.

     

    Return함수입니다.

     

    슬라임이 초기 위치로부터의 거리가 0.1f안에 속해있다면, 

     

    네비를 멈춰주고 경로를 초기화해줍니다.

     

    또한 isMove는 false로 해주어 NonCombat 상태에서의 Move_NonCombat 함수의 조건을 맞춰 주어

     

    복귀 후 다시 자유롭게 필드를 돌아다니게 됩니다.

     

    반대로 0.1f 안에 속해있지 않다면,

     

    네비의 멈출 수 있는 거리 stoppingDistance는 0으로 재 초기화를 하고

     

    목적지를 orizinPos로 이동시켜 줍니다.

     

     Attack함수입니다.

     

    transform의 LookAt 함수를 통해 플레이어의 위치로 회전을 하게 해 주었습니다.

     

    플레이어가 어택 범위 안에 여전히 있다면 

     

    time += 연산자를 통해 Time.deltaTime(1 / frame)을 곱해 줍니다.

     

    즉 지정된 시간이 되면 아래 공격을 실행하는 코드입니다.

     

    다만 여기선 공격 애니메이션을 실행시켜 주는 트랜지션의 조건값인

     

    trigger hashAttack(Attack)만 실행시켜 주며

     

    time은 다시 0으로 초기화시켜 주어 0부터 시간이 지나가게 만들어 주었습니다.

     

     

    만일 공격 범위 이내에 없다면 다시 재 추격을 합니다.

     

    슬라임의 Attack애니메이션대 콜라이더의 enable을 off / on 해줄 함수입니다.

     

    event 호출을 하기 위해 public으로 선언해 주었으며,

     

    아래 OnDrawGizoms는 Scene 상에서 거리를 체크하기 위해 작성해 주었습니다.

     

    인자로는 초기위치 , 범위입니다.

     

    실질적인 공격은 BoxCollider를 갖고 있는 오브젝트에

     

    스크립트를 새로 추가하여 OnTriggerEnter로 충돌 시 해결을 해 주었습니다.

     

    현재 작성 중인 Manager스크립트의 Hit 함수에서 실행됩니다.

     

    인자로 damage를 받게 해 각 다른 대미지를 대응해 주었습니다.

     

     

    공격 스크립트는

     

    콜라이더를 단순 몬스터 오브젝트 에게 입혀 두면

     

    몬스터의 각 다른 애니메이션 실행 시 콜라이더가 같이 움직이지 않아서 본 구조에 AttackCol을 생성하였습니다.

     

    슬라임의 Bone 구조에 입혀 두어 슬라임의 본 구조와 따라가게 해 두었습니다.

     


    간단 하지만 상당히 우역곡절이 많았어서.... 하하..

     

    현재 계획은

     

    1. 플레이어가 Slime으로부터 공격을 당할 시 

    대미지 텍스트 추가 / 플레이어 애니메이션 재생입니다.

     

    2. 플레이어가 Slime을 공격할 시 각 기본 공격에 따른 데미지 구현

    +

    Slime Die -> Respawn

    +

    player Die

     

    이렇게 크게 2가지로 보고 있습니다.

     

    아직 구상한 이벤트들이 많이 남아 있어서

     

    기본 동작과 기본 사이클을 맞춰 놓은 뒤 나아가야 할 것 같습니다.

     

    감사합니다.

    댓글

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