1 ) 왼쪽마우스를 누르면 총알을 발사한다고 가정하고,
상대방의 HP를 깎아보자 !! 그리고 상대방은 HP 회복 스킬을 사용할 수 있다.
맨처음에 생각한 로직은 다음과 같았다.
1. 총알이 30발 이하로 떨어지면 더이상 쏠 수 없다.
2. 총알을 맞으면(마우스를 좌클릭하면) player1은 데미지를 입는다
3. player1의 hp의 하한선은 0, 상한선은 100이다.
4. 체력이 0 이하로 내려가면 플레이어의 체력을 확인하고 , 출력한다.
5. 체력이 100이상으로 올라갈 수 없다.
6. damage는 3으로 지정한다.




마지막 사진에서
원래는 더하기로 힐링 스킬을 구현하려고 했으나, 내가 아는 스킬은 %단위로 채워주는 스킬이 대부분이였다.
따라서 %단위의 스킬을 구현하려고 한다 !
하지만 뜻대로 잘 되지 않았다 문제점이 몇가지 있었는데
1. %단위로 올리려면 소숫점 계산을 하여야하는데, player hp 는 정수였다.
- 그래서 max Player Hp에 0.7을 곱하기 위해 형변환을 실행하였다.

위의 사진에서 보는 것처럼 player1 Max Hp(정수) 는 형변환을 통해 flaot 값을 가진것을 알 수 있다.
2. player Hp은 최대 Hp에서 힐 스킬을 사용하면 더이상 피가 차지 않아야하며,
만일 힐스킬을 사용하고 난 후 Player Hp가 100을 초과한다면 player Hp를 100으로 설정하여야한다.

따라서 위의 사진과 같은 로직을 이용해, 2번 문제를 해결할 수 있었다.
2 ) While문을 사용해 구구단 출력
1. 가장 먼저 궁금했던 것은 블루프린트의 While의 로직!!

1번 문제를 해결하기 위해, 공식 문서를 찾아본 결과 While문은 c언어의 While문과 로직이 같음을 알게 되었다.
c언어에서의 do While 문이 생각나서 찾아본것이 도움이 되었다.
내가 생각하는 반복문은 차원의 개념과 비슷하다고 생각한다.
그 이유는 다음과 같은데
시간복잡도를 생각하지 않고, 평균적으로 몇개를 구현해야하는가? 라고 생각해보면
특별한 로직이 없는 이상은 구하고자하는 변수의 차원과 같다고 생각한다.
예를들어 생각해보면 구구단의 x * y 를 구현하고자 하는데 있어서
x는 0~9의 값이고 , y도 0~9의 값이다.
하지만 그 수가 늘어난다면 결국 x,y는 무한에 가까워질것이다

다음과 같이 무수한 x들이 수없이 쌓여나갈때 y의 값은 위의 사진과 같을것이다.
결국 쌓여나간 값들은 평면을 만들어낼것이다.

따라서 맨위의 사진과 같이 2중 While 문을 사용하였다
하지만 나는 이 시간복잡도를 줄이기 위해 결국 특별한 로직을 사용해야 한다는것을 팀원의 발표로 인해 배우게 되었고,
더 나아가서 시간복잡도를 줄일 방법에 대해 공부를 해야겠다.
4) 가위바위보 게임 만들기.
가위바위보 게임을 만들려고 생각을 하다. 내가 가진 악습관이 튀어나왔다.
타이머를 설정해보고싶은데, 어차피 수업에서 의도하는 방향은 타이머를 설정하는것이 아닐텐데..
대충 타이머 없이 만들까..? 라는 생각이 들었다.
하지만 과거의 실수를 더이상 반복해서는 안된다라는 생각에
타이머를 사용한 가위바위보 게임을 만들고자 한다.
위바위보 게임을 만들려고 하는데 , 내가 가진 지식으로 해결할 수 없는 문제가 몇가지 있었다.
1. 랜덤값을 생성해야 한다
2. 타이머를 어떻게 설정할 것인가?
3. 유저가 입력하면 타이머를 멈추게 해야한다
1번문제는 검색을 통해 의외로 쉽게 풀어냈다.

