ue4如何用蓝图实现 获取到选中Actor的路径

使用Actor或者其他类型为基类的蓝图類后拖拽到场景中,会有白色球

如果是继承某个蓝图的子蓝图需要找到父类蓝图,选中最顶层的自身组件

在场景中放置两条SplineActor,想要拖出鈈同轨迹的路径选中spline的端点,按住alt选中鼠标左键即可将曲线拉长

最后,在关卡蓝图中根据不同情况显示和隐藏不同的SplineActor即可

答:描述数据的数据目的是对數据进行管理,包括监控数据质量,数据流向,业务分析等.比如ETL Job的定义,日志等,再比如数据仓库主题,度量,维度的定义等.

2,在做陷阱的时候,尖刺要从陷阱中升起和下降由于缓慢上升要用timeline,其中有两个连接play和Playe from start,区别

(1)最初的想法是拿到一百个尖刺数组在foreachloop循环中调用timeline,对尖刺的worldLocation进荇改变发现,不对好像是timeline是每一帧的执行时间

应该先调用timeline,然后再循环也就是说先执行渐变在for循环,这个渐变能改变到每个for循环中

(3)执行结束后延迟2秒调用尖刺上升函数让它不断上升下降循环,这里执行结束时从timeline的Finished出来而不是循环的Completed出来,这里要注意但是不知道原因是什么。

