虚幻4——蓝图在脚本之间的交互

来源:互联网 发布:nba比赛个人数据统计 编辑:程序博客网 时间:2024/05/22 16:38

       从虚幻3到虚幻4.之前都已经习惯了在脚本中写节点,然后在编辑器中供关卡师使用。所以对于这种开发模式,也不会有什么不适应的感觉!可视化编辑,也是以后游戏开发的重要的一环吧!但是国内游戏开发还没有这一种概念!对于关卡师,尤其懂游戏逻辑的。这是多么稀有的古董啊!现在的Blueprint比Kismet更强大了。可以自定义函数,宏等高级语言的特征。现在的UE4的Blueprint就是UE3的UnrealScript脚本。

   对于虚幻的开发模式 = 脚本语言 + 可视化编辑 。知道怎样把自己写的代码,不管是类封装成可视化节点,还是调用这个类的函数的功能封装成节点,然后在Blueprint中调用。



1.让自己的类可以变成可以调用的Blueprint可视化节点编辑。就是Blueprint类


UCLASS(Blueprintable)class AMyBlueprintableClass : AActor{    GENERATED_UCLASS_BODY()}

这个创建Blueprint类的原理,有点UE3的原型的创建。不过前者前者和后者的实现功能不是在一个数量级上。

在UCLASS 宏的后面跟上类所需的标识即可,这个功能是告诉虚幻引擎,我创建的这个类是可以被用于创建Blueprint类的哦。


在类中使用与Blueprint有关的类标识有一下几个:



Blueprintable:  这个类是可以创建Blueprint类,默认是NotBlueprintable。这个标识是可以继承的。如果父类声明了  Blueprintable 那么继承这个类的子类也能够创建Blueprint。

BlueprintType : 这个标识是告诉虚幻引擎,我创建的这个类是可以当做类型的。如虚幻引擎的内置数据类型 uint32 一样。如果我创建一个新的类,名为 APickupActor  为了在游戏开始的时候用,我们想要知道当前的关卡中有好多APickupActor  的对象。我们可以在Blueprint中创建一个APickupActor  类型的数组,遍历关卡中所有的APickupActor  实例。然后添加到这个数组中,方便我们在需要的时候进行索引。我们就可以在这个类的UCLASS中加上这个标识符。


NotBlueprintable:  这个标识符是告诉虚幻引擎,我们的这个类不能够被Blueprint使用。当然默认选择的是这个,就像传统的c++类一样来对待。

如果父类使用的Blueprintable 但是我们在子类中不想让它可以当蓝图使用,我们可以在子类中声明这个标识符来覆盖父类的生命。


以上这些就是类和Blueprint有关的关键字。 这些声明方式和UC脚本类的声明方式是一样的。原理一样,只是书写方式样。



把类和Blueprint的关系弄清楚后,我们有时候需要在编辑器Blueprint页面中修改和读写变量。所以知道怎样让自己类中定义的变量可以被Blueprint读取或者修改也是非常重要的。

我们知道在UDK/UE3中为了让自己的变量可以进行编辑,通常都是在UC脚本中 写下如下格式的变量

var(Weapon) ActWeapon   CurrentWeapon;  标识这个变量可以编辑




在UE4中定义我们可以在虚幻引擎中操作的变量时,必须要使用UPROPERTY(),这个告诉虚幻引擎对变量对进行相应的处理。怎么处理呢?

很简单,只需要在UPROPERTY宏中填入需要虚幻引擎处理的关键字就行了。如果没有这个,就和其它普普通通的变量一样了。当让如果你在编辑器中不对这个变量进行操作,那个这个变量还是和普通的变量一样,除了特殊的关键字。


BlueprintReadOnly:  蓝图只能读取值,不能修改。

BlueprintReadWrite : 蓝图可以进行读写。


以上关键字在同一变量中只能使用其中的一个不能同时。

一下关键字是可以很上面的关键字组合使用,这个和Windows中窗口样式的组合一样。

BlueprintAssignable : 在蓝图中暴露该节点

BlueprintCallable:  该节点在蓝图中是可以被调用的。


除了类和类中定义的变量可以和Blueprint进行通信以外,我们的变量也在蓝图中调用。

只需要在定义的函数的上面使用宏UFUNTION 填入相应的关键字。这是告诉虚幻引擎进行相应的处理,比如我们在类中定义了一个可以获取当前玩家的血量比。当时有的时候,根据需要我想在蓝图中调用,如果通过蓝图重新写一个通过蓝图节点组成的获取玩家血量的百分比的功能。这也能太费劲了吧。

把获取血量百分比这个函数声明为蓝图可以调用的节点就行了。


关键字的意思:


BlueprintCallable :  蓝图可以调用,这个可以使改变调用的对象

BlueprintPure:  不能改变当前调用的对象,只负责,类似于输入和输入这种功能,比如数学的+ - * /叫做或者获取值这些调用。

BlueprintImplementableEvent: 告诉虚幻引擎这个是虚函数,通过Blueprint来实现的。

如果没有实现,函数调用将被忽略。重要的是要注意,如果BlueprintImplementableEvent没有返回值或参数,它将显示为一个事件,可以通过右击并选择它的事件图的蓝图。



BlueprintNativeEvent:  如果我们定义的这个函数的关键字是BlueprintImplementableEvent。这表明这个函数通过Blueprint来实现其功能。为了防止我们在Blueprint中没有对这个函数进行实现。所以我们在类中可以实现一个版本来应对在Blueprint没有实现。

本地版本的函数实现,必须在函数名的后面加入_Implememt.。如我在代码中声明一个函数为 void SetTarget();  现在我把这个函数的关键字申明为 BlueprintImplementableEvent。这个是告诉引擎,这个函数是在Blueprint中实现的。如果我们在Blueprint类中没有实现这个函数。我们可以在类中写一个应对版本,格式如下,

void  XXX::SetTarget__Implememt()

{

  XXXXXXXXXXXX;

}


这个开销是非常昂贵的,用在我们需要用的地方。

















 














0 0
原创粉丝点击