注意事项

1)模块接口(API):对于一些需要被模块外部访问的函数和类,需要通过 *_API 的宏标记出来。每个被暴露在外的单项都会带来编译时间的额外消耗,因此请务必仅暴露出必须暴露的接口。如果外部只需要访问一个类中的某个函数,那么比起暴露整个类而言,仅暴露出这个函数能够节省出相当可观的编译时间。

2)在最最基本的层面上,任意可以被放置到关卡中的游戏物体都是一个 Actor。所有的 Actor 都是继承于 AActor 类,该类是所有可生成的游戏对象的基类。

3)Actor类里,PrimaryActorTick.bCanEverTick = true;// 将该Actor设置为每帧调用一次Tick()。如果您没有这个需要,可以将其关闭来改善性能。

在vc里定义一个能在编辑器下直接访问的属性

新建一个c++的Actor类

构造函数中设置上面两个变量的默认值

在vc里定义一个能被蓝图调用的函数

注:UFUNCTION里的函数不支持重载;

将蓝图里的参数传递到C++

name,text,string之间的相互转换

蓝图中的类型转换

C++中的类型转换

C++里调用蓝图里的函数

在C++创建一个能被蓝图调用的算数节点

蓝图里调用C++函数

注:只能在继承自本C++类的蓝图里调用;

调用时,如果函数里的参数里有结构体,该结构体在定义时需要加上BlueprintType关键字,且本函数需要有函数体

自定义枚举

UE4实例的获取

创建C++基础类

选择gameMode,并保存关卡

gameMode下需要加载的类

gameMode中加载上面创建的类

上图中的6个类,再加上gameInstance总共7个类,每个类文件里加一个打印函数

获取到实例后的运行效果如下图

代码如下

// Fill out your copyright notice in the Description page of Project Settings.

#include "TestActor001.h"

#include "testvcGameModeBase.h"

#include "PikaPlayerState.h"

#include "PikaPawn.h"

#include "PikaGameStateBase.h"

#include "PikaPlayerController.h"

#include "PikaHUD.h"

#include "PikaGameInstance.h"

// Sets default values

ATestActor001::ATestActor001()

{

// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.

PrimaryActorTick.bCanEverTick = true;

}

// Called when the game starts or when spawned

void ATestActor001::BeginPlay()

{

Super::BeginPlay();

EventCurrent();

//通过GetWorld来获取实例

if (GetWorld())

{

//GameMode

AtestvcGameModeBase *pikaqiuGameMode = Cast(GetWorld()->GetAuthGameMode());

if (pikaqiuGameMode)

{

pikaqiuGameMode->pikaPrint("pikaqiuGameMode");

}

//PikaPlayerState

APikaPlayerState *pikaPlayerStateVar = Cast(GetWorld()->GetFirstPlayerController()->PlayerState);

if (pikaPlayerStateVar)

{

pikaPlayerStateVar->pikaPrint("pikaPlayerState");

}

//PikaPlayerController

APikaPlayerController *pikaPlayerControllerVar = Cast(GetWorld()->GetFirstPlayerController());

if (pikaPlayerControllerVar)

{

pikaPlayerControllerVar->pikaPrint("pikaPlayerController");

}

//pikaPawn

APikaPawn *pikaPawnVar = Cast(GetWorld()->GetFirstPlayerController()->GetPawn());

if (pikaPawnVar)

{

pikaPawnVar->pikaPrint("pikaPawn");

}

//pikaHUD

APikaHUD *pikaHUDVar = Cast(GetWorld()->GetFirstPlayerController()->GetHUD());

if (pikaHUDVar)

{

pikaHUDVar->pikaPrint("pikaHUD");

}

//pikaGameStateBase

APikaGameStateBase *pikaGameStateBaseVar = Cast(GetWorld()->GetGameState());

if (pikaGameStateBaseVar)

{

pikaGameStateBaseVar->pikaPrint("pikaGameStateBase");

}

//pikaGameInstance

UPikaGameInstance *pikaGameInstanceVar = Cast(GetWorld()->GetGameInstance());

if (pikaGameInstanceVar)

{

pikaGameInstanceVar->pikaPrint("pikaGameInstance");

}

}

}

