当前位置: 代码网 > it编程>软件设计>交互 > UE4常用组件及函数

UE4常用组件及函数

2024年08月03日 交互 我要评论
是一个静态类,提供了许多与游戏玩法相关的静态函数。通过这个类,你可以在不需要拥有该类实例的情况下,直接调用其中的函数来执行各种操作。是UE中用于定义Actor几何形状和渲染属性的重要组件类,它为游戏的可视化和物理模拟提供了基础。,具有可视化的功能,可作为可视性剔除的粒度和渲染属性规范(如投射阴影等)。是虚幻引擎(UE)中用于渲染和物理交互的基础组件类。

常用组件

uactorcomponent

actorcomponent 是组件的基础类,定义可被添加到不同类型 actor 的重复使用行为。它们主要用于将几何体与 actor 关联起来,如碰撞几何体或渲染网格体,控制 actor 在世界场景中的移动方式、播放与 actor 相关的声效、使 actor 能投射光影到世界场景等。

uscenecomponent

scenecomponent 是 actorcomponent 的延伸,拥有一个变形,即位置、旋转和尺寸。附加的一个变形意味着 scenecomponent 可以相互附着。

uprimitivecomponent

uprimitivecomponent是虚幻引擎(ue)中用于渲染和物理交互的基础组件类。它继承自uscenecomponent,具有可视化的功能,可作为可视性剔除的粒度和渲染属性规范(如投射阴影等)。

uprimitivecomponent是ue中用于定义actor几何形状和渲染属性的重要组件类,它为游戏的可视化和物理模拟提供了基础。

ucameracomponent:用于控制相机的组件。

ulightcomponent:用于控制灯光的组件。

静态网格组件(static mesh component)

ustaticmeshcomponent* staticmeshcomponent = createdefaultsubobject<ustaticmeshcomponent>(text("staticmeshcomponent"));
staticmeshcomponent->setstaticmesh(yourstaticmesh);

动画组件(animation component)

uaniminstance* animinstance = createdefaultsubobject<uaniminstance>(text("animationcomponent"));

音频组件(audio component)

uaudiocomponent* audiocomponent = createdefaultsubobject<uaudiocomponent>(text("audiocomponent"));
audiocomponent->setsound(yoursound);

粒子系统组件(particle system component)

uparticlesystemcomponent* particlecomponent = createdefaultsubobject<uparticlesystemcomponent>(text("particlecomponent"));
particlecomponent->settemplate(yourparticlesystem);

 动画蒙太奇通知窗口组件

void uplaymontagenotifywindow::branchingpointnotifybegin(fbranchingpointnotifypayload& branchingpointpayload)
{
    // 输出 branchingpointpayload 的某些成员变量的值
    ue_log(logtemp, display, text("branchingpointpayload value: %f"), branchingpointpayload.payloadvalue); 
}

“fbranchingpointnotifypayload”通常是一个自定义的数据结构(结构体或类),用于传递与分支点通知相关的数据。

它包含了各种与动画蒙太奇(montage)中的分支点相关的信息。具体包含哪些成员变量取决于项目的具体需求和设计。

它包含以下类型的信息:

  • 分支点的标识或名称,以便识别特定的分支点。
  • 与分支点相关的参数或数据,这些参数可能用于控制动画的流程、行为或其他相关逻辑。
  • 可能还包含其他与动画状态、条件或事件相关的数据。

常用函数

 ugameplaystatics

       是一个静态类,提供了许多与游戏玩法相关的静态函数。通过这个类,你可以在不需要拥有该类实例的情况下,直接调用其中的函数来执行各种操作。

  • spawnobject:创建一个对象。
  • beginspawningactorfromblueprint:从蓝图中生成实例,但不会自动执行它的构造脚本。
  • begindeferredactorspawnfromclass:生成一个actor类的实例,但是不会自动执行它的构造脚本。
  • finishspawningactor:结束生成actor,执行构造脚本。
  • getactorarrayaveragelocation:获取actor数组的平均位置。
  • getactorarraybounds:获取actor数组的边界。
  • getallactorsofclass:获取此类的actor数组。
  • getallactorswithinterface:获取拥有此接口的actor数组。
  • getallactorswithtag:获取此tagactor数组。
  • getgameinstance:获取ugameinstance
  • getplayercontroller:获取aplayercontroller
  • getpawn:获取apawn
  • getcharacter:获取acharacter
  • getplayercameramanager:获取aplayercameramanager
  • openlevel:加载关卡。
  • loadstreamlevel:加载streamlevel
  • unloadstreamlevel:卸载streamlevel
  • getworld:获取当前世界。
  • getauthgamemode:获取当前授权的游戏模式。
  • getgamestatebase:获取游戏状态。
  • applydamage:应用伤害。
  • playworldcamerashake:播放世界相机震动。
  • spawnemitteratlocation:在目标位置生成粒子。

