虚幻4C++编程入门(搬运1)

首先我们将使用虚幻编辑器中的类向导生成基础 C++ 类

,以便蓝图稍后进行延展。下图展示了向导的第一步 - 新建一个 Actor。

这里写图片描述

这里写图片描述
这里根据对character、pawn和actor的描述,知道了pawn是actor类型,而charactor是pawn的一种类型。

进程中的第二步是告知向导需要生成类的命名。下图显示的第二步中使用了默认命名。

这里写图片描述

选择创建类后,向导将生成文件并打开开发环境,以便开始编辑。这便是生成的类定义。如需了解类向导的更多信息,请查阅此 链接 。
这里我们建立了一个继承与actor类的类myactor。然后可以从微软的VS里面进行编写。

这里写图片描述
就像上面的图里面的位置,可以找到我们要编写的myactor的.h和.cpp文件。

myactor.h文件:

#include "GameFramework/Actor.h"
#include "MyActor.generated.h"

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

public: 
    // 设置该 actor 属性的默认值
    AMyActor();
    // 游戏开始时或生成时调用
    virtual void BeginPlay() override;

    // 每帧调用
    virtual void Tick( float DeltaSeconds ) override;
};

这里的BeginPlay()和Tick( float DeltaSeconds )都是声明的为虚函数。

BeginPlay() 是一个事件,将告知您 Actor 已以可操作状态进入游戏中。现在便适合开始类的游戏性逻辑。Tick() 每帧调用一次,对应的时间量为自上次调用传入的实际运算时间。在此可创建反复逻辑。如不需要此功能,最好将其移除,以节约少量性能开销。如要移除此功能,必须将构建函数中说明 tick 应该发生的代码行删除。以下构建函数包含讨论中的代码行。

而在构造函数里需要声明actor 设为每帧调用就得用下面的写法:

AMyActor::AMyActor()
{

    // 将此 actor 设为每帧调用 Tick()。不需要时可将此关闭,以提高性能。

    PrimaryActorTick.bCanEverTick = true;

}

构造函数是你在调用这个类时就会默认去调用的,比如你用这个类建立一个对象,然后就会自动调用构造函数去进行初始化。

下面是介绍把属性出现在虚幻编辑器中,这就要用到宏定义

现在即可创建一些属性(设计师可在虚幻编辑器中设置这些属性)。使用特殊宏 UPROPERTY() 即可轻松将属性公开到虚幻编辑器。只需在属性声明之前使用 UPROPERTY(EditAnywhere) 宏即可,如以下类所示。

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere)//可以在任何地方编辑。
    int32 TotalDamage;

    ...
};

执行这些操作后,即可在编辑器中对数值进行编辑。有多种方式控制其编辑方法和位置。为 UPROPERTY() 宏传入更多信息可完成此操作。例如:如需 TotalDamage 属性和相关属性出现在一个部分中,可使用分类功能。以下属性声明对此进行演示。

UPROPERTY(EditAnywhere, Category=”Damage”)
int32 TotalDamage;
用户需要编辑此属性时,它将和其他属性(这些属性已以此类型命名标记)一同出现在 Damage 标题之下。这可将常用设置放置在一起,便于设计师进行编辑。

现在让我们将相同属性对蓝图公开。

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=”Damage”)
int32 TotalDamage;
如您所见,存在一个蓝图特有的参数。正是此参数使属性为可读取和可编写状态。还存在一个单独选项 - BlueprintReadOnly。可通过此选项使属性在蓝图中被识别为常量。此外还有多个选项可控制属性对引擎公开的方式。

继续讨论以下部分之前,我们来添加一些属性到这个示例类。已有属性对此 actor 输出的伤害总量进行控制。我们更进一步,实现随时间输出伤害。以下代码添加了一个设计师可进行设置的属性,和另一个设计师可查看但无法进行更改的属性。

UCLASS()
class AMyActor : public AActor
{
    GENERATED_BODY()

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
    int32 TotalDamage;

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Damage")
    float DamageTimeInSeconds;

    UPROPERTY(BlueprintReadOnly, VisibleAnywhere, Transient, Category="Damage")
    float DamagePerSecond;

    ...
};

DamageTimeInSeconds 是设计师可进行修改的属性。DamagePerSecond 属性是使用设计师设置的计算值(详见下一部分)。VisibleAnywhere 标记意味着属性在虚幻编辑器中为可见状态,但不可进行编辑。Transient 标记意味着无法从硬盘对其进行保存或加载;它应该为一个派生的非持久值。下图将属性显示为类默认的部分。
这里写图片描述

在构建函数中设置默认值

在构建函数中设置属性默认值和典型 C++ 类方法一致。以下是在构建函数中设置默认值的两个例子,它们在功能上相同。

AMyActor::AMyActor()
{
    TotalDamage = 200;
    DamageTimeInSeconds = 1.f;
}