// Called every frame

void ATestActor001::Tick(float DeltaTime)

{

Super::Tick(DeltaTime);

}

float ATestActor001::pikaFloat(float pika1, float pika2)

{

return false;

}

actor实例之间的相互获取

从PikaActorA里获取PikaActorB和PikaActorC的实例

创建三个c++的actor类,并为每个acotr创建一个基于本类的蓝图类

PikaActorB和PikaActorC里各加两个打印函数

注:GEngine需要包含Engine.h头文件;

蓝图的加载方式里,需要在蓝图里指定要获取的实例

运行效果如下:

加了迭代后的效果如下:

PikaActorA里的代码如下:

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"

#include "GameFramework/Actor.h"

#include "PikaActorB.h"

#include "PikaActorC.h"

#include "PikaActorA.generated.h"

UCLASS()

class PIKAQIUTEST_API APikaActorA : public AActor

{

GENERATED_BODY()

public:

// Sets default values for this actor's properties

APikaActorA();

protected:

// Called when the game starts or when spawned

virtual void BeginPlay() override;

public:

// Called every frame

virtual void Tick(float DeltaTime) override;

//从pikaActorA中获取pikaActorB和pikaActorC的实例

//方法一

UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = UI)

APikaActorB *pikaActorBvar;

//方法二

TSubclassOf getInstanceForC;

//APikaActorC *pikaActorCvar;

//通过迭代来获取场景中的实例

void GetInstanceFor();

void pikaPrint(FString pikaStr);

void pikaPrintSelf();

};

-------------------上面的PikaActorA.h文件,下面的PikaActorA.cpp文件

// Fill out your copyright notice in the Description page of Project Settings.

#include "PikaActorA.h"

#include "Engine.h"

// Sets default values

APikaActorA::APikaActorA()

{

// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.

PrimaryActorTick.bCanEverTick = true;

static ConstructorHelpers::FClassFinder pikaActorCTemp(TEXT("/Game/MyPikaActorC"));

getInstanceForC = pikaActorCTemp.Class;

}

// Called when the game starts or when spawned

void APikaActorA::BeginPlay()

{

Super::BeginPlay();

if (GetWorld())

{

//从pikaActorA中获取pikaActorB的实例,该方法需要在蓝图下指定要获取的实例

if (pikaActorBvar)

{

APikaActorB *pikaActorBInstance = Cast(pikaActorBvar);

if (pikaActorBInstance)

{

pikaActorBInstance->pikaPrintSelf();

}

}

//从pikaActorA中获取pikaActorC的实例,需要在上面的构造函数里获取pikaActorC实例的路径

AActor *pikaActorCvar = GetWorld()->SpawnActor(getInstanceForC, FVector::ZeroVector, FRotator::ZeroRotator);

if (pikaActorCvar)

{

APikaActorC *pikaActorCInstance = Cast(pikaActorCvar);

if (pikaActorCInstance)

{

pikaActorCInstance->pikaPrintSelf();

}

}

}

//调用迭代获取实例的函数

GetInstanceFor();

}

// Called every frame

void APikaActorA::Tick(float DeltaTime)

{

Super::Tick(DeltaTime);

}

void APikaActorA::GetInstanceFor()

{

AActor *tempPointer = NULL;

//TObjectIterator它可以获取的到我们场景里面的Object实例

int pikaInt = 0;

for (TObjectIteratorIt;It;++It)

{

tempPointer = *It;

if (tempPointer)

{

APikaActorA *pikaActorAInstance = Cast(tempPointer);

if (pikaActorAInstance)

{

pikaActorAInstance->pikaPrintSelf();

}

APikaActorB *pikaActorBInstance = Cast(tempPointer);

if (pikaActorBInstance)

{

pikaActorBInstance->pikaPrintSelf();

}

APikaActorC *pikaActorCInstance = Cast(tempPointer);

if (pikaActorCInstance)

{

pikaActorCInstance->pikaPrintSelf();

}

}

++pikaInt;

}

pikaPrint(FString::FromInt(pikaInt));

};