tsubclassof 

    是一个提供 uclass 类型安全性的模板类。例如,假设您正在创建一个弹丸类,该类允许设计器指定损坏类型。可以只创建一个 uclass 类型的 uproperty,并希望设计器始终分配派生自 udamagetype 的类,或者可以使用 tsubclassof 模板强制执行该选择。下面的示例代码说明了其中的区别:

/** type of damage */
uproperty(editdefaultsonly, category=damage)
uclass* damagetype;

/** type of damage */
uproperty(editdefaultsonly, category=damage)
tsubclassof<udamagetype> damagetype;

在第二个声明中,模板类告诉编辑器的属性窗口仅列出派生自 udamagetype 的类作为属性的选项。在第一个声明中,可以选择任何 uclass。下图说明了这一点。

图像替代文本

strategygame的弹丸蓝图示例

除了这种 uproperty 安全性之外,您还可以获得 c++ 级别的类型安全性。如果尝试将不兼容的 tsubclassof 类型相互分配,则会出现编译错误。如果尝试分配泛型 uclass,它将执行运行时检查以验证它是否可以执行分配。如果运行时检查失败,则结果值为 nullptr。

uclass* classa = udamagetype::staticclass();

tsubclassof<udamagetype> classb;

classb = classa; // performs a runtime check

tsubclassof<udamagetype_lava> classc;

classb = classc; // performs a compile time check

getworldtimermanager()

  是ue4中用于获取全局定时器管理器的函数。全局定时器管理器用于管理游戏中的定时器,它存在于游戏实例对象上以及每个场景中。

 

通过调用getworldtimermanager(),可以获取到全局定时器管理器的引用,然后可以使用该管理器来设置、暂停、恢复、清除定时器等操作。

 

以下是一个使用getworldtimermanager()的示例代码:

 
ftimerhandle timerhandle;
getworldtimermanager().settimer(timerhandle, this, &yourclass::yourfunction, 5.0f, true);
 

在上述代码中,首先创建了一个ftimerhandle类型的变量timerhandle,用于保存定时器的句柄。然后,使用getworldtimermanager().settimer()函数来设置一个定时器。该函数的参数包括:

 
  • timerhandle:定时器句柄的引用,用于保存设置的定时器。
  • this:指定定时器所属的对象。
  • &yourclass::yourfunction:定时器到期时要执行的函数指针。
  • 5.0f:定时器的时间间隔,单位为秒。
  • true:表示定时器是否循环执行。
 

这样,就设置了一个每隔5秒执行一次yourfunction函数的定时器。

 获取自身自带的组件

目标类型* 变量名= cast<目标类型>(this->getcomponentbyclass(目标类型::staticclass()));
//用于根据指定的组件类来获取该类的组件实例。
//staticclass() 是一个用于获取类的静态信息的函数。

需要注意的是,getcomponentbyclass 返回的是 uactorcomponent* 类型的指针,需要使用 cast 函数进行类型转换以获取特定类型的组件指针。如果转换失败(即组件不是指定的类型),则转换后的指针为 nullptr ,可以通过判断指针是否为空来处理这种情况。

角色运动绑定函数

“bindaction”通常用于在 unreal engine 4(ue4)中绑定输入动作到特定的函数或方法。它是一种将用户输入(例如按下键盘按键、点击鼠标等)与游戏中的操作或事件关联起来的方式。

playerinputcomponent->bindaction("discardweapon", ie_pressed, this, &amycharacter::discardweapon);

在上述代码中,通过playerinputcomponent->bindaction将名为“discardweapon”的动作与amycharacter类中的discardweapon函数进行绑定,当该动作被触发(例如按下对应的按键)时,将调用amycharacter::discardweapon函数。

除了ie_pressed,还有其他的触发条件可用于bindaction,它们定义在einputevent枚举中,具体包括:

 
  • ie_released:表示当按键被松开时触发。
  • ie_repeat:用于连续触发的情况,例如按住按键时会不断重复触发相关操作。
  • ie_doubleclick:表示双击按键时触发。
  • ie_axis:轴事件类型,通常用于处理类似摇杆或鼠标移动等持续性的输入,并会返回一个值。
  • ie_max:枚举的最大值,一般不用于实际的绑定操作。

调整鼠标灵敏度

“addcontrolleryawinput”是 unreal engine 4(ue4)中 pawn 类的一个函数,用于给控制器的控制旋转添加输入(影响偏航),前提是该控制器是本地玩家控制器。

 

此函数的值会乘以玩家控制器的“inputyawscale”值。通常用于实现角色或 pawn 根据输入(例如鼠标移动)来进行左右方向的旋转。

