언리얼에서 낮 밤 만들기 (+시간 시스템)
Coding/Unreal, C++

언리얼에서 낮 밤 만들기 (+시간 시스템)

결과물

0.2분에 하루씩 지나가게 했을 때 모습

1. 시간 시스템 만들기 (GameState)

시간 시스템은 두 개 변수가 필요하다. 하나는 하루의 길이, 다른 하나는 현재 게임 시간이다. 이 때, 현재 시간은 런타임(게임이 실행되고 있을 때)에 어디서든 쉽게 접근할 수 있어야 한다. 쉽게 접근하기 위해 해당 코드는 GameState에 구현하도록 한다. Create Blueprint를 하고 Parent Class를 GameStateBase로 한다. 그리고 안에 변수를 두 개 만든다.

MinPerDay(float) : 게임의 하루가 현실의 몇분인지
CurrentDateTime(DateTime) : 현재 게임의 시간

* CurrentDateTime은 계산의 편의성을 위해, UE에서 정의한 FDateTime으로 저장했다.

Tick은 다음과 같이 구현한다.

2. 시간에 따른 Sun 각도 변경 (LevelBlueprint)

Level에 보면 Sun의 역할을 하는 Light Source가 있을 것이다. 그 액터의 Y(Pitch) Rotation을 변경해서 Sun의 각도를 구현할 수 있다. Light Source가 뭔지 모르겠으면 Sky Sphere의 Details에서 찾아볼 수 있다.

이 라이팅 액터를 런타임에 접근하려면 Level Blueprint여야 한다. Level Blueprint를 열고 함수 CalculateSunDirection을 추가한다. 해당 함수는 GameState로부터 현재 시간을 받아내서 이에 해당하는 해의 각도(FRotator)로 바꿔준다. 코드는 다음과 같다.

  • totalsecond에 0.004167이라는 뜬금없는 수를 곱하는데 이는 게임 내 1초당 해의 각도가 0.0041도 움직여야 하기 때문이다.
  • 90을 더해주는 이유는 90도가 자정에 해당하는 Sun의 각도이기 때문이다. 90을 더해줘야 12시에 해가 가장 높이 선다.

함수를 작성했으면, Tick 함수를 작성한다.

  • Update Sun Direction은 Sun Direction에 맞게 하늘의 텍스쳐를 변경해주는 노드다.
  • 이정도까지 했으면 Lighting Build를 다시 해줘야 제대로 렌더링된다.

3. 밤을 더 어둡게하기

시간을 빠르게 해보고 하늘의 색을 쭉 둘러보면 뭔가 아쉬운 점이 있다. 밤이 너무 짧다는 것이다. 한 새벽 한시 반 쯤만 되도 벌써 하늘이 붉게 물들어있다. 이는 기본 하늘 텍스쳐 색 문제인데, 고치는 법은 간단하다. Sky Sphere의 Blueprint에 들어가보면 Zenith Color Curve가 있다. 여기에 들어가있는 텍스쳐를 조금 고치면 된다. 디폴트 값을 변경하기 좀 애매하면 복사해서 쓰면 된다. 들어가서 컬러 슬라이드와 Color Value를 적절히 바꿔준다. 필자는 컬러 슬라이드만 변경했다.

변경 후 컬러 슬라이드

끝.

'Coding > Unreal, C++' 카테고리의 다른 글

[C++ Primer Plus] 2. Setting Out to C++  (0) 2022.05.26
[C++ Primer Plus] 1. Getting Started with C++  (0) 2022.05.24
Replication  (0) 2022.05.23
UE4: Delegate  (0) 2022.03.24
#17 Enemy AI: Attack  (0) 2022.03.18