C++和蓝图

概述

蓝图可以继承C++类,从而使得程序员可以在代码中创建新的游戏性类,而关卡设计人员可以使用蓝图来继承该类并对其进行修改。

有很多种修饰符可以改变C++类和蓝图系统间交互方式,其中某些修饰符会在本示例中突出介绍。

类设置

在类设置的第一部分中,使用C++类向导

创建一个名称为LightSwitchBoth 的类。

LightSwitchBoth类中的大部分代码设置都和 仅使用C++的LightSwitch示例

类似。尽管您可以让一个蓝图继承LightSwitchCodeOnly类,

但蓝图图表并不能访问该类中创建的组件、属性及函数。该示例将使用 UPROPERTY() 和 UFUNCTION() 修饰符,这两个修饰符使得LightSwitchBoth作为继承它的蓝图的模板。

您会发现首先参考下 仅使用C++的LightSwitch示例

是有用的,这样您可以看下如何设置头文件及源文件

来创建LightSwitchComponent、SphereComponent、DesiredBrightness属性及OnOverlap函数。

这个头文件是从 仅使用C++的LightSwitch示例

改编而来,添加了以下功能:PointLightComponent和SphereComponent是BlueprintReadOnly(仅蓝图可读的),并且将显示在 我的蓝图 选卡中的 Switch Components(切换组件) 类目中。

OnOverlap现在是一个BlueprintNativeEvent,将会显示在 我的蓝图 选卡中的 Switch Functions(切换函数) 类目中。

DesiredBrightness是BlueprintReadWrite(蓝图可读写的),将显示在 我的蓝图 选卡中的 Switch Properties(切换属性) 类目中。

DesiredBrightness现在是EditAnywhere(随处可编辑的),而不是VisibleAnywhere(随处可见的)。

UCLASS() 宏有个 Blueprintable 修饰符。在这个示例中,该修饰符不是必须的,因为LightSwitchBoth直接继承Actor,而Actor是Blueprintable(可蓝图化的),所以LightSwitchBoth会继承该修饰符。

加上 UPROPERTY() 和 UFUNCTION() 宏中的额外修饰符,LightSwitchBoth类的头文件如下所示:

LightSwitchBoth.h

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.

#pragma once

#include "LightSwitchBoth.generated.h"

/**

*

*/

UCLASS()

class ALightSwitchBoth : public AActor

{

GENERATED_UCLASS_BODY()

/** point light component */

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")

TSubobjectPtr PointLight1;

/** sphere component */

UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Switch Components")

TSubobjectPtr Sphere1;

/** called when something overlaps the sphere component */

UFUNCTION(BlueprintNativeEvent, Category="Switch Functions")

void OnOverlap(class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);

/** the desired brightness for the light */

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Switch Properties")

float DesiredBrightness;

};

在LightSwitchBoth的源文件中,构造器仍然是一样的。但是,需要对 OnOverlap 函数做一点修改。这个函数现在是一个BlueprintNativeEvent。这意味着

在继承这个类的蓝图中,可以放置一个覆盖 OnOverlap 的事件,当正常调用该函数时会执行此事件。如果该事件不存在,那么则是执行那个函数的

C++实现。要想使这个设置正常工作,该C++函数需要重命名为 OnOverlap_Implementation 。稍后在本示例中将介绍这个蓝图设置。对 OnOverlap 函数

进行了修改后,LightSwitchBoth 的源文件如下所示:

LightSwitchBoth.cpp

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.

#include "BasicClasses.h"

#include "LightSwitchBoth.h"

ALightSwitchBoth::ALightSwitchBoth(const FObjectInitializer& ObjectInitializer)

: Super(ObjectInitializer)

