본문 바로가기

프로젝트/게임 개발

[06] 230108 게임 개발 일지 - 활 스킬 구현

제일 미뤄놨던 활 스킬을 구현할 차례가 왔다...

역시역시나 생각한 대로 좀 복잡했다.

 

활 스킬을 어떻게 구현할지 기획자 엉님과 의논 결과, 아래와 같이 구현하기로 했다.

  • 바라본 방향에서 위 아래로 45도 이내에 가장 가까운 타겟을 잡아 자동으로 발사한다.
  • 타겟이 없으면 그냥 바라본 방향으로 직선으로 화살을 날린다.

 

타겟을 잡을 때 오랜만에 수학공식을 쓰려하니... 기억이 나지 않는다...

좌표계 이동... 극좌표계... 삼각함수... 음...

이걸 다시 꺼내다니... 저번 통계쪽 계산할때도 그렇고 은근 쓸일이 있구나 하고 느꼈다.

 

타겟을 잡는 간단 로직은 아래와 같다.

  • 원하는 픽셀 내의 몬스터를 갖고온다.
  • 몬스터의 x,y좌표를 캐릭터의 x,y 좌표를 기준으로 좌표계 이동을 해준다.
  • 캐릭터가 바라보고 있는 방향을 기준으로 45도 이내의 몬스터만 골라낸다.

        ex) 캐릭터가 위에 바라보고 있을 때,

(math.abs(tX) <= r*math.cos(math.rad(45))) and tY >= 0
  • 내장함수가 그 중 가장 가까운 유닛을 고르도록 한다.
  • 해당 범위에 타겟이 존재하면, ClientScript으로 event를 발생시켜, 타겟의 x좌표와 y좌표를 보내고, Client에서 해당 좌표를 받아 해당 좌표로 화살을 쏘도록 한다.
  • 타겟이 존재하지 않는다면, Client에서 바라보고 있는 방향으로 화살을 쏘도록 한다.

 

발생 error들

1. unit.field.FindMinimumUnit 사용

해당 내장함수는 안에 함수를 입력하면, 해당 조건의 최솟값을 갖는 유닛을 반환한다.

이 함수에 타겟을 잡는 로직을 하여 거리가 가장 작은 유닛을 반환하려 하였다.

하지만, 해당 함수는 null값을 반환하지 못해서 return값을 모두 지정해 주어야 해서 해당 범위에 없는 경우를 처리하기 힘들어 사용하지 못했다.

 

2. unit.field.FindUnit 사용

해당 함수는 가장 가까운 거리를 반환하는 것이 아니라, 그냥 해당 범위에 있는 타겟을 반환해 주어,

최단거리의 타겟을 반환하지 않았다.

 

3. 활 쏘는 스킬과 화살 나가는 스킬 분리하지 않음

애니메이션과 모션의 이해가 부족해 발생했던 것 같다.

분리하지 않으면 화살이 두개가 나가거나, 타겟팅에 오류가 생겼었다.

활 쏘는 스킬을 누르면 자동적으로 스크립트 상 화살촉이 발사되도록 구성하였다.

 

오랜만에 서버스크립트와 클라이언트와 왔다갔다하니 이벤트를 주고받는 과정에서도 조금 해멨다...