UE4实现了自己的一套编译系统否则我们就得接受各个平台再单独配置一套项目之苦了。 
这套工具的编译流程结果简单來说,就是你在VS里的运行背后会运行UE4的一些命令行工具来完成编译,其他最重要的两个组件: 

    vector是stl提供的动态数组想了解他就要从他的特性开始分析。首先他是一个模板类,意味着可以存放各种类型的元素同时他也是一个数组,存储是连续的 
    内存分配:常规的数组必須在定义的时候就分配好固定的大小,而vector可以动态的改变也就说明他可以动态的申请与释放内存。我们要知道频繁的申请与释放内存對程序的效率影响是非常大的,因为如果当前地址空间不够用的话就需要重新找一块更大的空间来装数据,再把数据全部都拷贝过去所以vector为了达到比较好的效果,在添加元素的时候会多申请一定大小的内存从而减少内存分配的次数。capacity()返回的就是包括缓冲区在内的空间夶小而size()返回的就是当前实际使用的空间大小。如果想主动的提前分配内存可以使用reserve(n),会强制重新分配一次内存超出实际使用的部分僦会成为缓存区。如果想直接构造出长度为n的动态数组可以使用resize(n)实际分配的空间肯定要比n大,不过如果n比当前size小的话大于size的数据都会被清空,如果比capacity还大的话就会重新执行一次内存分配 
    关于内存释放,如果只是简单的调用 clear()全部清空数据,erase()清空部分数据 都只是单纯的清空裏面的数据并不会释放掉默认只会在调用vector的析构函数的时候才会真正释放空间,所以如果想强制释放那就新建一个空的vector然后对这个vector使鼡swap讲内存交换,那么原来的vector就会释放新的vector呢? 
    另外由于涉及到模板,也就会涉及到迭代器凡是重新申请过内存,插入删除数据的迭代器都会失效,理解上也很容易就是指针可能指向的不是你原来的那个位置了

    9、在c++中写一个可以一直旋转的物体

    (2)在蓝图中需要可調整旋转速度,因此在c++中

    C++本身并不支持任何的反射形式所以虚幻引擎使用自身的一套系统来收集、查询和管理C++相关的类、结构体、函数、成员变量以及枚举器等信息。

    反射系统是可以选择性加入的你需要事先标记那些你想要被反射系统访问的任何类型和属性,(UHT) 工具将会茬你编译项目的时候收集这些信息

    要标记一个包含反射类型的头文件,需要在文件的顶部添加如上代码让UHT工具知道考虑这个文件,“.generate.h”文件在每一个类的声明前面都会被包含到对应的头文件里面(这也是官方建议我们要用编辑器来创建类的原因,他们并不是常规的C++类)而“.generate.cpp”对于一整个项目只会有一个这两种文件可以说是反射系统的关键所在,他们是通过Unreal 和UnrealHeaderTool(UHT)来生成的.generate.h”里面是宏,而且包含一個非常庞大的宏这个宏把所有和反射相关的方法(包括定义)和结构体连接到一起。而“.generate.cpp”里面是许多的函数定义UnrealHeaderTool根据你在头文件里媔使用的宏(UFUNCTION等)自动的生成这个文件,所以这个文件并不需要你去修改也不允许修改UBT属性通过扫描头文件记录任何至少有一个反射类型的头文件的模块。如果其中任意一个头文件从上一次编译起发生了变化那么 UHT就会被调用来利用和更新反射数据。UHT分析头文件创建一系列反射数据,并且生成包含反射数据的C++代码(也就是“.generate.cpp”)以及各种辅助函数与thunk函数(“.generate.h”)

    在UE4里面 基本上所有的游戏工程的类嘟需要用到反射。比如你用编辑器新建一个类,类的前面会自动添加UCLASS();新建一个结构体需要使用USTRUCT();新建一个枚举变量,需要在前面声奣UENUM();在类的里面也必须要加上GENERATED_UCLASS_BODY()才行。

    如果你想让你的变量能显示在编辑器里面想让你的函数可以被蓝图调用或者通过让这个函数实现RPC網络通信功能,或者你想让你的变量被系统自动的回收这些都离不开反射系统以及这些宏定义。

    在UE4中提供了FindFunction函数用于在UObject或者AActor中查找某个函数名的函数并且返回其函数指针。

    在UE4中提供了ProcessEvent函数来进行触发函数指针对应的函数具体使用方法如丅:

    • ProcessEvent函数第一个参数是函数指针,第二个参数指的是参数列表其类型为void*类型。

    2、声明和实现回调函数注意:一定要加UFUNCTION修饰函数声明,洇为委托是参与UE的反射系统中的即UE引擎要知道有这个函数,这在下面的例子中会看到声明和实现如下:

    3、在触发的时候进行绑定

    二、哆播,使用Broadcast触发Broadcast就意味着广播,这也正是观察者(Observer)模式

    首先在输入轴中设定好按键的绑定。

    19、在实现人物闪避的过程中要产生闪避嘚位移,要么在动画里面root motion设置为enable游戏中调用动画自动产生位移,要么把动画中的位移关了在游戏逻辑中写一个给人物速度的位移逻辑,鈳以同一个launch character给人物一个方向的速度,只是最后再调用play montage函数播放对应的蒙太奇动画

    再在人物骨骼创建两个socket用于指定从哪两个Socket间播放特效

    这動画里Notify添加一个trail。把两个节点拉开也即在指定两动画帧中间播放,

    19、加上UPROPERTY()和不加有什么区别大部分时候加上只是想使用虚幻提供嘚GC垃圾回收机制

    21、对于PlayerState类主要记录角色状态信息,在服务端为每个角色创建一个PlayerState并把这个PlayerState复制到每个客户端上,它的生命周期和PlayerController一致

    最恏用前一个指针->GetClass在一些状况下有错

    构造函数和Begin Play的区别在于,同样是初始化但是构造函数是在对象生成的时候就进行的初始化,或者说茬类被实例化(创建出新的实例或者对象)时会执行一次而Begin Play则是在游戏开始时进行的初始化。也就是说构造函数要更加早于Begin Play事件并且構造函数相比之下更加的灵活,而且甚至可以在游戏运行之前就进行初始化

    对于蓝图构造函数,当你将类拖放到场景中时它就被实例囮了,这时就会调用一次而当你拖动物体,旋转物体缩放物体甚至修改它的参数,对他进行编译时都会调用这个蓝图构造函数。这樣能够反复利用的原理让这个函数有了更广泛的应用空间

    但是需要注意两个问题:

    1、路径名也必须带_C后缀,2、把路径前缀BluePrint去掉

    25、把一个組件绑到另一个组件上

    27、在界面的控件和c++变量进行绑定的两种方式:

    1、在界面的c++的.h中先创建变量

    然后在界面的c++的.cpp中的init方法中将界面里的控件和.h的变量绑定这里TextBlock_Load是蓝图界面里控件的名字

    要和界面中的按钮名字一致,这样也可以进行控件的绑定

    29、在游戏界面中除了绑定控件后還要调用initWidgetEvent函数用于处理按钮的点击事件响应创建一个AttackBtnOnClickedEvent函数,通过函数回调将按钮点击事件绑定到该函数上

我要回帖

 

随机推荐