UE4 总结七 UE4蓝图碰撞检测解析

1、什么是MetaData

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


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


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

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

(2)Timeline要连接到Play from Start 而不是Play


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


扫描二维码关注公众号,回复: 2188465 查看本文章


3、UE4 命名约定

  • 模版类以T作为前缀,比如TArray,TMap,TSet
  •  UObject派生类都以U前缀 
  • AActor派生类都以A前缀 
  • SWidget派生类都以S前缀 
  • 抽象接口以I前缀 
  • 枚举以E开头 
  • bool变量以b前缀,如bPendingDestruction 
  • 其他的大部分以F开头,如FString,FName 

4、

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

  • UnrealBuildTool(UBT,C#):UE4的自定义工具,来编译UE4的逐个模块并处理依赖等。我们编写的Target.cs,Build.cs都是为这个工具服务的。
  • UnrealHeaderTool (UHT,C++):UE4的C++代码解析生成工具,我们在代码里写的那些宏UCLASS等和#include "*.generated.h"都为UHT提供了信息来生成相应的C++反射代码。 

一般来说,UBT会先调用UHT会先负责解析一遍C++代码,生成相应其他代码。然后开始调用平台特定的编译工具(VisualStudio,LLVM)来编译各个模块。最后启动Editor或者是Game. 


5、摘自:https://www.cnblogs.com/shilinnpu/p/8182288.html

C++ typedef typename 作用

C++的一些语法让人看着费解,其中就有:

typedef typename std::vector<T>::size_type size_type;

详见《C++ Primer》(第五版)P584 
有些不懂的语法有时候虽然知道大概是什么意思,忽略一下就过了其实,不过心里老是膈应,就刨根问底一次吧。vector::size_type

明白上述语法,首先要先看清vector::size_type的意思。参考《STL源码剖析》不难发现,其实:

template <class T,class Alloc=alloc>
class vector{
public:
    //...
    typedef size_t size_type;
    //...
};

这样就看得很清晰了,vector::size_typevector的嵌套类型定义,其实际等价于 size_t类型。 
也就是说:

vector<int>::size_type ssize;
//就等价于
size_t ssize;

为什么使用typename关键字

那么问题来了,为什么要加上typename关键字?

typedef std::vector<T>::size_type size_type;//why not?

实际上,模板类型在实例化之前,编译器并不知道vector<T>::size_type是什么东西,事实上一共有三种可能:

静态数据成员 
静态成员函数 
嵌套类型

那么此时typename的作用就在此时体现出来了——定义就不再模棱两可。

总结

所以根据上述两条分析,

typedef typename std::vector<T>::size_type size_type;

语句的真是面目是: 
typedef创建了存在类型的别名,而typename告诉编译器std::vector<T>::size_type是一个类型而不是一个成员。


6、

typedef unsigned char uint8; //定义可移植的无符号8位整数关键字 这句话其中typedef是什么意思?

typedef就是做类型定义,为一种数据类型定义一个新名字。目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。比如typedef unsigned char uint8;就是用uint8来代替unsigned char,这样以后声明变量就可以用uint8 c;即方便又好记好理解。

7、

UE4蓝图碰撞检测解析

https://blog.csdn.net/u012999985/article/details/51113853


8  问:vector的实现与增长

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

摘自:https://blog.csdn.net/u012999985/article/details/78359151

猜你喜欢

转载自blog.csdn.net/zhangxiaofan666/article/details/79577564