안녕하세요!
오전 Unreal Blueprint 강의에서 적 AI의 플레이어 추적 기능과 폭발 기능, 플레이어 피해 기능을 구현하였습니다.
바로 시작하겠습니다.


우선 Fab에서 적당한 몬스터 에셋을 다운로드 받습니다.
그리고 Blueprints 폴더 안에 AI 폴더를 생성해주고 마우스 우클릭 후, Blueprint Class에서 Character를 선택해서 파일을 하나 만들어 이름을 BP_ANT로 설정 했습니다.





BP_ANT로 들어와서 Components 창에서 Add를 눌러 플레이어 인식 범위와 폭발 작동 범위가 될 Sphere Collision 두 개를 추가 해준 후, 이름을 인식 범위 Collision은 Sphere로 두었고 폭발 작동 범위 Collision은 ExplosionSphere로 설정하였습니다.
그리고 가장 위에 Capsule Component의 Details 창으로 가서 Collision Presets을 Custom으로 바꿔준 후, 밑에 체크 박스를 모두 Block으로 설정 해주었습니다.
Mesh (CharacterMesh0)의 Details로 이동해서 Skeletal Mesh Asset을 받아온 몬스터 에셋의 Skeletal Mesh로 설정 해줍니다.
Sphere와 ExplosionSphere도 Details로 이동해서 반지름 값을 설정하는 Sphere Radius 부분을 각각 600.0과 110.0으로 설정 해줍니다.
이렇게 기본적인 준비는 끝났습니다.

이제 플레이어가 인식 범위 안에 들어오면 따라오는 기능을 구현하기 위해 Components 창에서 Sphere를 마우스 우클릭하여 Add Event로 On Component Begin Overlap (Sphere)를 BP_ANT의 Blueprint에 생성합니다.
Sphere Collision에 다른 물체가 인식이 되면 Cast To BP_Character를 통해 BP_Character인지 확인하고 맞을 경우, AI MoveTo 노드를 통해 해당 액터(Actor) 즉, 몬스터가 BP_Character를 향해 이동하도록 설정해줍니다.
다음은 공격입니다.

Sphere와 마찬가지로 ExplosionSphere를 마우스 우클릭하고 Add Event를 통해 Blueprint에 On Component Begin Overlap (ExplosionSphere) 노드를 생성하고 Cast To BP_Character를 통해 BP_Character의 접촉을 감지하면 Apply Damage 노드를 통해 플레이어 캐릭터에 대미지를 줍니다.
대미지 수치는 Apply Damage 노드의 Base Damage에서 설정이 가능하고 현재 구현 중인 공격 기능은 몬스터가 자폭하는 공격이기 때문에 뒤에는 지난 번에 MuzzleFlash와 바닥에 총알이 박히는 효과를 구현 했던 것과 같이 Spawn Emitter at Location으로 효과를 실행 시켜줍니다.
Spawn Emitter at Location의 Location에는 Get Actor Location 노드로 해당 액터(Actor)의 위치를 넣어주고 소리도 똑같이 구현 해줍니다.
마지막으로 폭발하면서 몬스터가 사라질 수 있게 Destroy Actor 노드를 추가해 연결해주면 끝납니다.
이제 플레이어가 대미지를 입고 현재 플레이어의 HP가 화면에 실시간으로 업데이트 될 수 있도록 구현 하겠습니다.

Apply Damage 노드 처럼 Event AnyDamage 노드를 이용해 쉽게 피해 기능을 구현할 수 있습니다.
Event AnyDamage 노드를 통해 Damage 를 인식하면 처음 만들어 두었던 Health 변수의 값에서 Damage 값을 빼주고 화면에 출력 해주기 위해, 현재 체력량(Health) / 최대 체력량(Max Health) 을 계산해 Set Percent 노드로 Player HUD의 HP에 값을 넣어줍니다.
이후 피격 소리를 재생하는데, 피격 동시에 재생하니까 몬스터 폭발음에 묻혀버려서 0.2초 Delay를 설정하였습니다.
같은 방식으로 이번에는 플레이어가 몬스터를 공격하면 몬스터가 대미지를 입고 체력이 0이되면 사라지도록 구현하였습니다.


