Visual - B477042/GraduationProject GitHub Wiki

About Visual

Lighting

  • Ex) Stage1 ๋ผ์ดํŠธ ๋ณต์žก๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๊ตฌ์กฐ๋ฌผ๋“ค์„ Stationary๋กœ ์„ค์ •ํ•˜์—ฌ ๋ผ์ดํŒ…์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋ฅผ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์กฐ๋ฌผ๋“ค์„ Movable๋กœ ์„ค์ •ํ•œ ๊ฒƒ๊ณผ ์ฐจ์ด๊ฐ€ ๋А๊ปด์ง€์ง€ ์•Š๊ณ  ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ํฐ ๋„์›€์ด ๋์Šต๋‹ˆ๋‹ค.

Material

Material์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๊ณต๋ถ€ํ•˜๊ณ  ์žˆ๋Š” ์ค‘์ด๋ผ ์ œ๊ฐ€ ์ง์ ‘ ๋งŒ๋“  Material์€ ์ ์—ˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท์—์„œ Refernece๋ฅผ ์ฐพ์•„์„œ ๋”ฐ๋ผ ํ•ด๋ณด๋ฉด์„œ ์–ด๋–ป๊ฒŒ ์ œ์ž‘์„ ํ•˜๋ฉด ์ข‹์„์ง€ ์ƒ๊ฐํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

Post Process

  • UE4์˜ ์…€ ์‰์ด๋” ํŠœํ† ๋ฆฌ์–ผ์„ ํ†ตํ•ด ๋งŒ๋“  Material๋กœ ์™ธ๊ณฝ์„ ์„ ํ‘œํ˜„ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ฒด๋ ฅ์ด ์ค„์–ด๋“ค๋ฉด ํ™”๋ฉด์ด ์ž˜ ์•ˆ ๋ณด์ด๋Š” ํšจ๊ณผ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฒด๋ ฅ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ UI๋ฅผ ํ†ตํ•ด ์ œ๊ณตํ•˜๊ณ  ์žˆ์ง€๋งŒ ์ด๋Ÿฐ ํ‘œํ˜„์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ •๋ณด๋ฅผ ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๊ณ  ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. Post process๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์ด ๋น„์šฉ์€ ๋น„์‹ธ๊ธฐ์— ๋น„์šฉ์„ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด์„œ C++๋กœ ์ œ์–ด๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„

EGPostProcessVolume.cpp

void AEGPostProcessVolume::SyncHpPercent(float ratio)
{
	float applyRatio = 1.0f - ratio;

	Settings.ColorGamma.W = FMath::Lerp<float, float>(DefaultColorGamma.W,MaxColorGamma.W,applyRatio);
	Settings.ColorContrast.W = FMath::Lerp<float, float>(DefaultColorContrast.W, MaxColorContrast.W, applyRatio);
	Settings.ColorSaturation.W = FMath::Lerp<float, float>(DefaultColorSaturation.W, MaxColorSaturation.W, applyRatio);
	Settings.GrainJitter = FMath::Lerp<float, float>(DefaultGrainJitter, MaxGrainJitter, applyRatio);
	Settings.GrainIntensity = FMath::Lerp<float, float>(DefaultGrainIntensity, MaxGrainIntensity, applyRatio);
	Settings.VignetteIntensity = FMath::Lerp<float, float>(DefaultVignettelIntensity, MaxVignetteIntensity, applyRatio);
}

Player์˜ Hp ratio๋ฅผ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ํ›„, ๋ฏธ๋ฆฌ ์„ค์ •ํ•ด๋‘” ๊ฐ’ ์‚ฌ์ด๋ฅผ Lerp๋ฅผ ํ†ตํ•ด ๋ณ€ํ•˜๋Š” ๊ณผ์ •์„ ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.


void AEGPlayerCharacter::BeginPlay()
{
    Stat->HPChangedDelegate.AddLambda([this]()->void {
		auto World = GetWorld();
		if (!World)
		{
			EGLOG(Error, TEXT("World is null"));
			return;
		}
		//ํ˜„์žฌ hp ๋น„์œจ์„ GameInstance๋ฅผ ํ†ตํ•ด postprocess๋กœ ๋„˜๊ฒจ์ค˜์„œ ํ”ผ๊ฒฉํšจ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•ด์ค€๋‹ค.
		auto GameInstance = Cast<UEGGameInstance>(World->GetGameInstance());
		if (!GameInstance)return;

		if (GameInstance->GetPostProcessVolume().IsValid())
			GameInstance->GetPostProcessVolume()->SyncHpPercent(Stat->GetHPRatio());
	});
}

Lambda ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ตฌํ˜„์‹œ ์–ด๋ ค์› ๋˜ ์ 

๊ฐ€์žฅ ์–ด๋ ค์› ๋˜ ์ ์€ Material์ด์˜€์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋จธ๋ฆฟ ์†์—์„œ ๊ทธ๋ฆฐ ์ด๋ฏธ์ง€๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ์ ์ด ๊ฐ€์žฅ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฑ…๊ณผ ์ธํ„ฐ๋„ท์—์„œ ์ž๋ฃŒ๋ฅผ ๋ชจ์•„ ๋”ฐ๋ผํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ธ์ง€ ๋ถ„์„ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ž˜ ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ฏธ์ˆ ์ ์ธ ๊ฐ๊ฐ์ด ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ธ์ง€ ์‹œ๊ฐ„์ด ๋ถ€์กฑํ–ˆ๋˜ ๊ฑด์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋” ๊ณต๋ถ€ํ•˜๊ณ  ๋งŒ๋“ค์–ด๋ณด๋ฉด์„œ ๊ทน๋ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.