전체 글

전체 글

    #4 적 유닛 상단 체력바 구현

    적 유닛 체력바 구현 Player Character에 빠르게 접근하기 위한 함수 #include "Kismet/GameplayStatics.h" UGameplayStatics::GetPlayerCharacter(GetWorld(),0); Gameplay Statics 헤더 체력바를 나타나게 하는 코드를 블루프린트 계층에 넣어야 할지, C++에 구현해야 할지 고민했다. 결국 블루프린트에 넣는 것으로 결정했다. 이유는 다음과 같았다. UI와 관련한 코드는 바깥에 있어야 디자이너의 요구에 따라 빠르게 수정가능하다. 코드 수준에서 블루프린트 클래스를 만드는 것이 불안정하고 번거롭다. 그리고 체력바의 위치를 블루프린트에서 쉽게 바꿀 수 있도록 USceneComponent를 추가해 이 포지션에 체력바를 위치하도록 ..

    #3 적 캐릭터 기초 AI 설계 및 구현

    설계 어떤 Enemy AI가 좋은 것일까? 이것부터 고민을 시작했다. 여러 글을 찾아보다 아래 동영상을 접했다. https://youtu.be/9bbhJi0NBkk 굉장히 영감을 주는 동영상이었는데, 이번 프로젝트에 바로 적용하는 데에 문제가 있었다. 가장 큰 문제는 애니메이션이 별로 없다는 것이었다. 일단 간단한 AI를 구성하는 것에 목표를 두기로 했다. 현재 AI의 상태는 아래와 같았다. 그냥 일정 범위에 플레이어가 들어오면 쫓아가서 공격한다. 공격 범위에서 플레이어가 벗어나면 다시 쫓아간다. 이하 반복. AI가 단순한 만큼 이를 구성하는 Behavior Tree도 아주 단순하다. 내가 원하는 AI는 이렇게 공격적이서는 안된다. 적어도 미사일처럼 몸통박치기를 해서는 안되었다. 어느정도는 경계를 해야하..

    #2 새 프로젝트를 위한 기능 명세 작성

    Miro를 통해 어떤 기능을 구현할 지 명세를 작성했다. 먼저 게임의 기능을 크게 GameSystem, Monster, Item, Pickup으로 나누었다. 첫 버전에서는 Game System이 가장 큰 부분을 차지한다. 이번 스프린트에서 중심적으로 개발할 것들은 다른 색을 적용해 쉽게 종류를 판단할 수 있도록 설계했다.

    #1 AnimBlueprint와 AnimMontage Blend하기

    구현 내용 Enemy는 Player의 위치로 움직이고 일정 거리가 되면 공격 애니메이션(AnimMontage)을 플레이한다. 이슈 공격 애니메이션이 플레이 되었지만 (로그를 통해 확인함) 실제로 애니메이션이 바뀌지는 않았다. 마치 Locomotion이 실행되는 AnimBP가 AnimMontage와 Blend되지 않는 듯이. 해결 원인은 Blend가 되지 않는 것이 맞았다. 그렇다면 Blend해주는 것은 쉽다. AnimBP를 캐싱한 후 슬롯에다가 집어넣으면 된다. 이전에 동영상 강의를 들으면서 왜 애니메이션 포즈를 캐싱해두는지 이해가 안갔는데, 이번 기회에 헤매면서 확실히 이해할 수 있었다.

    Animation Blueprints

    Animation Blueprints Animation Blueprints는 스켈레탈 메쉬의 애니메이션을 제어하기 위해 존재한다. Animation Blueprints는 크게 두 개 그래프, 즉 EventGraph와 AnimGraph로 구성된다. EventGraph와 AnimGraph의 관계 Animation Blueprints와 가장 직접적인 관련이 있다고 할 수 있는 건 AnimGraph라고 할 수 있다. Animation Blueprint라는 것의 제1 목표는 이 프레임에 어떤 포즈를 취해야 하는지 계산하는 것이기 때문이다. AnimGraph에서 이러한 역할을 여러 애니메이션 노드를 통해 수행한다. 그렇다면 EventGraph는 왜 있는걸까? EventGraph는 AnimGraph의 계산과정에서 필..

    BlueprintCallable, BlueprintImplementableEvent, BlueprintNativeEvent

    UFUNCTION에 블루프린트와 관련한 세가지 옵션 - BlueprintCallable, BlueprintImplementableEvent, BlueprintNativeEvent -을 줄 수 있다. BlueprintCallable은 처음 보면 아 이걸 넣으면 블루프린트에 노드로 쓸 수 있는거구나 싶은데, BlueprintImplementableEvent, BlueprintNativeEvent은 단어만 보고는 바로 그 뜻을 알기가 쉽지 않다. 하지만 그 구분은 생각보다 명확한 차이가 있다. 언리얼 문서에서의 표현을 좀더 풀어서보면 다음과 같다. BlueprintCallable은 일종의 블랙박스를 만드는 것이다. 즉, BlueprintCallable이라는 말마따나 블루프린트 수준에서는 부를 수만 있고 작동 ..

    [python] 웹 크롤링으로 게시판 업데이트 확인하기 (1)

    계기 데스크탑을 사고 싶어서 핫딜을 알아보고 싶은데, 핫딜 게시판을 주기적으로 들르자니 너무 귀찮았다. RSS 느낌으로다가 게시판이 업데이트되면 terminal 수준에서 알려주는 어플리케이션을 만들면 편할 것 같았다. 언어는 가장 빠르게 구현할 수 있는 python으로 선택했다. 목표 특정 사이트의 게시물 리스트를 5분 간격으로 탐색하고 업데이트돤 내용만을 추려서 보여준다. 구현 먼저 웹 크롤링에 필요한 모듈을 다운로드한다. pip install requests, beautifulsoup4 requests => 서버에 웹페이지 내용을 요구할 수 있게 해준다. urlopen을 쓸 예정. beautifulsoup4 => requests를 통해 얻은 웹페이지 내용을 쓰기 좋게 다듬어준다. 해당 url을 url..

    [Ray Tracing in C] 2. 벡터

    레이트레이싱은 벡터 연산의 연속으로 이뤄질 것이다. 이 때의 벡터는 프로그래밍에서 1차원 배열이 아니라 수학/공학적인 개념으로 쉽게 말해 '방향과 크기'를 의미한다. 자세한 설명은 동영상 링크를 참조하자. (참고: 선형대수학을 위한 벡터란?) 먼저 벡터 struct를 헤더에 정의하자. 간단히 실수형 x,y,z만 가지고 있으면 된다. (이름은 최대한 짧게 지었다.) // vec.h typedef structs_v { doublex; doubley; doublez; }t_v; 이와 함께 연산들도 미리 정의해놓는다. 벡터의 기본 연산은 모두 쓸 것이다. 목록은 다음과 같다. v_init = 벡터 struct를 정의한다. v_mag = 벡터의 크기를 계산한다. v_norm = 벡터를 normalize(크기를 1..