본문 바로가기
언리얼엔진 개발/VR

[UnrealEngine] 문 버튼 색깔 바꾸기

by yeni_0224 2023. 6. 10.
728x90
반응형
buttonMesh->SetVectorParameterValueOnMaterials(FName("doorStateColor"), FVector4(0.505f, 0.015f, 0.00974f, 1));

생성자에서 Material에 코드로 접근할 수 있다.

Material 안에서 Parameter을 만들어주고, 그 Parameter 이름을 doorStateColor

라고 해줄 것이다.

이름이 같아야한다. 안그러면 엔진에서 material의 색을 찾아낼 수 없다.

원래 문 버튼의 색은 빨간색으로 해 놓고, 퀴즈를 다 풀었을 때 버튼의 불빛이

푸른 빛으로 바뀌게 할 것이다.

 

 

 

 

그런데 그것을 해결하기 전 이 문 버튼의 활성화 부분에서 치명적인 버그가 있었다. 그 버그를 해결하면서 이 문 색깔이 바뀌게 하기 위한 작업이 필요했다. 

나사와 달리 이 문 버튼 친구는 인스턴스가 여러개 있을 경우 코드 한줄로 모든 버튼에 적용되는 것이 아니라 iterator로 인스턴스상의 여러개의 버튼을 찾아줘야하는 친구였다. 그렇기 때문에 반복적으로 문 버튼의 상태를 적용해주어야했다.

그러기 위해서는 일단 버그부터 고쳐보자.


1. 버그 고치기

문제점 : 1번방 나오고 2번방 들어왔을 때 버튼 한번만 눌리고 그 다음엔 안눌려야하는데 눌린다.

모든 문의 버튼에 터치 활성화 되어야하는 상태인가 아닌가에 대한 정보가 전달되지 않은 것으로 파악된다.

 원래는 버튼 클래스에서 모든걸 해결하고자 했다. 상태 체크하는 것을 iterator로 계속 버튼들의 상태를 확인하고자 했으나 최적화의 부분에서 문제가 있을 것으로 예상되어, 지니어스 팀원께 도움을 요청했다. 문의 상태를 체크해주는 Manager 클래스를 하나 더 만들어줘서 거기서 관리해줄 것이다.

Door Button이 플레이어와 닿았을 때 상태를 doormanger을 호출하여 여기서 판별할 것이다.

여기서 문을 여는 상태면 문을 열라고 door의 문 여는 함수를 호출할 것이고, 문을 닫는 상태면 문을 닫으라고 door의 문 닫는 함수를 호출할 것이다.

그렇다 기존의 bool 변수로 문을 여는 것인지 닫는 것인지 체크하는 변수를 door에서 관리하는게 아니라 door button 클래스에서 아예 구별하고 관리해주는 것으로 로직을 수정했다. 훨씬 생각하기도 수월해졌다.

if(!dManager) return;
	if(bCanButtonClicked == true)
	{
		if(dManager->bOpened == false)
		{
			dManager->OpenAllDoors();
            //중략
        else
		{
			dManager->CloseAllDoors();
            //후략

Door Manager의 BeginPlay에서 door와 door button, 문의 상태를 체크하는 delegate까지 찾아줄 것이다.

그 다음 문과 버튼에 모두 적용하도록 할 것이다.

door manger에서 문 여는 상태일 때

for(AActor* dbtn : doorBtns)
	{
		auto db = Cast<ADoorButton>(dbtn);
		//파란불
		db->buttonMesh->SetVectorParameterValueOnMaterials(FName("doorStateColor"), FVector4(0, 0.573f, 0.49f, 1));
	}
	for (AActor* door : doors)
	{
		auto d = Cast<ADoors>(door);
		d->Open();
	}
	bOpened = true;

드디어 : 연산자의 쓰임에 대해 알 수 있게 되었다. 어떻게 검색해야할지 감이 오지 않았던 저것!

기쁘다!! :)

 

: 연산자

범위기반for문 이라고 검색하면 나오는 듯하다.

doorBtns 배열에 있는 원소를 하나씩 dbtn 변수에 받아서 작업을 하겠다는 것이다.

그러니까 저 for문 속에 있는 doorBtns의 자료형은 TArray이다.

	UPROPERTY()
	TArray<AActor*> doorBtns;

doorManager의 문 열리는 함수상태에서 문 버튼의 material을 바꿔주면 된다!

SetVectorParameterValueOnMaterials 알아두쟈

 

버그도 고치면서 문 색깔까지 잘 바꾸었다 :)

클래스를 잘 나누는 것 다시한번 중요성을 느꼈다.

너무너무 중요하다는걸 너무 잘 알고 있었지만 다시한번..!

728x90
반응형