Random Integer in Range 함수를 통해 최소 1부터 최대 3까지의 정수 값을 랜덤으로 뽑아내,
Switch on Int 함수를 통해 INT->Egame 으로 형변환을 한 모습이다.
Enum형인 Egame변수에 컴퓨터의 가위, 바위, 보 상태를 Set하였다.
// 여기서 Egame은 내가 만든 커스텀변수로, Enum형 변수이다.
하지만 2번 문제에서 부터 난관에 봉착했다
먼저, SetTimerByEvent라는 노드를 검색을 통해 찾을 수 있었으나..해당 노드를 어떻게 활용해야 하는지,
그리고 timer을 어떻게 설정할 수 있을지를 몰랐기 때문에 계속하여 검색을 하였다.
또, 15초가 지나면 게임 오버 출력을 하고, 게임이 종료되는 이 과정이
사용자가 입력을 하는 도중에도 게임 오버 출력이 되는 것이였다.
해결 방법은 다음과 같다!

해당 노드에서 timer의 지속값을 이용하려면 ! 자료형을 타이머핸들 구조체로 바꿔야만 지속이 가능하였다.
가장 먼저 커스텀 이벤트를 만들어서 15초가 지나면 Time Over를 출력하는 모습이고,
해당 타이머의 남은 값을 Timer변수에 담아준다.
// Timer는 타이머핸들 구조체이며
Timer변수를 통해 남은 시간을 저장하는 기능을 만들었다.
문제는.. 끝난줄 알았던 프로젝트에서 계속하여 원하는 값이 안나오면서..지금부터 시작이였다.
3번문제에서 엄청난 시간이 들어갔다.
내가 원래 사용한 함수는 clear and Invalidate Timer by Handle이라는 함수였는데,
이 함수를 사용해, 남은 타이머의 시간을 제거하려고 했는데 이 함수를 사용하면 유저한테 key입력을 받아도
뒤의 로직이 더이상 진행되지 않았다. 그래서 인터넷 검색을 통해 다음과 같은 사실을 알 수 있었다.
가장먼저 clear and Invalidate Timer by Handle라는 노드는 !! timer를 리셋시키는 것이 아니라
더이상 사용하지 못하게 timer를 킬해버리는 것이였다..

따라서 다음의 과정을 해결하기 위해 Pause Timer by Handle이라는 노드를 통해 해결할 수 있었다.
해당 노드는 Timer의 시간을 일시정지 시키는 기능을 하는 노드로 ,
해당 노드를 활용해 유저에게 입력을 받으면 시간을 일시정지 시키고, 가위바위보 승부를 낼 수 있게 만들었고
또, F키를 누르면 게임이 시작함과 동시에 Timer의 값을 다시 초기값으로 리셋시켰다.
2번문제를 해결한 사진은 다음과 같다!!

아 ! 여기서 GetTimer Remaining Time by Handle 함수는 Timer의 남은 시간을 출력하기 위해 만든 함수이고,
Return값이 Float이기 때문에 String으로 형변환을 해주었다.
타이머 관련 참고자료 )




마지막으로 함수 전체의 로직을 올리고 오늘의 TIL은 마무리 하겠다!
4번의 전체 로직 :



블루프린트 타이머함수 출처 :
[UE5] Set Timer(By event/ By Function Name), Clear and Invalidate Timer by Handle 노드 설명, 활용
'TIL' 카테고리의 다른 글
2024/12/26 TIL : 가상함수와 메모리할당 (0) | 2024.12.26 |
---|---|
2024/12/24 TIL : 생성자 (1) | 2024.12.24 |
2024 /12/23 TIL : c++ 클래스 문법 (0) | 2024.12.23 |
2024/12/17 TIL : Unreal과 친해지기 (0) | 2024.12.17 |
2024/12/16 TIL : 나만의용어 정리 (3) | 2024.12.16 |