먼저 BP_Character의 Blueprint에서 총 발사 기능을 보면 Line Trace로 인식한 액터(Actor)가 무엇인지 Break Hit Result 노드를 통해 가져와서 Cast To BP_ANT 노드로 BP_ANT 인지 확인합니다.
만약 BP_ANT가 맞다면 Apply Damage 노드를 실행하고 아닐 경우 대미지 기능을 수행하지 않고 다음으로 넘어갑니다.
그리고 BP_ANT로 와서 Event AnyDamage 노드를 통해 대미지 입력을 인식하면 Set Monster Current HP 노드를 통해 현재 체력을 업데이트 해줍니다.
저는 기능이 잘 작동하고 있는지 확인하기 위해 업데이트 된 몬스터의 현재 체력을 화면에 출력하였고 이후 몬스터의 현재 체력이 0보다 작거나 같은지 확인 후, 만약 0 보다 작거나 같은 경우, Destroy Actor를 통해 없어지도록 구현하였습니다.
이렇게 오늘의 Unreal Blueprint 강의가 끝났습니다!
오후의 C언어 기초 강의에서는 드디어.. 포인터에 대해 배웠습니다!
포인터에 대해 정리하기 전에 함수(Function)에 대해 먼저 정리하고 넘어가겠습니다.
바로 내용 정리 시작하겠습니다.
함수(Function)
함수는 흔히 특정 기능을 수행하기 위해 설계된 코드의 집합 또는 일부 작업을 수행하는 코드 블록이라고 설명됩니다.
즉, 코드들이 모여 기능을 수행하는 단위로 묶어 재사용 할 수 있도록 선언한 것이라고 설명할 수도 있을 것 같습니다.
기본 형태는 자료형 함수명(매개변수) { 내용 } 의 형태를 갖추고 사용할 때는 함수명(인자); 의 형태로 사용할 수 있습니다.
**함수는 자료형에 맞는 반환 값을 가지므로 자료형을 정해주었다면 꼭 return 값; 을 통해 값을 반환해주어야 합니다. 따로 반환 값을 가지지 않을 때는 자료형을 void로 지정 해준다면 반환하지 않을 수 있습니다.**
**함수가 선언될 때 입력되는 값들을 매개변수(Parameter)라고 하며, 함수를 호출할 때 입력되는 값들을 인자(Argument)라고 합니다.**
ex)
int multiply(int x, int y)
{
printf("함수 진입\n");
int result = x * y;
printf ("함수 종료\n");
return result;
}
int main(void)
{
printf("main함수 진입\n");
int val = multiply(3, 4);
printf("결과: %d\n", val);
printf("main함수 종료\n");
return 0;
}
실행 결과 값
함수 진입
함수 종료
main함수 진입
결과: 12
main함수 종료
위의 예시 처럼 함수를 선언 해두면 필요할 때 호출하여 인자 값을 넣는 것으로 기능을 재사용 할 수 있습니다.
이전에 작성한 글에 함수를 정리한 내용이 있어 URL을 첨부 하겠습니다.
https://blog.naver.com/hiroaki9902/223719070918
C++ 프로그래밍 (2일차)
C++ 프로그래밍 (1일차)에서 넘어갔던 부분을 추가적으로 말씀드리면서 C++ 프로그래밍 (2일차)를 시작하...
blog.naver.com
전역 변수(Global Variable), 지역 변수(Local Variable), 정적 변수(Static Variable)
전역 변수는 어디서든 접근이 가능한 변수이고 프로그램 종료까지 메모리를 할당 받는 변수 입니다.
지역 변수는 함수 등의 특정 구역 안에서만 접근이 가능하고 해당 함수가 종료되면 같이 할당이 해제 됩니다.
정적 변수는 지역 변수와 같이 특정 구역 안에서만 접근이 가능하지만 프로그램 종료까지 메모리를 할당 받는 변수 입니다.
ex)
int global = 100;
void demo(void)
{
int local = 10;
static int count = 0;
count++;
printf("%d\n", count);
}
int main(void)
{
printf("%d\n", global);
// printf("%d\n", local);
demo();
demo();
demo();
return 0;
}
실행 결과 값
100
1
2
3
전역 변수인 global은 문제 없이 출력이 되고 지역 변수인 local은 밖에서 호출할 수 없기 때문에 만약 printf("%d\n", local);을 실행하면 오류가 나올 것입니다.
마지막으로 정적 변수 count는 함수가 실행되고 종료 됨을 3번 반복하였지만 값은 사라지지 않아 demo함수를 호출할 때마다 값이 증가하고 있는 것을 확인할 수 있습니다.
재귀 함수(Recursion)
함수 안에서 자기 자신을 호출하는 함수를 재귀함수라고 합니다.
**재귀함수는 꼭 종료 조건을 만들여야 합니다. 만들지 않을 경우, 무한루프에 빠져 메모리를 모두 사용하는 문제를 이르킬 수 있습니다.**
전역 변수, 지역 변수, 정적 변수에 대한 내용을 적어놓은 글이 있어 URL을 첨부 하겠습니다.
https://blog.naver.com/hiroaki9902/223721588594
C++ 프로그래밍 (4일차)
변수(Variable)의 종류 변수(Variable)란 C++ 프로그래밍 (1일차)에서 말씀드렸듯이 하나의 데이터를 저...
blog.naver.com
포인터(Pointer)
메모리 주소를 저장하는 변수 입니다.
일반적인 변수가 '값'을 저장할 때, 포인터 변수는 값이 저장된 '주소'를 저장합니다.
포인터를 사용하는 이유는
1. 함수에서 원본 값 수정 - 매개변수로 주소를 받아오면 값을 받아왔을 때 처럼 사용하고 사라지는 것이 아닌 직접 원본 값을 변경해 줄 수 있습니다.
2. 효율적인 데이터 전달 - 큰 구조체를 통째로 복사해서 이동하는 것이 아닌 주소만 전달할 수 있어 연산 속도나 메모리를 효율적으로 관리 할 수 있습니다.
3. 동적 메모리 관리 - 2번과 연결되는 이유로 메모리를 런타임 중에 할당하고 해제하여 메모리를 효율적으로 사용할 수 있습니다.
4. 배열, 문자열 처리 - 배열과 문자열은 본질적으로 포인터와 연결되어있어 배열과 문자열 사용에 필수적 입니다.
포인터 변수는 선언할 때, 자료형 *포인터변수명 = &변수명; 으로 선언할 수 있고 &는 주소를 가져오겠다는 의미를 갖습니다.
호출할 때는 포인터변수명 으로 저장된 주소 값을 호출할 수 있고 *포인터변수명 으로 포인터 변수에 저장된 주소의 메모리 안에 있는 값을 호출할 수 있습니다.
사실 어떻게 설명을 해도 어려운 포인터 이지만...
변수명 앞에 &를 붙이면 그 변수의 값이 들어가있는 메모리의 주소를 가져올 수 있습니다.
포인터를 선언할 때는 자료형 *변수명 = 값;으로 선언 합니다.
포인터를 호출할 때 변수명만 쓰면 주소 값이 호출되고 *변수명 으로 호출하면 주소에 해당하는 메모리 안의 값이 호출됩니다.
같은 말 같지만 조금 더 정리를 해보았습니다...
ex)
int a = 10;
int *p = &a;
printf("a의 값: %d\n", a);
printf("a의 주소 값: %p\n", &a);
printf("p에 저장된 주소 값: %p\n", p);
printf("p에 저장된 주소 안의 값: %d\n", *p);
실행 결과 값
a의 값: 10
a의 주소 값: 0x7ffd5e8a3b
p에 저장된 주소 값: 0x7ffd5e8a3b
p에 저장된 주소 안의 값: 10
이렇게 출력되는 것을 알 수 있습니다.
오늘은 이렇게 포인터를 간단하게 알아보는 시간을 가졌습니다.
내일은 조금 더 심도있게 포인터 변수에 대해 학습할 것 같아 벌써 긴장이 됩니다...
오늘도 고생하셨습니다!!
내일도 힘내서 열심히 공부하겠습니다!
'[내일배움캠프] 본 과정 학습내용' 카테고리의 다른 글
| [내배캠] 5일차 Unreal Blueprint 내용 정리(2) 및 7일차 C++ 학습 내용 정리 (0) | 2026.07.06 |
|---|---|
| [내배캠] 5일차 Unreal Blueprint 내용 정리(1) (0) | 2026.07.03 |
| [내배캠] 3일차 Unreal Blueprint로 총 기능 구현과 C언어 기초 (0) | 2026.06.30 |
| [내배캠] 2일차 Unreal Blueprint로 캐릭터 움직임 구현과 C 언어 기초 (0) | 2026.06.29 |
| [내배캠] 1일차 학습 내용 정리 (0) | 2026.06.26 |