void APikaActorA::pikaPrint(FString pikaStr)

{

if (GEngine)

{

GEngine->AddOnScreenDebugMessage(-1, 10.0f, FColor::Red, pikaStr);

}

};

void APikaActorA::pikaPrintSelf()

{

pikaPrint("PikaActorA");

}

写一个能被蓝图调用的C++类

1)创建一个蓝图函数类

c++中获取蓝图组件_蓝图C++混合编程相关推荐

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

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

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

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

  3. 无法从套接字中获取更多数据_数据科学中应引起更多关注的一个组成部分

    无法从套接字中获取更多数据 介绍 (Introduction) Data science, machine learning, artificial intelligence, those terms ...

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

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

  5. unity获取脚本组件_王者荣耀是怎样炼成的(三)unity组件与脚本

    上回书说到了unity的基本操作.这回我们来侃侃unity中的组件与脚本. 目录结构 一.组件与脚本简介 1.组件 组件(Component),顾名思义,就是游戏物体的组成部件. 这和我们对现实生活的 ...

  6. react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件

    react中创建一个组件 Recently I had to create a Countdown for one of my other projects, and I thought that i ...

  7. java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...

  8. 在Matlab中使用mex函数进行C/C++混合编程

    最近写了个Matlab程序,好慢呐--所以开始学习Matlab与C/C++混合编程.下面写了个测试代码,显示一个Double类型矩阵中的元素. 源代码 [cpp] view plaincopyprin ...

  9. php从内存中获取源码_【PHP7源码分析】PHP内存管理

    作者: 顺风车运营研发团队 李乐 第一章 从操作系统内存管理说起 程序是代码和数据的集合,进程是运行着的程序:操作系统需要为进程分配内存:进程运行完毕需要释放内存:内存管理就是内存的分配和释放: 1. ...

最新文章

  1. AI战场,李彦宏马化腾马云都在频频刷脸,周鸿祎和他的360在想啥呢?
  2. typedef 与 define
  3. RxJs map operator 工作原理分析
  4. ICCV2019 视频理解比赛冠军代码库,商汤开源X-Temporal
  5. ubuntu窗口最小化消失,任务栏上无法找到的解决方法
  6. CT一般扫描参数_CT图像质量参数
  7. Beetl学习(一)
  8. angularjs1-8,cacheFactory,sce
  9. 关于12306的一点思考
  10. Vimeo反反复复地重生死亡。
  11. jQuery获取鼠标事件源(万能)
  12. 【SEW-伺服电机-Profinet-io通讯控制——伺服配置】
  13. 如何编写PMP项目管理中的项目立项书
  14. MATLAB 数学应用 微分方程 常微分方程 求解捕食者-猎物方程
  15. css修改文字竖排还是横排
  16. 2019西安交大计算机专业研究生分数线,西安交通大学2019年考研分数线公布
  17. macOS Big Sur 11.5 (20G71) 正式版 DMG、ISO、IPSW 百度网盘下载
  18. sam格式的结构和意义_SAM文件基础知识
  19. XSHELL免费版下载
  20. 美年旅游_跟团游_编辑跟团游

热门文章

  1. 回归分析结果表格怎么填_手把手教绘制回归分析结果的森林图GraphPad Prism和Excel...
  2. 2020-10-13 四元数用法(不讲原理,只讲计算规则)
  3. Git复习(一)之简介、安装、集中式和分布式
  4. 2017-2018-1 201553334 实验五 通讯协议设计
  5. JVM的常用配置参数
  6. python3 logging模块
  7. jQuery-helloWorld
  8. 面向对象设计原则之开闭原则
  9. CobarClient源码分析
  10. JVM的监控工具之jinfo