c++中获取蓝图组件_蓝图C++混合编程
注意事项
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++混合编程相关推荐
- 自动装配——@Autowired 构造器,参数,方法,属性都是从容器中获取参数组件的值||自定义组件想要使用Spring容器底层的一些组件 ApplicationContext,BeanFactory
@Autowired:构造器,参数,方法,属性:都是从容器中获取参数组件的值 * 1).[标注在方法位置]:@Bean+方法参数:参数从容器中获取;默认不写@Autowired效果是一样的:都能自动装 ...
- 从父组件中获取子组件的值
父组件中获取子组件中的值(三种的方式) 1. this.$root.子组件中的值 2. this.$parent.子值 $parent是一级一级访问的,如果子组件多的话需要多个$parent3. &l ...
- 无法从套接字中获取更多数据_数据科学中应引起更多关注的一个组成部分
无法从套接字中获取更多数据 介绍 (Introduction) Data science, machine learning, artificial intelligence, those terms ...
- vue中获取/操作组件中的dom元素
最近刚做了一个项目,需要用到地图,选择的是腾讯地图,创建地图的时候,需要给地图创建函数中传入地图容器的id或者容器的dom元素,但是在调试过程中,发现怎么都无法获取dom元素,直接通过getEleme ...
- unity获取脚本组件_王者荣耀是怎样炼成的(三)unity组件与脚本
上回书说到了unity的基本操作.这回我们来侃侃unity中的组件与脚本. 目录结构 一.组件与脚本简介 1.组件 组件(Component),顾名思义,就是游戏物体的组成部件. 这和我们对现实生活的 ...
- react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件
react中创建一个组件 Recently I had to create a Countdown for one of my other projects, and I thought that i ...
- java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...
- 在Matlab中使用mex函数进行C/C++混合编程
最近写了个Matlab程序,好慢呐--所以开始学习Matlab与C/C++混合编程.下面写了个测试代码,显示一个Double类型矩阵中的元素. 源代码 [cpp] view plaincopyprin ...
- php从内存中获取源码_【PHP7源码分析】PHP内存管理
作者: 顺风车运营研发团队 李乐 第一章 从操作系统内存管理说起 程序是代码和数据的集合,进程是运行着的程序:操作系统需要为进程分配内存:进程运行完毕需要释放内存:内存管理就是内存的分配和释放: 1. ...
最新文章
- AI战场,李彦宏马化腾马云都在频频刷脸,周鸿祎和他的360在想啥呢?
- typedef 与 define
- RxJs map operator 工作原理分析
- ICCV2019 视频理解比赛冠军代码库,商汤开源X-Temporal
- ubuntu窗口最小化消失,任务栏上无法找到的解决方法
- CT一般扫描参数_CT图像质量参数
- Beetl学习(一)
- angularjs1-8,cacheFactory,sce
- 关于12306的一点思考
- Vimeo反反复复地重生死亡。
- jQuery获取鼠标事件源(万能)
- 【SEW-伺服电机-Profinet-io通讯控制——伺服配置】
- 如何编写PMP项目管理中的项目立项书
- MATLAB 数学应用 微分方程 常微分方程 求解捕食者-猎物方程
- css修改文字竖排还是横排
- 2019西安交大计算机专业研究生分数线,西安交通大学2019年考研分数线公布
- macOS Big Sur 11.5 (20G71) 正式版 DMG、ISO、IPSW 百度网盘下载
- sam格式的结构和意义_SAM文件基础知识
- XSHELL免费版下载
- 美年旅游_跟团游_编辑跟团游