상호작용 가능함을 안내하는 InteractableText

IsVisible 혹은 AddToViewport 에서 계속 크래시가 남 (IsVisible의 문제로 추측중)

https://forums.unrealengine.com/t/userwidget-addtoviewport-always-crash/459036

 

UserWidget AddToViewport always crash

Hi. I’m making a simple game in C++. I’m trying to display a widget when the player’s health reaches 0. But it always crashes in the AddToVierport part. Can someone help me? When I checked whether the widget works with less player’s health, it work

forums.unrealengine.com

https://forums.unrealengine.com/t/custom-uuserwidget-have-lifespan/459168/2

 

Custom UUserWidget have LifeSpan?

No there no life span, but if you detached it it can be deleted, if you want to hide something you should collapse it (SetVisibility mode), also if you wont use UPROPERTY() on UMG widget pointers it may be thrown away by garbage collection. If you composin

forums.unrealengine.com

UPROPERTY 를 추가하지 않았기 때문이라는 글이 있다

 

https://minusi.tistory.com/entry/%EC%96%B8%EB%A6%AC%EC%96%BC-UPROPERTY-Unreal-UPROPERTY

 

언리얼 UPROPERTY( Unreal UPROPERTY )

언리얼 엔진 위에서 언리얼 엔진과 상호작용하려는 코드를 작성하기 위해서는 언리얼에서 제공하는 각종 매크로의 도움을 받을 수 밖에 없습니다. 그 중, UPROPERTY는 멤버 변수( 또는 프로퍼티 )

minusi.tistory.com

UPROPERTY 설명글

일단 임시 땜빵 했으니 IsVisible은 다음에 마저 해결하기로

 


 

TalkableObject에 상호작용 했을 때 (대화) 뜨는 TalkPopup 의 이름과 대사 텍스트를 변경할 수 있도록 조치함

TextLine = Cast<UTextBlock>(TalkPopup->GetWidgetFromName(TEXT("Line")));
	TextName = Cast<UTextBlock>(TalkPopup->GetWidgetFromName(TEXT("Name")));

	TextLine->SetText(FText::FromString("test line"));
	TextName->SetText(FText::FromString("test name"));

 

키를 더 눌러 진행했을 때 대사가 바뀌도록 해야 한다

일단 이 정도로...

(밑에 추가함)


 

상호작용을 종료하는 (대화 끝, 물건 내려놓기) 버튼이 tab으로 바인딩 되어 있는데,

E키 (상호작용 버튼)을 다시 눌렀을 때 작동하도록 해야 함

 

Interact() 에서 버튼이 다시 눌렸을 때

Interact() 내에서 IsInteracting= true 이면 (상호작용 중이면)

EndInteract() 가 작동하게 하려고 했는데,

생각해보니 IsInteracting= true 이면 다시 상호작용이 불가하게 처리해두어서 Interact() 내부로 아예 들어오지 않는다

우짜면좋나...

 

void AHamsterDemoCharacter::OnInteract()
{
	if (isSuccessInteract)
	{
		UE_LOG(LogTemp, Log, TEXT("E pressed"));

		if (InteractableObj != nullptr)
		{
			UE_LOG(LogTemp, Log, TEXT("interactable obj not null"));
			
			auto Movable = Cast<AMovableObject>(InteractableObj);
			if (Movable != nullptr) //interactable 중 movable 인지 확인
			{
				Movable->SetHandle(characterPhysicsHandle);
				Movable->SetHandleLocation(characterGrabLocation);
			}

			lockMoveForInteract = !InteractableObj->CanMove();
			InteractableObj->Interact();
		}
		
	}
	else
	{
		OnEndInteract();
	}

E키를 눌렀을 때 추가 인터랙트가 불가하면 (=상호작용 중이면)

EndInteract()가 발동하도록 함

 


TalkableObejct에서,

E를 눌러 대화 시작 후 E를 누르면 대화가 진행되도록 함

 

CanTalkMore가 true이면 Interact()가 실행될 수 있도록 하고,

CanTalkMore가 false이면 EndInteract()가 실행되도록 했다

이후 EndInteract()에서 CanTalkeMore를 다시 true로 바꿔서 대화 종료 후 다시 대화를 걸 수 있도록 했다.

bool ATalkableObject::IsInteractable()
{
	
	
	return CanTalkMore == true;

	//이야기 남았으면 true, 끝나면 false
	//이야기 남았으면 Interact() 다시 해서 이야기 진행
	//이야기 끝났으면 false해서 EndInteract()로 가게
}

void ATalkableObject::Interact()
{
	Super::Interact();

	if (!TalkPopup->IsVisible()) //뷰포트에 없으면 위젯 띄우기
	{
		UE_LOG(LogTemp, Log, TEXT("talkable interact"));
		TalkPopup->AddToViewport();
		TextName->SetText(FText::FromString("test name2"));
		TextLine->SetText(FText::FromString("test line2"));
		CanTalkMore = true;

	}
	else
	{
		TextName->SetText(FText::FromString("test name3"));
		TextLine->SetText(FText::FromString("test line3"));
		CanTalkMore = false;
	}
	
}

void ATalkableObject::EndInteract()
{
	Super::EndInteract();

	if (TalkPopup->IsVisible())
	{
		UE_LOG(LogTemp, Log, TEXT("talkable end interact - close talkpopup"));
		TalkPopup->RemoveFromParent();
	}
    
	CanTalkMore = true;

}

 

이름 나중에 CanProgressTalk 정도로 바꿔야겠음

 

대화 추가 진행 여부를 대화 데이터가 더 있는지로 판단하도록 해야함.

 

'[햄] 작업일기' 카테고리의 다른 글

230721  (0) 2023.07.21
0718 대화 내용을 엑셀 데이터로 불러오기  (0) 2023.07.18
230714 상호작용 중임을 판단하기  (0) 2023.07.14
230711  (0) 2023.07.11
230706  (0) 2023.07.07

+ Recent posts