playerinputcomponent->bindaxis("turn", this, &amonsterplayer::yawcamera);
playerinputcomponent->bindaxis("lookup", this, &amonsterplayer::pitchcamera);
void amonsterplayer::yawcamera(float axisvalue)
{
	addcontrolleryawinput(axisvalue * mousespeed);
}

通过改变自己定义的mousespeed的值来更改鼠标移动速度

延迟函数

首先,创建一个 flatentactioninfo 结构体,用于存储异步操作的相关信息,例如延迟后要执行的函数、函数的归属者以及异步操作的 id 等。然后,通过 ukismetsystemlibrary::delay 函数来设置延迟。

#include "kismet/gameplaystatics.h" 
#include "engine/world.h" 

uclass()
class yourclass : public aactor
{
public:
    // 延迟结束后的回调函数,声明处必须加 ufunction,否则反射系统找不到这个函数
    ufunction()
    void delayfinish(); 

    void beginplay() override
    {
        super::beginplay(); 

        // 创建一个 latentinfo,用不到 linkage 直接传 0(不能是-1),uuid 随机生成,指定延迟后要执行的函数 executionfunction,以及 executionfunction 的归属者 this
        const flatentactioninfo latentinfo(0, fmath::rand(), text("delayfinish"), this); 
        ukismetsystemlibrary::delay(this, 3.0f, latentinfo); 
    }
};

// 定义延迟结束后的回调函数
void yourclass::delayfinish()
{
    // 在这里添加延迟结束后要执行的具体操作
    ue_log(logtemp, log, text("delay 结束!")); 
}

定义了一个 delayfinish 函数作为延迟结束后的回调函数。在 beginplay 函数中,创建了 flatentactioninfo 结构体实例 latentinfo,设置了 linkage 为 0(虽然资料较少,但一般直接传 0 即可),使用 fmath::rand 生成随机的 uuid,指定延迟结束后要执行的函数为 delayfinish,并将 this 作为 executionfunction 的归属者(即表明 delayfinish 是当前类的成员函数)。最后,通过 ukismetsystemlibrary::delay 函数传入当前对象 this、延迟时间 3.0f 和 latentinfo 来启动延迟操作。

flatentactioninfo 是一个结构体,用于存储异步操作的相关信息。它包含了以下几个成员:

 
  • linkage:执行函数中的恢复点,是一个整数。一般情况下,如果用不到可以直接传 0,但不能是-1。
  • uuid:本次异步操作的 id,用于标识此次操作。通常可以使用 fmath::rand() 生成一个随机数,或者通过其他方式生成一个唯一的标识。
  • executionfunction:要执行的函数名,类型为 fname。需要使用 text() 宏进行转换。
  • callbacktarget:执行函数的归属者,即表明 executionfunction 是 callbacktarget 的成员函数。它是一个 tobjectptr<uobject> 类型的弱指针。

ukismetsystemlibrary

ukismetsystemlibrary是虚幻引擎(unreal engine)中的一个类,它包含了许多有用的函数,可用于各种不同的操作,例如打印调试信息、进行射线检测、移动组件、加载资产、获取游戏相关信息等。

 

以下是ukismetsystemlibrary中一些常见函数的介绍:

 
  • stacktrace:打印一个堆栈跟踪到日志,以便查看蓝图是如何到达某个节点的。
  • isvalid:判断一个对象是否可用(非空且未被标记为待删除)。
  • getobjectname:返回指定对象的实际对象名称。
  • getpathname:返回指定对象的完整路径名。
  • getdisplayname:返回对象的显示名称(在编辑器构建中是 actor 标签,在非编辑器构建中是实际对象名称),主要用于调试辅助显示,不应被用于唯一标识 actor,也不适合用于向游戏的最终用户显示,因为它没有被本地化。
  • getclassdisplayname:返回一个类的显示名称。
  • getengineversion:获取引擎的版本号,用于向最终用户显示。
  • getgamename:获取当前游戏的名称。
  • getplatformusername:获取操作系统中的当前用户名。
  • getgametimeinseconds:获取当前游戏时间(以秒为单位),当游戏暂停时它会停止,并且会受到慢动作的影响。此函数需要传入一个worldcontextobject参数,表示世界上下文。
  • isserver:根据提供的世界上下文对象,判断该对象所在的世界是否为主机。
  • isdedicatedserver:判断是否运行在专用服务器上。
  • ispackagedfordistribution:判断是否是为了分发而打包的构建。
  • getuniquedeviceid / getdeviceid:获取平台特定的唯一设备 id。
  • makeliteralint / makeliteralfloat / makeliteralbool:分别创建一个指定值的整型、浮点型或布尔型的字面值。
  • delay:用于实现延迟操作。可以创建一个flatentactioninfo结构体来设置延迟的相关信息,例如延迟后要执行的函数、函数的归属者以及异步操作的 id 等,然后通过该函数来启动延迟。
  • linetracesinglebyprofile:进行基于配置文件的单次射线检测。

