들어가며 오랜만에 글을 적는다. 오늘은 셀 셰이딩(툰 셰이딩)에 대한 글로, 포스트 프로세싱을 통해 카툰 스타일을 구현하는 방법에 대해서 이야기해보고자 한다. 사실 기획에 대해 이야기하고 싶은 것도 많지만, 아직은 조금 더 고민할 시간이 필요하다고 생각했다. 최근에 단기 팀 프로젝트를 하고 있는데, 그 과정에서 나의 현실적인 기획을 돌아보게 됐다. 이 과정에서 작년 9월에 정의한 나의 이상적인 기획과 현실적인 기획 사이의 괴리, 그리고 그 괴리를 매우기 위한 방법에 대해 고민하고 있는데, 이것들에 대해서는 작년과 마찬가지로 조금 더 깊게 고민한 후 정리할 필요가 있어 보였다. 그래서 오늘은 기획이 아닌 기술, 그중에서도 셀 셰이딩을 구현해 본 과정에 대해 글을 쓰겠다. 셀 셰..
⚠ 주의! '들어가며' 내용이 너무 삼천포로 빠짐! 하지만 적고 싶음! 한 줄로 정리하면 '액션 연출을 연구해 보려는데 모델링이 필요했고, 합법인 원신을 선택했다.'로 요약할 수 있다. 바로 본론으로 들어가고 싶다면 '들어가며'는 스킵하도록 하자. 들어가며 최근 종강 이후에 진행할 프로젝트로 아카이브를 준비하고 있다. 그리고, 그 과정에서 아카이브의 첫 번째 주제로 이전에 하다 만 관능성(官能性), 그중에서도 속도감에 대한 연구를 진행하려고 한다. 속도감이라는 주제를 첫 번째로 선택한 이유는 (이하 퍼디)의 애니메이션 팀에서 작성한 개발자 노트가 인상 깊었기 때문인데 이 때문에 가능하면 퍼디 내 캐릭터, 그중에서도 버니를 모델로 연구를 진행해보고 싶었다. 퍼스트 디센던트 tfd.nexon..
문제 상황 저격 총에서 특정 트리거가 입력되면 scope UI를 노출하는 기능을 구현하고 싶었다. 다만, 일반적인 PC 환경과는 달리 VR 환경에서는 양안 렌즈를 통해 유저가 입체적으로 오브젝트를 인지하도록 만들기에 2D UI를 구성하는데 어려움이 있었다. 문제 해결 과정과 테스트 사실 처음에는 그냥 무조건 2D로 UI를 구현하려고 했다. 내 머릿속의 3D UI는 world 내의 다른 오브젝트에 의해 언제든 가려질 수 있는 것이었고, 그렇기에 아래와 같은 목표를 달성하기 위해서는 무조건 Unity 내 canvas의 screen space로 UI를 구성한 것처럼 world에서 분리된 2D UI를 사용해야 된다고 생각했다. 화면의 최상단에 렌더링 돼야 한다.다른 오브젝트와 충돌해서는 안 된..
※ 'Today, I Learned'에서 하나의 개념을 온전히 다루려고 하다 보니 기록하기가 힘들다. 앞으로는 하나의 개념을 설명하는 게 아니라, 하나의 이슈를 해결하는 걸 기준으로 기록하려고 한다. 문제 상황 레이저 무기를 구현하고 싶었다. 단순히 피격 대상 감지 후 데미지를 부여하는 것만이라면 Linetrace와 Apply Damage 만으로도 가능했겠지만, 레이저 효과를 화면에 표현하기 위해서는 나이아가라 시스템에 대해 알 필요가 있었다. 언리얼 공식 문서의 간단한 레이저 예제를 찾아보고 이를 구현하던 도중에 레이저가 Linetrace Impact Point까지 그려지게 하기 위해선 해당 location의 vector 값을 외부로부터 읽어올 필요가 있었다. 이에 나이아가라 시스템에서 외부 데이터를 ..
문제 상황 미사일 런처를 구현하는 중, 플레이어의 조준점을 따라 장전 중인 미사일이 회전하고, 미사일을 발사하는 경우에도 조준점을 향해 날아가도록 구현하고 싶었다. 이에 대해 고민하던 중, Linetrace로 hit point를 검출한 뒤 미사일이 해당 location을 향해 회전하도록 구현하면 될 것 같아 시도해봤다. 기능 이해와 테스트 Linetrace는 출발점부터 도착점까지 보이지 않는 광선을 발사해서 오브젝트를 검출하는 기능이다. 블루프린트에서 활용할 수 있는 Linetrace의 방식은 아래와 같다. (Single) Line Trace By Channel : 특정 Trace Channel에 대응하는 최초로 검출된 오브젝트를 반환한다. (Single) Line Trace For Objects : 특..
문제 상황 미사일 런처를 구현하는 중, 조준 중일 때는 미사일이 플레이어의 에임을 따라오게 구현하고 싶었다. 그래서, 미사일을 스폰하고 정렬해 플레이어의 에임을 따라오게 하는 것까지는 성공했는데, 무거운 느낌을 주기 위해서 애니메이션을 조금 느리게, 플레이어의 움직임보다 살짝 늦게 따라오도록 구현하고 싶었다. 이를 위해 기능을 찾던 중, Timeline 노드가 좋아 보여서 Lerp 노드와 함께 써보기로 결정했다. 기능 이해와 테스트 내가 느낀 Timeline 노드는 그냥 선형 보간(Linear Interpolation)처리를 위한 Lerp 노드와 크게 다를 바 없어 보였다. 다만, 한 가지 차이가 있다고 하면 보간의 대상(float, vector, color, event 등등..)과 보간 방식을 더 자유..
문제 상황 기관총을 구현하는 과정에서 트리거가 되는 키를 N초 이상 누르고 있을 때 총탄이 발사되게 하고 싶은데 Enhanced Input Action 노드의 몇몇 핀이 같은 액션에 실행된다. 기능 이해와 테스트 나는 특정 키를 눌렀을 때 기관총이 예열을 시작하고, N₁초가 지났을 때 발사를 시작하며, 발사를 마친 기관총은 N₂초가 지났을 때 다시 발사를 할 수 있게 구현하고 싶었다. 그러나, 나는 Input Action과 Input Context Mapping, Enhanced Input Action 노드를 잘 모르는 상태로 기능을 구현하려고 했다. 한 번 이것들이 어떤 동작을 하는지 이해해 보자. 가장 먼저 Input Action이다. Input Action은 플레이어의 특정 입력 액션을 트리거하는 ..
문제 상황 아직 프로토타이핑에 불과하지만, 총탄이 사실적이지 않다는 사실이 신경 쓰여서 약간이나마 수정해보려고 했다. 이에 현재 언리얼 엔진에서 기본적으로 제공하는 Projectile Actor에 부착돼 있는 Projectile Movement Component에 대해 알아봤다. 기능 이해와 테스트 엔진에서 제공하는 Projectile Movement Component는 물리적으로 동작하는 투사체를 다루는 component로 투사체의 속도와 방향, 중력에 의해 받는 영향, 탄성, 마찰, 유도 등을 설정할 수 있는 component다. 가장 먼저 Initial Speed와 Max Speed를 살펴봤다. 언뜻보면 투사체의 속도를 관리하는 값으로 보이는 데 이 둘의 초기값은 0이었으나 투사체는 방향과 속도를 ..