2026-02-27(금)

조범근·2026년 2월 27일

TIL

목록 보기
5/25

오늘 구현한 것

1. 굴러떨어지는 공

구현해야하는 것

- 돌을 떨어트린다
- 굴러간다
- 떨어진다
- 다시 제자리로 온다(초기화)

작동 방식
시작하는 좌표를 입력 받는다 -> 떨어진다 -> 몇초 후에 자리로 돌아온다.

조건
-A.조건 리셋: KillZone에 닿는 순간 Reset 함수를 즉시 실행한다.(속도도 초기화)
-B.강제 리셋: 게임 시작 후 10초가 지났는데도 돌이 아직 필드에 있다면 Reset 함수를 실행한다.
-C.물리 충돌: 플레이어와 충돌시 플레이어가 튕겨져 나간다.

구현


A. 바닥에 KillZone 구역을 넓게 깔아 KillZone에 Overlap되면 Set simulate Physics로 멈추고 다시 움직이게 만들어 떨어지는 속도를 유지하지않고 초기화되게 만듦.
초기화 된 돌은 Start Location 위치로 텔레포트 되게 했음.

B. 만약 중간에 돌이 끼거나 다른곳에 떨어져서 KillZone에 닿지않아 멈춰있게 되면 RetriggerableDelay에 10초를 넣어 KillZone에 Overlap 신호가 10초동안 오지 않으면 자동으로 초기화

C. On Component Hit을 사용했을때 Character가 멈추고 Ball이 달려올때 튕겨져 나가지않아서 Overlap도 보고 계속 시간을 낭비했으나 해결했다.
이건 후술할 내용에 있음.

2. Button/Movement actor

구현해야하는것

-버튼을 누른다.(토글형식 눌러두면 계쏙 움직임)
-발판이 움직인다.
-최고/저점에서 3초동안 멈춘다.
-다시 움직인다.

작동 방식
버튼을 누른다 -> 움직인다 -> 최고점에서 3초동안 멈춘다 -> 움직인다 -> 최저점에서 3초동안 멈춘다.

조건
-A.토글 버튼: 버튼을 누르면 발판이 작동함.
-B.움직이는 발판: 발판이 정해진 거리만큼 움직인다.
-C.멈추는 발판: 최고/저점에서 3초동안 멈춘다.

구현

B만 구현했고 A,C는 내일 예정

궁금했던 점 & 해결

BluePrint Q&A

Q1. 왜 Velocity에 곱하기를 하는거임?? 다음 더하기는 또 뭐고??

A1.

Velocity(속력) x Tick(시간) + Get Actor Location(현재 위치)를 더해서 움직여주는 메커니즘이여서 그럼

Q2. Movement actor를 Blueprint에서 구현할때 StartLocation보다 높아야 움직이게 만드는 방법이 뭔가요??

해설
Get Actor Loation(현재 위치)와 Start Location(시작 위치)의 Distance(거리)차이가 Move Distance(100) 보다 높으면 Negate Velocity가 작동돼서 반대로 움직이는데 문제는 시작위치에서 밑으로 가도 Distance는 -가 없기 때문에 시작위치에서 -100 좌표만큼 즉 -100 ~ 100으로 움직인다는 것임

A2. 그래서 Actor Location에서 Start Location을 Subtract(-) 해준 값이 0보다 작거나 아까 설정해둔 값이 100보다 커지면 Velocity 값이 반대가 되도록 해줌.

Q3. Collsion의 On Hit Event를 사용할때 Collsion이 오면 튕겨져 나가는 로직을 구현하고 싶은데 Character가 움직이면 튕겨져 나가는데 가만히 있으면 안 튕겨져나가요...

A3. 다가오는 Collsion과 Character의 Collision - Simulation Generates Hiet Events를 True로 바꿔주면 됨

개념 복기

C

PrintOneStar()함수와 Add()함수

// Main.c

#include <stdio.h>

void PrintOneStar(int num)
{
	int i;
	for (i = 0; i < num; ++i)
	{
		printf("*");
	}
}

int Add(int num1,int num2)
{

	return num1 + num2;
}

int main(void)
{
	int a, b;

	scanf_s("%d %d", &a, &b);
	printf("%d", Add(a, b));
}

PrintOneStar() 함수
별 하나를 출력하는 함수였지만 숫자를 입력받아서 원하는 만큼 별이 나오는 함수로 바꿨음

Add()함수
두 수를 전달받아 합을 출력하는 함수인데 void Add로 함수로 만들시 return 불가능 자료형으로 만들어야됨

Q. 그럼 void말고 다 int로 만들면 되는거아님??

-맞음 근데 void로 함수를 만들면 값을 입력할 필요없는 ()함수라는걸 표현해서 로마에 왔으면 로마법을 따르는게 맞음

스택 프레임


전에 C++보다가 자꾸 최적화가 중요하다 최적화가 중요하다 이러길래 화나서 힙/스택을 공부했다.
중요한건 후입 선출이라는 것, 함수가 끝나면 스택 메모리는 사라진다는 것
이 메모리 레이아웃이 RAM이 라는것 일단 이정도 아는 것 같음

지역변수(Local Variable)와 전역 변수(Global Variable)

정적 지역 변수

// Main.c

#include <stdio.h>

static int A;

int main(void)
{

	return 0;
}
// MyMath.c

#include "Main.c"

void PrintA(void)
{
	printf("%d", A); // 다른 파일에 정적 전역 변수로 선언된 A이므로, 접근 불가.

	return;
}

함수 안에 static int SCokeCount = 0;을 선언하면 함수가 끝난 후에도 값은 남아있음.

0개의 댓글