UE4案例记录

UE4案例记录——制作3D角色显示在UI中

UE4案例记录——制作3D角色显示在UI中

制作3D角色显示在UI中

转载自youtube视频

https://www.youtube.com/channel/UCC8f6SxKJElVvaRb7nF4Axg

新建项目

在这里插入图片描述

创建一个Actor

场景组件->摄像机组件->场景捕获组件2D,之后添加一个骨骼网格体

在这里插入图片描述

渲染骨骼网格体

在这里插入图片描述

之后选则文件夹就会看到渲染目标NewTextureRenderTarget2D

右键渲染目标创建一个材质

设置材质域为用户界面,混合模式为半透明

在这里插入图片描述

UMG使用三维材质

创建一个UMG用IMG使用这个材质

在这里插入图片描述

将这个IMG添加到视口。

添加该actor进场景

可以在角色蓝图中创建这个Actor,记住要生成到天空球之外。

在这里插入图片描述

运行效果如下

在这里插入图片描述

添加鼠标和角色的交互

角色蓝图中添加ClickStart,ClickEnd,MouseMove三个函数

在这里插入图片描述

上面三个函数分别会绑定在按下鼠标按钮时\On Mouse Button Down,(松开鼠标按钮时\On Mouse Button Up鼠标离开时),鼠标移动时\On Mouse Move

下面进入希望与之交互的UMG中,也就是显示这个角色的二维UMG

首先,事件构造时先通过玩家控制的角色获取对应希望显示在二维部分的角色,并存成一个变量

在这里插入图片描述

添加以下四个重载函数

按下鼠标按钮时\On Mouse Button Down

在这里插入图片描述

松开鼠标按钮时\On Mouse Button Up,鼠标离开时

在这里插入图片描述

鼠标移动时\On Mouse Move

在这里插入图片描述

双向绑定效果完成

在这里插入图片描述

好的,下面是一个简单的Ue4 C++ Replay编写案例: 1. 首先,在UE4中创建一个新的C++项目,并创建一个名为MyGameInstance的GameInstance子类。 2. 在MyGameInstance.h文件中添加以下代码: ```cpp #pragma once #include "Engine/GameInstance.h" #include "MyGameInstance.generated.h" UCLASS() class MYPROJECT_API UMyGameInstance : public UGameInstance { GENERATED_BODY() public: UFUNCTION(BlueprintCallable) void StartRecording(); UFUNCTION(BlueprintCallable) void StopRecording(); UFUNCTION(BlueprintCallable) void StartReplay(); private: FString ReplayFilename; }; ``` 3. 在MyGameInstance.cpp文件中实现StartRecording、StopRecording和StartReplay函数。下面是一个简单的实现示例: ```cpp #include "MyGameInstance.h" #include "Engine/Engine.h" #include "EngineUtils.h" #include "GameFramework/PlayerController.h" #include "Misc/Paths.h" #include "Misc/FileHelper.h" #include "Engine/LocalPlayer.h" #include "GameFramework/PlayerState.h" #include "GameFramework/GameStateBase.h" #include "GameFramework/WorldSettings.h" void UMyGameInstance::StartRecording() { FString CurrentDateTime = FDateTime::Now().ToString(TEXT("%Y-%m-%d-%H-%M-%S")); ReplayFilename = FPaths::ProjectSavedDir() / FString(TEXT("Replays/")) + CurrentDateTime + TEXT(".replay"); for (TActorIterator<APlayerController> It(GetWorld()); It; ++It) { APlayerController* PlayerController = *It; if (PlayerController->IsLocalPlayerController()) { ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(PlayerController->Player); if (LocalPlayer) { FString AdditionalData = FString::Printf(TEXT("PlayerName=%s"), *LocalPlayer->GetPlayerName()); GetWorld()->DemoNetDriver->StartRecording(ReplayFilename, false, AdditionalData); break; } } } } void UMyGameInstance::StopRecording() { GetWorld()->DemoNetDriver->StopRecording(); } void UMyGameInstance::StartReplay() { if (FFileHelper::FileExists(*ReplayFilename)) { for (TActorIterator<APlayerController> It(GetWorld()); It; ++It) { APlayerController* PlayerController = *It; if (PlayerController->IsLocalPlayerController()) { ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(PlayerController->Player); if (LocalPlayer) { FString AdditionalData = FString::Printf(TEXT("PlayerName=%s"), *LocalPlayer->GetPlayerName()); GetWorld()->DemoNetDriver->PlayDemoFromFile(ReplayFilename, AdditionalData); break; } } } } } ``` 4. 在UE4中创建一个新的Blueprint类,并将其命名为ReplayActor。在ReplayActor中添加以下代码: ```cpp UCLASS() class MYPROJECT_API AReplayActor : public AActor { GENERATED_BODY() public: AReplayActor(); protected: virtual void BeginPlay() override; private: UPROPERTY(VisibleAnywhere) UStaticMeshComponent* StaticMeshComponent; UPROPERTY(EditAnywhere) UMaterialInterface* Material; void OnReplayFinished(); }; ``` 5. 在ReplayActor.cpp文件中实现OnReplayFinished和BeginPlay函数。下面是一个简单的实现示例: ```cpp #include "ReplayActor.h" #include "Components/StaticMeshComponent.h" #include "Materials/MaterialInterface.h" #include "Kismet/GameplayStatics.h" #include "MyGameInstance.h" AReplayActor::AReplayActor() { PrimaryActorTick.bCanEverTick = false; StaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("StaticMeshComponent")); StaticMeshComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); RootComponent = StaticMeshComponent; } void AReplayActor::BeginPlay() { Super::BeginPlay(); if (UMyGameInstance* GameInstance = Cast<UMyGameInstance>(GetGameInstance())) { FDelegateHandle ReplayFinishedHandle = GameInstance->GetWorld()->AddOnWorldCleanup(FWorldCleanup::FOnWorldCleanupDelegate::CreateUObject(this, &AReplayActor::OnReplayFinished)); } if (Material) { StaticMeshComponent->SetMaterial(0, Material); } } void AReplayActor::OnReplayFinished() { Destroy(); } ``` 6. 在UE4中创建一个新的关卡,并将其命名为ReplayLevel。在ReplayLevel中添加一个ReplayActor,并将其Material属性设置为一个你喜欢的材质。 7. 在UE4中创建一个新的蓝图,并将其命名为ReplayController。在ReplayController中添加以下事件: - Event Begin Play:调用MyGameInstance的StartRecording函数来开始记录Replay。 - Input Action Replay:调用MyGameInstance的StartReplay函数来开始回放Replay。 8. 在ReplayController中添加一个Input Action,并将其命名为Replay。在Replay Action的Details面板中将Key设置为R。 9. 在UE4中运行ReplayLevel,并在ReplayController蓝图中按下R键来开始记录Replay。完成后,按下R键再次开始回放Replay。 上面是一个简单的UE4 C++ Replay编写案例。您可以根据您的需求和项目的要求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Addam Holmes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值