{

DesiredBrightness = 15.0f;

PointLight1 = ObjectInitializer.CreateDefaultSubobject(this, "PointLight1");

PointLight1->Brightness = DesiredBrightness;

PointLight1->bVisible = true;

RootComponent = PointLight1;

Components.Add(PointLight1);

Sphere1 = ObjectInitializer.CreateDefaultSubobject(this, TEXT("Sphere1"));

Sphere1->InitSphereRadius(250.0f);

Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something

Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something

Sphere1->AttachParent = RootComponent;

Components.Add(Sphere1);

}

void ALightSwitchBoth::OnOverlap_Implementation(AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex)

{

if ( OtherActor && (OtherActor != this) && OtherComp )

{

PointLight1->ToggleVisibility();

}

}

当创建类时,新的 UCLASS() 、UFUNCTION() 和/或 UPROPERTY() 宏意味着该代码必须在Visual Studio 或Xcode中进行编译,然后使用虚幻编辑器重新加载它们。

关闭虚幻编辑器,在Visual Studio 或Xcode中编译该项目,然后打开编辑器并重新加载该项目,以确保正确地重新加载该游戏模块。同时,需要注意的一点是,

要确保 Build Configuration(版本配置) 和您打开该项目使用的虚幻编辑器可执行文件的版本一致。 请在

编译游戏项目

文档中阅读关于编译配置及编译项目的更多信息。

当重新打开虚幻编辑器并重新打开您的项目后,便可以创建

一个新的类蓝图

了。

在本示例中,选择LightSwitchBoth作为该蓝图的父类,蓝图名称为 LightSwitchBoth_BP 。

在 C++代码中添加的PointLightComponent和SphereComponent 也会显示在 Blueprint Editor(蓝图编辑器) 的 组件模式

中的 Components(组件) 选卡内。

它们的图标是深蓝色,表示它们是从父类LightSwitchBoth类继承而来的原生组件。而刚刚添加到 LightSwitchBoth_BP 蓝图中的新组件的图标

是浅蓝色的。关于使用 Components(组件) 选卡添加及排列组件的更多信息,请参照 组件

选卡文档。

Blueprint Editor(蓝图编辑器) 的 图表模式

是蓝图编辑的核心。在 Graph Mode(图表) 模式中,您可以在我的蓝图

选卡中添加新变量

函数

及宏

。您也可以访问该类蓝图中包含的

所有 图表

。在这些图表中,各种节点

连接到一起,来创建由类属性、游戏事件、甚至Actor的周边环境

驱动的设计及游戏功能。

在 Graph Mode(图标模式) 中, My Blueprint(我的蓝图) 选卡显示了在C++中添加到LightSwitchBoth类中的 PointLightComponent 和SphereComponent 。这是因为 BlueprintReadOnly 修饰符存在的缘故。

通过在 我的蓝图 选卡中点击并拖拽这些组件的名称到图表中,可以将这些组件的节点添加到图表中。然后,您可以把这些节点连接到改变像可见性

或光源颜色这样属性的节点上。DesiredBrightness 属性也会出现在 我的蓝图 选卡中。因为它是一个属性,而不是一个组件,所以可以使用 BlueprintReadWrite

修饰符。这意味着在蓝图图表中可以创建节点来获取及设置 DesiredBrightness 的值。请参照 我的蓝图

文档来获得一般的应用信息。

默认情况下,可能不会显示父类LightSwitchBoth的组件和属性。因为当选中 我的蓝图 选卡底部的 Show user-created variables only(仅显示用户创建的变量) 复选框时,

会隐藏从父类继承的属性。显示所有变量

仅显示用户创建的变量

有两个图表用于设置 LightSwitchBoth_BP 类的行为。第一个是构造脚本

图表,它包含了一个专用的 Construction Script(构建脚本)

事件。如果没有该 Construction Script 设置,那么新的 LightSwitchBoth_BP Actor 将仅使用LightSwitchBoth的构造函数。然而,当Actor在关卡中移动时,及当

Desired Brightness 发生改变时,都会执行 Construction Script 。使用 Construction Script 意味着,可以轻松地改变暴露给蓝图的Actor属性,

