UE4是我到目前为止,接触过的最为复杂的技术,无论是深度还是广度。我们都喜欢简单,做人和做事都是一样,如果可以简单处理事情,就没有必要复杂。但事与愿违,现实中,我们不可能依靠自己单纯简单,就把事情做好。因为人与事的复杂,造成我们技术越来越来复杂。
从技术角度,很多人说C难,而Python简单。这是一个比较错误的观点。准确的说,应该是python比C的语法简单。python设计数据处理,与人工智能,本身不是其中一部分。回头再来说UE4为什么复杂。
因为UE4是一个功能非常全面的引擎,这不是他复杂的原因。只能说UE4公司首先目前的技术实力,只能采用如此复杂的方法,解决现有的事情。但我认为已经做得非常优秀了。而说他技术首先,只是因为没有更为简单的方式,让我们使用技术。比如微软的C#,UE4和C#完全不是一个复杂难度。
回到我们的重点,蓝图和C++这两个同时存在与UE4引擎的语言。但凡语言就有一个编辑器。所有UE4从语言编辑器就有两个。
1.UE4蓝图编辑器,用来编辑器蓝图和其他资源
2.Microsoft Visual Studio用来编辑C++,其实说到C++,这个C++经过UE4改造以后,而非标准的C++,如果你觉得学了,C++标准语法就能玩转UE4的C++,恐怕不能实现。C++一门很复杂的语言,我个人建议要选择性学习,没有必要见到什么都要搞的很明白,不然会陷入语言细节中。
我们怎么来使用UE4的工程,我们新建一个UE4的C++工程以后,目录结构是这样:
从这个目录中,我们可以看到两个文件,.sln,.uproject,这两个文件都是工程文件,sln编辑C++,而另一个编辑蓝图。
一.蓝图调用C++代码,C++与蓝图的交互通过蓝图继承的。一个普通的C++是无法与蓝图交互的,我们需要通过下面这个类
然后在C++代码里面定义函数:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyMccActor.generated.h"
UCLASS()
class MYCPPPROJECT_API AMyMccActor : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
AMyMccActor();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UFUNCTION(BlueprintImplementableEvent, Category = "SplineMesh")
void PrintMessage(const FString &Message);
};
然后在蓝图类里面继承这个类,然后重写函数PrintMessage.
以上过程就是蓝图调用C++代码过程,本质上通过继承实现。可能没有办法通过在蓝图中,直接定义C++类实现。
二.C++调用蓝图代码
void XXX::BeginPlay()
{
TArray<AActor*> _TempArryActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AActor::GetClass(), _TempArryActors);
for (int32 i = 0; i < _TempArryActors.Num(); i++)
{
if (_TempArryActors[i]->GetName() == FString("AMyMccActor"))
{
Cast<AMySplineMeshActor>(_TempArryActors[i])->PrintMessage(TEXT("找到Actor&调用PringMessage函数"));
}
}
以上就是蓝图与C++交互的基本方法。C++本身语法已经比较复杂,在UE4中的C++也是被改造的。具体到底怎么用,还是看如何选择,对于没有功底的小白,还是UE4,给定的方法使用,会相对简单一些。