AMyActor::AMyActor() :
    TotalDamage(200),
    DamageTimeInSeconds(1.f)
{
}

下图是在构建函数中添加默认值后的属性视图。
这里写图片描述

为支持设计师对每个实例设置属性,数值也从给定对象的实例数据中加载。此数据应用在构建函数之后。与 PostInitProperties() 调用链挂钩即可基于设计师设置的数值创建默认值。此处的进程范例中,TotalDamage 和 DamageTimeInSeconds 为设计师指定的数值。即时这些数值为设计师指定,您仍然可以为它们提供恰当的默认值,正如我们在上例中执行的操作。

如未向属性提供默认值,引擎将自动把属性设为零(指针类设为 nullptr)。

void AMyActor::PostInitProperties()
{
    Super::PostInitProperties();
    DamagePerSecond = TotalDamage / DamageTimeInSeconds;
}

下图是添加以上 PostInitProperties() 代码后的属性视图。
这里写图片描述

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Epic Games今天宣布,正式发布“虚幻引擎4”(Unreal Engine 4/UE4),相关所有资源也一并放出。# h9 u6 O( p! y& D) q4 K7 P9 ~# N   只要每个月花19美元,你就能到全部资源,包括拿过来就能用的虚幻编辑器(Unreal Editor),GitHub上的完整C++源代码(支持微软Visual Studio/苹果Xcode),还有完整的生态系统:论坛、维基、问答、协作。8 t8 q& _* ?7 K. D) S6 W 一大波新游戏要来了 虚幻4引擎正式发布, s! f+ v' w9 M j3 y: ^   而在虚幻引擎4游戏的销售中,Epic将抽取5%的毛收入提升,也就是你的游戏赚了100万美元,就要交给Epic 5万美元。   回到技术方面,Epic号称虚幻引擎4是他们多年来心血的结晶,而且现在只是第一版,才刚刚开始。C++代码里你可以看到大量的创新,比如说支持虚拟立体偷窥Oculus VR,支持Linux操作系统,以及支持Valve SteamWorks、StreamBox,而且还可以通过HTML5在网页浏览器内开发游戏(页游)。   平台支持PC、PS4、Xbox One、iOS、Google等等。   虚幻引擎4基于DirectX 11,拥有新的材料流水线、蓝图视觉化脚本、直观蓝图调试、内容浏览器、人物动画、Matinee影院级工具集、全新地形和植被、后期处理效果、热重载(Hot Reload)、模拟与沉浸式视角、即时游戏预览、AI人工智能、音频、中间件集成等一系列全新特性。   虚幻引擎4现已开始提供授权。 现在提供网盘下载地址,毕竟到官方下载很麻烦,还要$,呵呵,10分很值得,代码风格很好,注释很爽!
下面是一个简单的UE4 C++ UDP通信组播的案例。 1. 首先,需要创建一个UDP Socket: ```c++ FSocket* ListenSocket = FUdpSocketBuilder(TEXT("MySocket")).BoundToAddress(FIPv4Address::Any).BoundToPort(3000); ``` 2. 接下来,需要创建一个Multicast组: ```c++ TSharedPtr<FInternetAddr> MulticastAddr = ISocketSubsystem::Get(PLATFORM_SOCKETSUBSYSTEM)->CreateInternetAddr(); bool bIsValid; MulticastAddr->SetIp(TEXT("239.255.0.1"), bIsValid); MulticastAddr->SetPort(3000); ``` 3. 然后,将Socket加入到Multicast组: ```c++ ListenSocket->JoinMulticastGroup(*MulticastAddr); ``` 4. 最后,可以使用以下代码来发送和接收消息: ```c++ // 发送消息 FString Message = TEXT("Hello, World!"); TArray<uint8> SendBuffer; FTCHARToUTF8 Converter(*Message); SendBuffer.Append((uint8*)Converter.Get(), Converter.Length()); int32 BytesSent; ListenSocket->SendTo(SendBuffer.GetData(), SendBuffer.Num(), BytesSent, *MulticastAddr); // 接收消息 TArray<uint8> ReceiveBuffer; FIPv4Endpoint Endpoint; if (ListenSocket->HasPendingData(Size)) { ReceiveBuffer.SetNumUninitialized(FMath::Min(Size, 65507u)); int32 BytesRead; ListenSocket->RecvFrom(ReceiveBuffer.GetData(), ReceiveBuffer.Num(), BytesRead, Endpoint); if (BytesRead > 0) { FString Message = FString(UTF8_TO_TCHAR(reinterpret_cast<const char*>(ReceiveBuffer.GetData()))); UE_LOG(LogTemp, Warning, TEXT("Received message: %s"), *Message); } } ``` 这是一个简单的UDP组播通信案例,可以根据自己的实际需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值