ToyProject

    [언리얼엔진 5] 12. Dynamic Lighting PaperZD + Normal Map

    이 프로젝트는 PaperZD 캐릭터를 사용하는 만큼 라이팅이 상당히 까다롭다. png 파일로 가져와 플립북을 만들기에 이에 맞는 normal map도 생성되지 않기 때문이다. 언리얼엔진을 사용하는 만큼 다이나믹한 라이팅을 구현하고 싶었다. 실시간으로 변화하는 빛에 캐릭터들의 모습이 바뀌면 얼마나 아름다울까? 그것도 2D 픽셀 캐릭터인데도! 일단 각 스프라이트에 대한 normal map이 필요하다. 노멀맵에 대한 설명은 따로 다루겠다. 첫번째 고난이다. png를 노말맵으로 바꾸어주는 사이트는 구글에서 흔히 찾아볼 수 있었다. 하지만 나는 스프라이트만을 바꾸고 싶은데 뒷 배경까지 처리해버리는 것이다. 결국 aseprite라는 프로그램의 힘을 빌려야 했다. Aseprite Aseprite는 픽셀아트 툴로서 픽..

    [언리얼엔진 5] 11. Lightning Pet

    단순한 공격 구현은 이정도로 마치고 파티클을 이용해 화려한 공격을 구현해보겠다. 번개를 떨어뜨리는 공격을 만들기 위해 펫 클래스를 만들었다. 일단 적을 감지해야 하니 Component Overlap Actor함수로 적을 탐지하고 공격가능 대상수 만큼 Do N노드를 사용하였다. 일단 단일대상에게 데미지를 가하고 싶기 떄문에 파티클에 따로 콜리전을 두지 않았다. 가만히 있으면 단조로우니 몇초마다 플레이어를 따라가게 만들었다. 구현방법은 단순하나 여러 스프라이트를 추출하고 애니메이션 소스로 만드는 과정이 생각보다 오래걸려서 문제이다. 물론 익숙해지고 있기에 점점 빨라졌지만 엄청 많은 펫을 구현하려면 오래걸릴 것같다. 개강하기전 끝내보려했는데 장기프로젝트로 진행될거 같다...

    [언리얼엔진 5] 10. Maximum number of attack + Error Handling

    플레이어와 펫의 공격기능은 얼추 완성이 되가고 있다. 그런데 수 많은 아주 많은 적이 몰려와도 화살 몇방이면 모두 죽어버리는 것이다. 여기서 최대 공격가능 대상 수를 만들어 구현해야겠다는 생각을 한다. 구현방법은 매우 쉬웠다. Do N노드는 실행이 파라미터N만큼만 진행되게 하는 기능을 가진다. 그렇기에 공격에 닿은 적이 담긴 배열을 N번만 데미지를 주면 되는 것이다. (가장 가까운 적을 공격하는 기능은 이후에) 하지만 여기서 큰 문제가 생겨버렸다. 무슨 이유인지 Num of Bow Attack을 2로 설정해도 하나의 적만을 공격할 수 있는 것이다. 수 많은 실행 끝에 이유를 찾을 수 있었다. 역시 원인은 바로 옆에 있었다. Pet 클래스를 구현하면서 펫이 자유롭게 이동하는데 펫의 넓은 Detected c..

    [언리얼엔진 5] 9. Pet Class

    혼자 싸우면 외롭다. 그렇기에 플레이어에게 이로운 효과를 주거나 적을 함께 공격하는 펫을 구현하기로 하였다. 이때 펫의 움직임을 많이 고민하였다. 적을 따라가 공격을 할지, 플레이어를 따라가며 공격을 할지 말이다. 우선 적을 따라가 공격을 하게 구현을 해보았다. Set timer by Event 함수로 적을 따라가게 구현하였다. 틱이벤트로 따라가게 만들면 부자연스러운 이동이 계속되기 때문이다. Pet 클래스도 이전과 같이 PaperZD Character 부모클래스로 생성하였고 애니메이션 적용도 이전과 동일하게 진행했다. 처음과 다른 것은 State를 두었다는 것. Find Nearest Actor함수는 Origin에서 가장 가까운 파라미터의 배열속 액터를 리턴한다. 가장 가까운 적을 추적해서 공격해야 하..

    [언리얼엔진 5] 8. Particle and Collision Attack

    공격을 구현하긴 했으나 다양한 공격을 만들기 위해서는 파티클을 추가해야 했다. 다양한 파티클을 추가하면서 공격범위를 지정하는 것이 어려워지기 시작했다. 다양한 공격범위를 다루기 위해서는 박스 디버깅이 아닌 콜리전을 사용해야 했다. 공격 시 파티클이 생성되고 이 파티클의 콜리전에 들어온 Actor들에게 데미지를 준다면 이후 관리도 편해질 것이다. Spawn Actor from class 함수로 파티클을 생성했다. (파티클 액터를 미리 만들어줌) 이후 파티클 액터의 콜리전을 가져와 Component Overlap Actors로 범위 안에 들어온 액터를 감지한다. 이때 Actors to Ignore에 player를 넣어주어 자신에게 데미지를 주지 않게 한다. 이렇게 데미지 를 주는 시스템도 개선하였다. 이후 ..

    [언리얼엔진 5] 7. Current Player State + Error Handling

    이전 플레이어 스테이트를 따루 두지 않고 boolean으로 행동을 통제했다. 하지만 이렇게 진행하니 boolean타입을 난발하고 여러 문제가 발생하기 시작했다. 이상태에서 또 다른 행동을 추가한다면 큰 사고다.. 그렇기에 플레이어에게 현재 상태를 나타내는 변수를 생성해 이 변수로 행동을 통제하기로 하였다. Player state는 여러 현재 상태를 나타낼 수 있게 열거형(Enum)으로 생성하여 여러가지 State를 나타내었다. 계속 여러 행동을 추가할텐데 이제는 열거형변수에 추가만 하면 플레이어의 상태를 쉽게 나타낼 수 있게 되었다! 하지만 하나의 문제가 생겼다. 공격키를 연타하면 어느순간 플레이어가 멈추는 현상이 발생했다. 이때 구르기로 상황을 탈출할 수는 있었지만 불편하고 오류임이 확실하기에 원인을 ..

    [언리얼엔진 5] 6. FloatingDamage and Critical

    공격기능이 추가 되었으니 가한 데미지를 표기해주어야 한다. 화면에 보여주기 위해 Widget Blueprint를 이용한다. 데미지를 받은 액터에서 함수를 호출하고 싶기에 다음과 같이 구성해주었다. 고정된 텍스트만 띄우면 밋밋할 수 있으니 텍스트에도 간단한 애니메이션을 추가해주었다. 위젯을 만드는 겸 크리티컬 시스템도 만들기로 하였다. 플레이어에서 크리티컬 확률과 크리티컬 데미지를 조정할 수 있고 애님노티파이에 추가하였다. 순조로운 개발중 처음으로 문제가 발생하였다. 크리티컬이 발생하면 Damage Type Class로 Critical Type 오브젝트 레퍼런스를 넘겨주었다. 그렇기에 데미지를 받는 액터 Any Damage 이벤트의 Damage type 핀으로 ==을 사용하여 구별하려고 하였다. 하지만 크..