并且可以快速地看到这些修改的效果。

在 LightSwitchBoth_BP 类中, Construction Script 事件连接到了 Set Brightness 节点上,以便当在关卡中添加或移动Actor时或者 Desired Brightness 发生改变时,将 Point Light 1 (PointLightComponent) 的亮度设置为

Desired Brightness 的值。

LightSwitch_BPOnly 类中设置的另一个图表是 事件图表

。EventGraph的执行是由事件触发的。在这个示例中,

任何时候当调用C++函数 OnOverlap 时, OnOverlap 就会执行。在LightSwitchBoth的源文件中,设置了代理,以便当一个Actor进入或离开SphereComponent时会执行 OnOverlap 。

Sphere1->OnComponentBeginOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something

Sphere1->OnComponentEndOverlap.AddDynamic(this, &ALightSwitchBoth::OnOverlap); // set up a notification for when this component overlaps something

OnOverlap 事件节点连接到了 Set Light Color 节点上。任何时候当执行该事件时,它都将会把PointLightComponent的光源颜色设置为一个随机颜色。这覆盖了

源码文件中用于切换的PointLightComponent可见性的 OnOverlap_Implementation 函数。

关于事件及处理图表的更多信息,请参照事件

、 事件图表

和事件模式

文档。

在变量的设置中, DesiredBrightness 变量设置为 EditAnywhere (随处可编辑) ,所以在 蓝图编辑器 的默认模式

中它是可见的,并且可以进行编辑。

这意味着对于类的每个实例,这个变量是可以变化的,所以每个Actor可以有其自己的 DesiredBrightness 。因为 DesiredBrightness 也是 BlueprintReadWrite(蓝图可读写) 的,且

Construction Script 中使用了它,所以更新它还会导致再次执行 Construction Script 。

其他Class Blueprints(类蓝图)可以继承由蓝图创建的类,通过以下两种方式实现:使用 Class Viewer(类别查看器) 中的类附近的下拉列表按钮来创建一个新蓝图,

或者通过右击该蓝图并选择 Create New Blueprint Based on This(基于此蓝图创建一个新蓝图) 。

类蓝图 LightSwitchBoth_BP 位于 内容浏览器

中,您可以从那里将其拖拽到关卡内。它也存在于 类别查看器

中。

关于使用 内容浏览器 或 类别查看器 在关卡放置Actor的更多信息,请参照放置Actor

文档。

