부트캠프 61

프로젝트 마무리

오늘 최종 발표회를 마지막으로 부트캠프 과정이 마무리 되었다. 내일배움 캠프를 들어오기 전에는 게임을 만들어본 경험이 많이 없었기 때문에 잘 할 수 있을지 걱정이 되었는데 어느덧 수료까지 하게 되었다. 간단하게 내일배움 캠프에 대한 후기를 남겨보자면 국비과정으로 진행되며 훈련 장려금도 지원됐기 때문에 금전적 부담이 없었다는 점이 굉장히 좋았다. 그리고 국비과정이라고 하면 교육의 질에 대한 의구심이 생기기 마련인데 직접 경험해본 바 걱정할 정도의 수준은 아니다. 다만 아무래도 비전공자분들도 꽤 많이 계신만큼 전공자로서 초반에 배우게 되는 프로그램이 기초 지식들은 크게 도움이 되지 않기 때문에 전공자로서 캠프를 들어오려고 한다면 이런 부분은 고려해야 할 것 같다. 1기에서 전공자 비전공자 비율은 정확히는 모..

부트캠프 2023.12.15

Animator 알아보기

유니티의 현재 애니메이션 시스템은 메카님 시스템이라고 불리기도 하며 Animator 컴포넌트를 통해서 동작한다. 애니메이션 리타겟팅, 근육 제어, 상태 머신 등의 기능들이 있다. Animator 컴포넌트는 AnimationController를 통해 AnimationClip간의 Transition을 정의하고 Layer, Parameter등으로 관리할 수 있다. Avatar라고 하는 휴머노이드 형태의 모델이 가지고 있는 뼈대 모형을 토대로 애니메이션 리타겟팅, IK 관련 기능을 이용할 수 있다. 애니메이션 시스템은 굉장히 복잡한 많은 기능들이 있으므로 자주 쓰이는 기능만 몇 가지 정리한다. ◆Animator ● Transition HasExitTime : 이 설정이 True면 애니메이션의 정규화된 실행시간이..

부트캠프 2023.11.28

위치와 회전 계산하기

적 AI를 구현하면서 위치 및 회전을 계산해야 하는 경우가 굉장히 많았다. 그럴 때 사용할 수 있는 여러가지 방법을 소개한다. ◆ 거리 및 각도 계산 ●Vector3.Distance : 두 벡터 사이의 거리를 계산할 수 있다. ●Vector3.SqrMagnitude : 벡터의 크기가 제곱되어 있는 값이다. 그냥 크기는 제곱근 연산을 추가로 필요로 하기 때문에 연산을 줄이기 위해 사용하는 값이다. ●Vector3.Angle : 두 방향벡터 사이의 각도를 계산할 수 있다. 리턴값의 범위는 0~180으로 +-를 포함한 값을 얻고 싶다면 Vector3.SignedAngle 를 사용해야한다. ●Vector3.MoveTowards : 현재 위치를 목표 위치로 최대 거리차만큼 이동시킨 벡터이다. Update와 같은 ..

부트캠프 2023.11.22

공격 범위를 DecalProjector를 이용해 표시하기

적이 공격하는 범위를 DecalProjector를 이용해 표시했다. 먼저 DecalProjector를 사용하기 위해서는 URP나 HDRP를 사용중이어야 한다. 위와 같이 자신이 사용하는 렌더러 세팅 Asset을 찾아서 AddRendererFeature를 통해 Decal 기능을 추가한다. 그리고 Decal 탭에서 Use Rendering Layers 옵션도 체크해준다. 특정 레이어에만 데칼을 페인팅할 수 있게 해준다. 다음으로 빈 객체를 생성해서 DecalProjector 컴포넌트를 붙인다. 위와 같이 필요한 값들을 설정해주어야 하는데 여기서 칠해줄 머터리얼을 넣어줘야 한다. 머터리얼은 ShaderGraphs/Decal에서 기본적인 데칼 셰이더로 생성해주면 된다. 여기서 BaseMap 부분에 범위 표시에 ..

부트캠프 2023.11.18

애니메이션의 상태판단

현재 애니메이터가 재생하고 있는 애니메이션의 상태를 판단해야할 때가 있다. 이럴 때 쓸 수 있는 것이 Animator의 GetCurrentAnimatorStateInfo 메소드이다. Animator animator; animator = GetComponent(); AnimatorStateInfo info = animator.GetCurrentAnimatorStateInfo(0); 위와 같이 사용할 수 있다. 매개변수로 들어간 0은 애니메이터의 레이어를 의미한다. 애니메이터의 레이어가 여러개라면 상태를 받아오고 싶은 레이어 값을 넣어주면 된다. 이렇게 받아온 AnimatorStateInfo를 통해서 여러가지 정보를 얻을 수 있다. 대표적으로 사용되는 값은 normalizedTime이다. 해당 값은 현재 애..

부트캠프 2023.11.15

중간발표

