0%

Unity/UE/C++

1022例行八股复盘

UE的Actor与Unity的GameObject有什么区别?

两者都是通过Component的组件架构形式来进行游戏对象功能上的搭建,可以说两者都是两个引擎“基础游戏对象”的一个概念。 从继承角度上讲,Actor的继承层次比GameObject复杂得多,比如有掌管数据相关的无实体Actor子类AInfo,也有表示在游戏场景中的实体Pawn,如果向做一个人型的Actor,还需要继承对象Pawn的Character对象。而在Unity中很少会听说有继承GameObject类的情况出现。 从功能角度上讲,Actor自带一个网络复制功能,虚幻引擎也可以自动处理网络延迟和丢包,而GameObject需要以Component的形式加额外组件并利用外部网络框架才行。 从更新角度上讲,Actor是直接参与Component的tick流程的,因为Actor自己也有一些功能逻辑需要tick实现,在调用完component的tick之后,就会调用Actor的tick,而Unity的GameObject不具有类似tick的update流程,component的update直接由mono生命周期托管。

构造函数初始化列表

为什么使用?因为类中有常量类型的数据成员、引用类型的数据成员,这样的数据只能进行初始化而不能赋值,非初始化列表的方式是以赋值的方式来进行初始化的。其次存在无默认构造函数的内嵌对象的情况。

(内嵌对象的)构造函数只能在(组合类的)构造函数的初始化列表中调用,不能在(组合类的)构造函数体中调用。 因为编译器规定了子类以及成员类的构造函数会在本类的构造函数调用后自动调用,所以不能在函数体中重复进行调用。

主要问题是编译器在默认情况下只会调用内嵌对象的默认构造函数,因为这个函数没有参数。 如果要调用这个对象的有参构造函数,又不能在构造函数的函数体中调用,所以只能在初始化列表中显示调用构造函数来传递参数。

#include <iostream>
using namespace std;
 

class Base
{
public:
Base(float xx, float yy) : x(xx), y(yy)
{
cout << "Constructor of Base" << endl;
}
private:
float x, y;
};

class Derived : public Base
{
public:
Derived(float xx, float yy) : Base(xx, yy)
{
cout << "Constructor of Derived" << endl;
}
};

int main(int argc, char **argv)
{
Derived d(0, 0);

return 0;

}

单例模式和静态类

首先从原理上分析,静态类是在程序开始时立马初始化的,而单例类可以实现延迟初始化,也就是懒汉模式。由此看单例模式在这方面上有很大的自主性,可以定制一些需求。 再从功能角度上,单例类可以实现多态,也就是可以提前写一个模板单例,而静态类只能提前制定一个具体的单例。