C++ 在 Unreal 中为游戏增加实时音视频互动的教程详解

2020-05-29 11:02:26于丽

初始化VideoCallWidget

为每个按钮找到asset图像,并将其分配到相应的纹理。然后用纹理初始化每个按钮。

//VideoCallWidget.h

...

UCLASS()
class AGORAVIDEOCALL_API UVideoCallWidget : public UUserWidget
{
 GENERATED_BODY()

public:

 ..

 UVideoCallWidget(const FObjectInitializer& ObjectInitializer);

 void NativeConstruct() override;
 void NativeDestruct() override;

private:
 void InitButtons();

 ...
};
//VideoCallWidget.cpp 


void UVideoCallWidget::NativeConstruct()
{
 Super::NativeConstruct();

 InitButtons();
}

void UVideoCallWidget::NativeDestruct()
{
 Super::NativeDestruct();


 if (VideoCallPtr)
 {
 VideoCallPtr->StopCall();
 }
}

UVideoCallWidget::UVideoCallWidget(const FObjectInitializer& ObjectInitializer)
 : Super(ObjectInitializer)
{
 static ConstructorHelpers::FObjectFinder<UTexture2D>
 EndCallButtonTextureFinder(TEXT("Texture'/Game/ButtonTextures/hangup.hangup'"));
 if (EndCallButtonTextureFinder.Succeeded())
 {
 EndCallButtonTexture = EndCallButtonTextureFinder.Object;
 }
 static ConstructorHelpers::FObjectFinder<UTexture2D>
 AudioButtonMuteTextureFinder(TEXT("Texture'/Game/ButtonTextures/mute.mute'"));
 if (AudioButtonMuteTextureFinder.Succeeded())
 {
 AudioButtonMuteTexture = AudioButtonMuteTextureFinder.Object;
 }
 static ConstructorHelpers::FObjectFinder<UTexture2D>
 AudioButtonUnmuteTextureFinder(TEXT("Texture'/Game/ButtonTextures/unmute.unmute'"));
 if (AudioButtonUnmuteTextureFinder.Succeeded())
 {
 AudioButtonUnmuteTexture = AudioButtonUnmuteTextureFinder.Object;
 }
 static ConstructorHelpers::FObjectFinder<UTexture2D>
 VideomodeButtonCameraonTextureFinder(TEXT("Texture'/Game/ButtonTextures/cameraon.cameraon'"));
 if (VideomodeButtonCameraonTextureFinder.Succeeded())
 {
 VideomodeButtonCameraonTexture = VideomodeButtonCameraonTextureFinder.Object;
 }
 static ConstructorHelpers::FObjectFinder<UTexture2D>
 VideomodeButtonCameraoffTextureFinder(TEXT("Texture'/Game/ButtonTextures/cameraoff.cameraoff'"));
 if (VideomodeButtonCameraoffTextureFinder.Succeeded())
 {
 VideomodeButtonCameraoffTexture = VideomodeButtonCameraoffTextureFinder.Object;
 }
}

void UVideoCallWidget::InitButtons()
{
 if (EndCallButtonTexture)
 {
 EndCallButton->WidgetStyle.Normal.SetResourceObject(EndCallButtonTexture);
 EndCallButton->WidgetStyle.Normal.ImageSize = FVector2D(ButtonSizeX, ButtonSizeY);
 EndCallButton->WidgetStyle.Normal.DrawAs = ESlateBrushDrawType::Type::Image;

 EndCallButton->WidgetStyle.Hovered.SetResourceObject(EndCallButtonTexture);
 EndCallButton->WidgetStyle.Hovered.ImageSize = FVector2D(ButtonSizeX, ButtonSizeY);
 EndCallButton->WidgetStyle.Hovered.DrawAs = ESlateBrushDrawType::Type::Image;

 EndCallButton->WidgetStyle.Pressed.SetResourceObject(EndCallButtonTexture);
 EndCallButton->WidgetStyle.Pressed.ImageSize = FVector2D(ButtonSizeX, ButtonSizeY);
 EndCallButton->WidgetStyle.Pressed.DrawAs = ESlateBrushDrawType::Type::Image;
 }
 EndCallButton->OnClicked.AddDynamic(this, &UVideoCallWidget::OnEndCall);

 SetAudioButtonToMute();
 MuteLocalAudioButton->OnClicked.AddDynamic(this, &UVideoCallWidget::OnMuteLocalAudio);

 SetVideoModeButtonToCameraOff();
 VideoModeButton->OnClicked.AddDynamic(this, &UVideoCallWidget::OnChangeVideoMode);

}