오늘은 프로젝트의 중간 발표가 있었다. 팀의 개발 프로세스 및 주요 기능들을 정리해서 발표 자료로 만들어서 발표했다. 피드백 받은 사항은 다음과 같았다. GetComponent 캐싱 : 다른 팀원이 짠 코드중에 Update 내부에서 GetComponent가 되는 부분이 있어서 캐싱을 하는 것이 좋다. 월드 최적화 : 월드의 크기가 작지 않기 때문에 최적화가 진행되어야 한다. 퀘스트 관리 : ID를 통해 관리되고 있는데 데이터로만 관리될 수 있도록 발전시키면 좋을 것 같다. UI관리 : UIManager를 이용하고 있는데 델리게이트 등으로 콜백을 받아서 세팅해주는 제너릭한 방법을 사용해보면 좋을 것 같다. 해당 사항들을 앞으로의 작업시에 수정해나갈 예정이고 오늘은 회의를 통해 보스와 맵의 컨셉을 잡고 애셋..

부트캠프 2023.11.13

1차 통합

중간 발표를 앞두고 그동안 분담해서 작업하던 기능들을 1차적으로 통합했다. 서로 연관이 있었던 기능들인 플레이어와 적과의 상호작용 부분은 기능을 연결짓는데 시간이 꽤 걸렸지만 그 외의 것들은 확실하게 팀원과의 분담이 있었기 때문에 연동에 큰 어려움이 있지는 않았다. 작업 분담은 작업을 선순위, 후순위로 나눠서 분배하며 이뤄졌다. 작업의 우선순위를 정하고 팀원들에게 당장 처리되어야 할 작업부터 역량 및 선호도를 고려하여 분배하고 각 팀원이 담당한 작업이 완료되는대로 다시 후순위의 작업들 중 우선순위를 정해 배정하는 방식으로 진행되었다. 작업 단위는 최대한 기능이 겹치지 않으며 유사한 작업들은 같은 담당자가 진행하는 식이었다. 이렇게 진행되다보니 지금까지 구현 내용을 합쳤음에도 팀원 각자 각자는 다른 팀원이..

부트캠프 2023.11.09

적 공격 액션 시스템 완성

계속 머리를 싸매게 만들었던 공격 액션을 사용하는 시스템의 로직을 완성했다. 이 로직을 짜면서 부딪힌 큰 문제 몇 가지가 있다. 1. 관리를 어디서 해줄 것인가. 적의 이동 부분을 상태머신을 이용해서 구현을 했었다. 여기서 공격 액션과 관련된 State를 만들어 추가하기에는 구조가 적합하지 않다는 생각이 들었다. 실행과 관련된 공통된 로직을 Base가 되는 State에서 작성할 수 있어서 로직으로만 보면 가능할 수 있지만 패턴의 종류가 구체화되고 나면 수치적인 부분을 조정하는 것은 인스펙터를 통해서 즉각적으로 수정할 수 있고, 따로 저장이 되기를 원했는데 State로 작성하면 인스펙터에 노출하기 위해 작업도 더 복잡해지고 수정이나 저장을 하기도 어렵고 하나의 타입으로 업캐스팅 하는 것도 문제라고 판단됐기..

부트캠프 2023.11.08

공격 패턴 시스템 구현

저번부터 쭉 구현중인 시스템의 기본적인 로직을 오늘 얼추 뼈대를 잡게 되었다. 여러 문제에 많이 부딪히고 있는데 오늘 부딪힌 가장 큰 문제는 애니메이션의 상태를 판별하는 것이다. 여러가지의 공격 패턴이 존재하게 될 것이고 공격마다 각각 해당하는 애니메이션 클립을 재생하게 될 텐데 애니메이션이 끝났는지 판단하는 방법을 찾기가 어려웠다. 결국 튜터님께 자문을 구했고 StateMachine Behaviour라는 클래스를 상속받아서 애니메이터에서 상태 변화에 따라 이벤트를 실행할 수 있는 방법에 대해 들었지만 지금 구현중인 시스템과는 조금 알맞지 않았다. 시스템은 어떤 애니메이션 클립을 실행할지 모르고 SetTrigger를 통해서 트리거를 세팅시켜줄 뿐인데 StateMachine Behaviour를 통해 애니메..

부트캠프 2023.11.03

적 공격 기믹 구상하기(feat 소통의 중요성)

지금 진행중인 프로젝트 기획는 보스급의 몬스터는 기믹을 수행하게끔 공격하는 기획으로 되어있다. 직접 공격을 맞춰서 HP를 줄이는 것이 아니라 기믹을 수행해서 보스를 회피하거나 기믹을 통해 데미지를 주는 방식이다. 그런데 적 AI를 구현함에 있어서 공격 기믹을 불러오고 선택, 사용, 취소 등을 할 수 있는 기반이 될 수 있는 시스템이 필요했다. 이 기반이 될 시스템을 구상하려고 하니 잘 떠오르지도 않고 어떤 방식으로 하는 게 좋을 지 잘 감이 잡히지 않았지만 고민을 거듭해서 Action이라는 하나의 행위를 대표하는 클래스를 만들었고 추상클래스로 선언하고 세세한 기믹은 Action을 상속받는 방식으로 구현하기로 정했다. 그런데 Action에 관해서 생성은 어떻게 할지, 초기화나 실행, 소멸 등의 관리는 어떻..

부트캠프 2023.11.01