射线检测

虚幻引擎中的射线检测主要分为单通道和多通道检测,根据检测目标还可分为通道检测和目标物体类型检测。常见的射线检测类型包括:

单通道射线检测:通过指定通道类型(如ecc_visibility)进行检测。定义射线的起始位置、方向和碰撞返回数据(fhitresult)。需注意被检测对象在该通道的“visibility”需设置为阻挡状态,否则可能检测不到。例如:

fhitresult hitresult; 
bool btemphit = ukismetsystemlibrary::linetracesinglebyprofile(getworld(),hitresult, startlocation, endlocation, ecc_visibility); 

单通道根据目标物体类型进行检测:首先定义fcollisionobjectqueryparams的参数,然后使用addobjecttypestoquery方法添加目标通道。例如:

fcollisionobjectqueryparams tempobjecttype;
tempobjecttype.addobjecttypestoquery(ecc_worlddynamic); 
bool btemphit2 = ukismetsystemlibrary::linetracesinglebyprofile(getworld(),hitresult, startlocation, endlocation, tempobjecttype);

根据 profile 的名称进行检测:可以根据在项目设置-碰撞-preset 中新建的碰撞预设的名字进行检测,例如“cpptest”。也可以通过fcollisionqueryparams类型参数添加忽略检测的 actor。例如:

bool btemphit5 =  ukismetsystemlibrary::linetracesinglebyprofile(getworld(),hitresult, startlocation, endlocation, "cpptest"); 
// 或添加忽略检测的 actor 
fcollisionqueryparams tempqueryparams;
tempqueryparams.addignoredactor(this->getuniqueid()); 
bool btemphit5 = getworld()->linetracesinglebyprofile(hitresult, startlocation, endlocation, "cpptest", tempqueryparams);

多通道射线检测

  • 根据通道直接使用linetracemultibychannel,与单通道使用类似,但可返回多个结果。
  • 多对象类型检测使用linetracemultibyobjecttype,通过fcollisionobjectqueryparamsaddobjecttypestoquery添加多个目标通道。
  • 根据碰撞预设名进行多通道检测的方式可参考单通道根据 profile 名称检测的使用方式。
float seekradius = 100.0f; 
tarray<fhitresult> hitresults; 
fvector beginlocation = followcamera->getcomponentlocation(); // 起点位置 
fvector endlocation = beginlocation + followcamera->getforwardvector() * 1000; // 终点位置 

tarray<tenumasbyte<eobjecttypequery>> objecttypes; 
objecttypes.add(eobjecttypequery::objecttypequery2); // 添加要检测的对象类型,例如 pawn 

tarray<aactor*> ignoreactors; // 忽略的 actor 数组 

bool bishit = ukismetsystemlibrary::spheretracemultiforobjects(getworld(), beginlocation, endlocation, seekradius, objecttypes, true, ignoreactors, edrawdebugtrace::forduration, hitresults, true); 
if (bishit) {
    for (fhitresult hitresult : hitresults) {
        if (hitresult.getactor()!= null) {
            // 对检测到的 actor 进行相应的处理 
        }
    }
}

spheretracemultiforobjects 是 unreal engine 中用于进行球形碰撞检测的函数。它可以检测从起始点到结束点形成的球体范围内的多个对象。

 

以下是该函数的参数说明:

 
  • worldcontextobject:提供世界上下文的对象指针,通常是 getworld()
  • start:球体检测的起始位置向量。
  • end:球体检测的结束位置向量(用于确定球体的方向和范围)。
  • radius:球体的半径。
  • objecttypes:要检测的对象类型数组。通过 tenumasbyte<eobjecttypequery> 枚举指定对象类型。
  • btracecomplex:是否追踪复杂碰撞。
  • ignoreactors:要忽略的actor数组。
  • drawdebugtype:调试绘制类型,例如 edrawdebugtrace::forduration 表示在一段时间内显示调试痕迹。
  • outhits:用于存储碰撞结果的 fhitresult 数组。
  • bignoreself(可选):是否忽略自身。
 

该函数返回一个布尔值,表示是否检测到碰撞。如果检测到碰撞,碰撞结果将存储在 outhits 数组中

另外,还有其他形状的扫描射线检测,如sweepsinglebychannel,需提前定义扫描形状,可通过大小、类型、方向决定扫描形状效果。其相关函数sweepmultibyobjecttypesweepmultibyprofile的使用方式类似。

在进行射线检测时,需定义起始位置坐标和方向,同时设置相关变量的值,通常会与摄像机进行绑定。结束位置一般设置得足够远,以确保射线能够检测到目标物体。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com