UE4学习笔记_07

时间:2014-03-29 17:21:47   收藏:0   阅读:791

上一篇讨论了如何在C++中创建可被Blueprint调用的全局函数。如果想实现只供某一个类使用的Blueprint函数,方式是类似的,只是不要再继承UBlueprintFunctionLibrary类,同时函数也无需再声明成static即可。

虽然能够在Blueprint中调用一个C++实现的方法是很不错,但在实际中我们还会需要其他的交互方式,比如由C++代码去触发一系列的Blueprint动作,以及让Blueprint能够和C++类的某些属性变量直接进行交互。

我们先来看看如何将C++类中的某些属性变量暴露出去,让Blueprint(或Editor)能够看见、读或写这些变量,从而实现和C++的通信。

其实非常简单:只需要在C++类的头文件中这样声明一下就可以了:

bubuko.com,布布扣
1 /* What‘s the Player‘s current musical skill level? */
2     UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerMusicSkill")
3     int32 MusicSkillLevel;
bubuko.com,布布扣

只需要使用UPROPERTY宏,在加上一些枚举属性,就可以让一个变量以开发者希望的方式暴露给Blueprint,其中:

上面的代码在编译后,只需要在Editor中基于这个类创建一个Blueprint,然后就能够在它的Default属性界面看到下面的内容:

bubuko.com,布布扣

相当不错,而且简单。下面再来看看关键的:如何让C++去触发Blueprint,同时给Blueprint传递信息?

其实也非常简单,主要是使用UFUNTION+BlueprintImplementableEvent属性:

bubuko.com,布布扣
1 UFUNCTION(BlueprintImplementableEvent, meta = (FriendlyName = "Music skill is GOOD"))
2         virtual void MusicSkillGood(int32 CurrentSkill);
bubuko.com,布布扣

其中:

完整的类代码如下:

MyPlayerController.h:

bubuko.com,布布扣
 1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
 2 
 3 #pragma once
 4 
 5 #include "GameFramework/PlayerController.h"
 6 #include "MyPlayerController.generated.h"
 7 
 8 /**
 9  * 
10  */
11 UCLASS()
12 class AMyPlayerController : public APlayerController
13 {
14     GENERATED_UCLASS_BODY()
15     
16     /* What‘s the Player‘s current musical skill level? */
17     UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PlayerMusicSkill")
18     int32 MusicSkillLevel;
19 
20     UFUNCTION(BlueprintImplementableEvent, meta = (FriendlyName = "Music skill is GOOD"))

21         virtual void MusicSkillGood(int32 CurrentSkill);
22 
23     virtual void PlayerTick(float DeltaTime) OVERRIDE;
24 };
bubuko.com,布布扣

MyPlayerController.cpp:

bubuko.com,布布扣
 1 // Copyright 1998-2014 Epic Games, Inc. All Rights Reserved.
 2 
 3 #include "HelloWorld.h"
 4 #include "MyPlayerController.h"
 5 
 6 
 7 AMyPlayerController::AMyPlayerController(const class FPostConstructInitializeProperties& PCIP)
 8     : Super(PCIP)
 9 {
10 
11 }
12 
13 void AMyPlayerController::PlayerTick(float DeltaTime) {
14     Super::PlayerTick(DeltaTime);
15 
16     if (MusicSkillLevel > 50)
17     {
18         MusicSkillGood(MusicSkillLevel);
19     }
20 }
bubuko.com,布布扣

上面代码的主要逻辑就是在每个Tick检查当前类实例的MusicSkillLevel变量值是否大于50,如果是,则对Blueprint触发MusicSkillGood事件,并将MusicSkillLevel的值传递过去。最终在Blueprint中可以这样用:

bubuko.com,布布扣

这个Blueprint的逻辑就是:

到此为止,Blueprint已经和C++代码实现了完全的交互:Blueprint能够主动调用C++中的函数,C++也能主动触发Blueprint的事件,而且双方还能通过暴露的变量进行交互。这样一来,整个游戏的底层平台模块完全可以用C++实现,然后给上层的Blueprint提供调用接口,由Blueprint来利用、组织这些模块来实现上层的完整游戏逻辑。这种结合方式既保留了C++的性能优势,又充分利用了Blueprint的易用性和灵活性来让游戏开发保持快速地迭代。这应该就是UE4所推崇的最佳开发模式。

UE4要学习的内容太多了,时间真是不够用啊...

UE4学习笔记_07,布布扣,bubuko.com

原文:http://www.cnblogs.com/vesnica/p/3632693.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!