c++中获取蓝图组件_C++和蓝图相关推荐

  1. 自动装配——@Autowired 构造器,参数,方法,属性都是从容器中获取参数组件的值||自定义组件想要使用Spring容器底层的一些组件 ApplicationContext,BeanFactory

    @Autowired:构造器,参数,方法,属性:都是从容器中获取参数组件的值 * 1).[标注在方法位置]:@Bean+方法参数:参数从容器中获取;默认不写@Autowired效果是一样的:都能自动装 ...

  2. 从父组件中获取子组件的值

    父组件中获取子组件中的值(三种的方式) 1. this.$root.子组件中的值 2. this.$parent.子值 $parent是一级一级访问的,如果子组件多的话需要多个$parent3. &l ...

  3. vue中获取/操作组件中的dom元素

    最近刚做了一个项目,需要用到地图,选择的是腾讯地图,创建地图的时候,需要给地图创建函数中传入地图容器的id或者容器的dom元素,但是在调试过程中,发现怎么都无法获取dom元素,直接通过getEleme ...

  4. android module中获取 app_Android组件化架构 - 4. 动态创建

    Android 组件化中使用动态创建的作用是解耦: 1. 反射机制 反射有两个作用:1.反编译:.class->.java;2.通过反射机制访问java对象中的属性,方法,构造器等: 实现反射, ...

  5. vue3 中通过$refs 获取子组件数据

    vue2 中获取子组件中的数据方法,可以使用 this.$refs ,但此方式在vue3中不适用了. 问题: 点击删除行的同时修改表格中数据选中状态,需要通过 ref 操作表格中的数据. 具体代码如下 ...

  6. 【JetPack】ViewBinding 视图绑定组件 ( 启用模块 | 视图绑定定制 | 绑定类名称生成规则 | 绑定类字段生成规则 | 绑定类获取根视图 | 绑定类获取布局组件 )

    文章目录 I . 视图绑定组件简介 II . 视图绑定 ViewBinding 使用前提 ( Android Studio 3.6 ) III . 视图绑定组件启用 IV . 定制视图绑定 ( 启用视 ...

  7. c++中获取蓝图组件_蓝图C++混合编程

    注意事项 1)模块接口(API):对于一些需要被模块外部访问的函数和类,需要通过 *_API 的宏标记出来.每个被暴露在外的单项都会带来编译时间的额外消耗,因此请务必仅暴露出必须暴露的接口.如果外部只 ...

  8. c++中获取蓝图组件_Vue组件通信方式居然有这么多?你了解几种

    作者:梨香 链接:https://juejin.im/post/6887709516616433677 vue组件通信的方式,这是在面试中一个非常高频的问题,我刚开始找实习便经常遇到这个问题,当时只知 ...

  9. 【Android 逆向】启动 DEX 字节码中的 Activity 组件 ( 使用 DexClassLoader 获取组件类失败 | 失败原因分析 | 自定义类加载器没有加载组件类的权限 )

    文章目录 一.使用 DexClassLoader 获取组件类失败报错 二.失败原因分析 一.使用 DexClassLoader 获取组件类失败报错 在上一篇博客 [Android 逆向]启动 DEX ...

  10. antd如何获取表单的值_antd 父组件获取子组件中form表单的值

    还是拿代码来讲吧,详情见注释 子组件 import React, { Component } from 'react'; import { Form, Input } from 'antd'; con ...

最新文章

  1. 三维几何基础大合集(三维点积叉积、点线面、凸包)《计算几何全家桶(三)》
  2. AttributeError: 'str' object has no attribute 'decode' django问题
  3. 利用正则表达式实现python强口令检测
  4. Linux改变进程优先级的nice命令
  5. oracle虚拟机怎么装系统,Virtualbox怎么安装系统 VirtualBox虚拟机安装Win8系统教程 (3)...
  6. HTTP 协议深入理解(一)
  7. GPU:上的了AI,下的了游戏 | 简谈计算机图形学、深度学习与硬件的“三角关系“
  8. 如何做好数据安全治理
  9. chrome官网下载网址
  10. (STM32F103C8T6 + JDY-31 + L298N)——蓝牙小车
  11. postgresql开启日志
  12. Centos7安装Docker后无法启动:Failed to program NAT chain: INVALID_ZONE: docker
  13. 高性能diffpatch算法 -- 如何将微信Apk的官方增量包20.4M缩小到7.0M
  14. 【优化模型】推销员问题模型
  15. 维斯易联网络打印机配置教程
  16. 【微信小程序】退款功能教程(含申请退款和退款回调)
  17. 论文大致思路(不断更新)
  18. stm32的语音识别_基于STM32的嵌入式语音识别模块设计实现
  19. 新手:linux环境配置以及linux下的pycharm安装
  20. 洛谷 P1948 / loj 10074 / 一本通 1496【分层图】

热门文章

  1. 国民岳父的“屁民理论”
  2. 摇筛子动画 android,摇骰子动画
  3. Crazy Rows
  4. 输出星期几的英文表示
  5. wordpress企业主题推荐
  6. 退出qemu_qemu虚拟机的关机方式
  7. oracle 9i告警日志,Oracle 9i,10g,11g各自alert日志的位置
  8. 易语言开发的cnzz站长统计留痕软件,成品原理源码分享
  9. Win2003安全警报--当前安全设置不允许从该位置下载文件
  10. 单页面应用与多页面的区别与优缺点