UE面试题

1、UE中的变换(Transform)是什么,由哪几项构成?

在Unreal Engine中,变换(Transform)是一种可以应用于游戏对象的操作,旨在控制它们的位置(Position)、旋转(Rotation)和比例(Scale),以及其他一些变换属性。Transform操作是一种关键的游戏对象编辑和控制方法,可以大大改变游戏场景的外观、交互和动画效果。

Transform由以下三项构成:

  1. 位置(Position):物体在3D空间中的位置坐标,通常采用三维向量(x, y, z)表示。

  2. 旋转(Rotation):物体相对于中心点的旋转角度,通常采用四元数(Quaternion)或欧拉角(Euler Angles)表示。

  3. 缩放(Scale):物体的大小比例,通常采用三维向量(x, y, z)表示。

三种变换构成了物体的变换矩阵(Transform Matrix),该变换矩阵包含了物体的完整变换信息,可以通过矩阵变换矢量或者矩阵变换另一个矩阵来为物体进行相应的变换操作。

变换操作在游戏开发和设计中非常重要,因为它们可以帮助开发者更加轻松地控制3D模型和游戏对象的位置、旋转和缩放等属性,实现场景物体和角色的交互、动画和环境效果等。在Unreal Engine中,制作人员可以使用编辑器中内置的变换工具来调整场景中的物体和角色的变换属性,同时也可以通过代码进行变换操作。

2、旋转体(Rotator)中的X、Y、Z分别代表什么?

在Unreal Engine中,旋转体(Rotator)表示三维空间中的欧拉角(Euler Angles),在UE中可以通过Rotator来控制游戏对象的旋转(Rotation)属性,分别对应于三个轴向上的旋转角度。

具体来说:

  • X轴表示绕X轴旋转的角度,向右为正。

  • Y轴表示绕Y轴旋转的角度,向下为正。

  • Z轴表示绕Z轴旋转的角度,顺时针为正。

比如,当X轴为30度,Y轴为45度,Z轴为60度时,可以表示为(Rotator(30, 45, 60)),旋转的方向如下图所示:

     |     _ Y     
     |   _/
     | _/
     |/___X
     /
    /
 Z|/

3、向量的点乘和叉乘都是什么?常用于什么场景?由什么物理意义?

在数学和物理中,向量(Vector)的点乘(Dot Product)和叉乘(Cross Product)都是常用的向量运算方法。

点乘(Dot Product)

点乘又称为数量积,表示两个向量的乘积在两个向量夹角余弦值上的投影,其结果是一个标量(Scalar)。

点乘的常用场景包括计算向量之间的夹角、判断两个向量的方向是否一致、计算向量在某个方向上的分量等,同时在物理学中也广泛应用于计算功率、工作、力矩等实际问题。

叉乘(Cross Product)

叉乘又称为向量积,表示两个向量的叉积所得到的向量,其结果是一个向量(Vector)。

叉乘的常用场景包括计算两个向量所在平面的法向量、计算对于另一个向量的垂直分量、计算力矩、计算角动量等,同时也广泛运用于物理学、工程学、计算机图形学等领域。

点乘和叉乘是向量计算中非常基础且重要的运算,可以帮助我们更加深入地理解向量的基本性质和物理意义,并且提供了各种各样的实际应用场景。

4、欧拉角和四元数?

欧拉角(Euler Angle)和四元数(Quaternion)都是常用于表示物体旋转的方法。

欧拉角

欧拉角是一种通过三个旋转角度来表示物体的旋转姿态的方法。在三维空间中,通常使用三个坐标轴的旋转角度:俯仰角(Pitch)、偏航角(Yaw)、滚转角(Roll)。这些角度可以表示为不同的顺序,通常有以下三种方式:

- xyz (Roll-Pitch-Yaw):先绕X轴滚转,再绕Y轴俯仰,最后绕Z轴偏航。
- yxz (Yaw-Pitch-Roll):先绕Y轴偏航,再绕X轴俯仰,最后绕Z轴滚转。
- zxy (Yaw-Roll-Pitch):先绕Z轴偏航,再绕X轴滚转,最后绕Y轴俯仰。

欧拉角的主要优点在于它们易于理解和可视化,但是欧拉角也存在一些问题,最主要的问题是称为万向节锁(Gimbal Lock),当某个旋转角度达到顶点时,会产生计算错误和失真的问题。

四元数

四元数是一种更加高效、鲁棒和通用的旋转表示方法。它可以看作是一个旋转向量和一个标量构成的复数,表示通过沿着一个轴旋转一个特定的角度进行的旋转。

四元数的优点在于它们可以避免万向节锁和旋转角度的奇异性,而且可以对于旋转的插值和构建更容易和高效,同时它们也广泛应用于计算机图形学、动画、物理仿真等领域。

因此,欧拉角和四元数都是常用于物体旋转表示的方法,具有各自的优点和适用场景。

5、继承是什么,什么时候用继承?

在Unreal Engine中,所有的游戏对象都是从一个基本类Actor或者Pawn派生而来的,这个基本类包含了所有游戏对象公有的属性和方法。而继承就是一种面向对象编程的概念,在UE中可以通过继承来实现一种新的类,并从原来的类中继承并扩展一些功能。

在UE中,继承是指创建一个新的类,并使用已有的类作为其基类,新的类将继承所有基类的属性和方法,同时还可以添加自己的属性和方法并覆盖基类的方法。在UE的类继承机制中,有两种基本的继承关系:Actor->Pawn和Actor->Actor,前者用于再现游戏对象和自定义玩家操控角色,后者用于创建一类具有常规或常见的值的类。如果想要创建新的游戏对象或者角色,可以通过继承Actor或者Pawn来实现,从而获得并扩展这些基类的特征。

继承的优点在于避免了重复性的代码编写,可以利用已有的基类代码来构建新的类。在UE中,继承应该在需要创建新的类并希望继承基类的属性和方法的情况下使用。通常,UE编辑器的蓝图系统(Paper2D、UMG UI等)或编程语言C++中都可以用来实现继承。

例如,在UE中想要创建一个新的角色类,并从基类Pawn继承其属性和方法,并添加一个自定义方法(例如Jump()),可以通过如下的蓝图实现:

1. 创建一个新的蓝图,并选择Pawn作为其父类。
2. 添加一个自定义的C++代码或蓝图节点,用于实现你的Jump()逻辑。
3. 编辑基类属性(Mesh、Movement等)。
4. 保存并生成新的角色类,可以在UE编辑器中看到它出现在Content Browser中。
5. 可以进一步编辑你的蓝图来自定义你的自定义属性、方法和蓝图节点。
6. 将新的角色类引入你的游戏或场景中,可以用于代表寒冰雪原中的角色或任何你需要的自定义游戏对象。

继承使代码更简单、更清晰,可以更高效地开发和维护UE项目。

6、接口是什么,什么时候用接口?

在Unreal Engine中,接口(Interface)是一种将方法声明组合到一起,与具体的类或对象无关的特殊类。接口没有实际的类或对象,而只是一个规范,定义了实现该接口的对象应该实现哪些方法。

在UE中,接口是用于定义一组公共方法,这些方法可以被多个不同的类或对象实现。一个类或对象可以实现多个接口,实现这些接口时需要具体实现接口中定义的所有方法。当一个对象实现了一个接口时,它可以被视为该接口的实例,在该接口的上下文中被使用。

在UE中,接口可以用于让多个类实现某个特定功能,提高代码复用性。例如,如果有几个角色类都需要执行跳跃操作,可以创建一个接口来定义跳跃操作(例如Tickable、Interactable等),然后让这些角色类都实现接口中的跳跃方法,这样当其他对象需要和这些角色类交互时,就可以使用接口定义的方法,而无需编写重复的代码。

此外,在UE中,接口可以用于实现“泛型编程”,这是指编写能够适用于多个数据类型(如不同的游戏对象或玩家角色)的较为通用的代码。通过接口,开发者可以编写能够适用于多个对象或类的通用代码,从而提高游戏的代码复用性和可维护性。

在UE的实现中,接口可以通过蓝图或C++语言来声明和实现。在蓝图中,可以通过创建一个新的接口类,并传递一组方法,然后实现这些方法来创建接口。在C++中,可以使用关键字“interface”和“UInterface”来定义新的接口。

因此,当需要定义并实现多个不同对象共有的一组方法,同时提高代码复用性,并使得编写起来更有灵活性时,可以使用UE的接口机制。

7、Actor和组件的区别?实现新功能什么时候用actor,什么时候用组件?

在Unreal Engine中,Actor和组件是两个重要的概念,它们都是构建游戏的基本单元。它们之间的区别和使用场景如下:

Actor
Actor是UE游戏中最基本的对象,表示游戏中的物体或角色,它们可以移动、渲染、与其他游戏对象交互等。在UE中,每个Actor都有自己的Transform。

在实现新功能时,可以创建新的Actor来表示新的游戏对象。例如,如果你需要添加新的NPC角色,则可以创建一个新的Actor类,定义角色的特征如:模型、动画、AI、属性等,并添加到游戏世界中。每个Actor都可以包含一组组件,这些组件是Actor的子对象,用于增强Actor的功能。

组件(Component)
组件是Actor的子对象,它们是Actor最基本的部分。组件可以被添加到Actor上,以为Actor提供新的功能或属性,例如渲染、输入、碰撞和音频等。在UE中,许多游戏对象都是由多个组件组成的(如静态地形可以由TerrainComponent和FoliageComponent等组件组成)。

在实现新功能时,使用组件可以为一个Actor提供所需的新功能。例如,对于一个包含多个角色的世界,如果想添加一个新的HUD要素,可以将组件添加到一个具有HUD功能的Actor上,然后将该Actor添加到世界中。组件还可以使代码更具可重用性和可维护性,因为开发者可以编写一组可用于多个Actor的通用组件(如UI组件、音频组件等)。

因此,使用Actor还是组件取决于具体情况和所需实现的功能。如果需要创建完整的游戏对象(比如角色、道具等),可以使用Actor,如果需要为游戏对象添加新的属性或功能,则可以使用组件。使用Actor和组件可以使代码组织更加灵活、可复用性更强,并且使得实现具有一定的可扩展性。

8、三个常用类Actor,Pawn,Character,关系和区别?

在Unreal Engine中,Actor、Pawn和Character是三个常用的类,它们之间有着一些关系和区别,如下所示:

1. Actor
Actor是最基本的类,表示游戏中的任何物体或角色,包括功能非常简单的物体,如静态网格、灯光,也包括高级的角色和NPC等。每个Actor都有自己的Transform,并且可以包含一组组件,用于增强Actor的功能。

2. Pawn
Pawn是Actor的子类,表示游戏中的角色或游戏玩家,通常是游戏中所有可控制对象的基类。Pawn具有一组与输入和移动相关的继承属性,例如调用控制器函数、设置移动输入方向、处理移动命令、以及进行各种输入组合等功能。Pawn可以自己处理移动、碰撞等事件,并且它可以包含多个组件组成一个完整的游戏对象。

3. Character
Character是Pawn的子类,它在Pawn的基础上增加了额外的功能,如动画、状态机、人物属性等。具体地,Character包含一个网络同步的状态机,该状态机控制着自己身上的动画,包括行走、跳跃、攻击等动作,以及其他的逻辑操作。同时,Character也有自己的属性系统:包括生命值、能量值以及各种角色属性,如速度、力量、敏捷等,这些属性可以通过BP或C++进行继承和扩展。

因此,Actor、Pawn和Character三者之间的区别可以简要概括为:Actor是最基本的对象和角色,Pawn是一个基础的可控制角色,Character是一种将Pawn进一步增强的高级可控制角色。同时,Pawn和Character都是从Actor继承而来的,因此它们拥有Actor类的全部属性和方法。根据具体场景和需求,游戏开发者可以选择使用不同的类来实现游戏中的不同角色和对象,例如:如果需要控制多个角色,则可以使用Pawn;如果需要添加更多的角色属性和动画等,则可以使用Character。

9、什么时候使用UObject?

在Unreal Engine中,UObject是基类,用于创建各种物体和资源,如Actor、Component、Texture等。任何集成自UObject的类实例都提供了在运行时处理对象和资源的功能,这使得UObject成为Unreal Engine的重要组成部分之一。

当需要管理和存储对象和资源时,一般会使用UObject类。以下情况是使用UObject的典型示例:

1. 存储游戏中的世界和关卡信息,比如地图、关卡、环境等。

2. 创建和管理Actor、Component、Widget、Material和Texture等资源。

3. 在蓝图和C++代码中管理变量和状态。

使用UObject有很多好处,如:

1. 提供了完整的对象序列化和反序列化功能,可以让对象数据持久化到硬盘上或在不同进程之间共享对象数据。

2. 所有UObject对象都可以在运行时反射和修改,这使得对象或资源之间的互动和调试更方便。

3. UObject可以实现自定义的GC(垃圾回收)过程,从而减少资源泄漏和内存损耗。

4. 通过继承UObject类,可以享受到Unreal Engine提供的大量优秀的API接口和内置功能。

因此,当需要创建和管理Unreal Engine中的物体和资源时,常常会使用UObject类实现,以获得持久化、反射、GC等方面的好处。

10、WorldContextObject是什么?

在Unreal Engine中,WorldContextObject是一个包含有关当前世界(World)的上下文信息的对象。WorldContextObject通常作为参数在函数调用中传递,以便函数可以访问有关当前世界的信息。

WorldContextObject是一个指向UObject的指针。通过WorldContextObject,可以访问当前世界的许多属性和方法,例如:

1. 获取当前世界(World)的引用。

2. 获取当前游戏模式(GameMode)的引用。

3. 获取当前的LevelScriptActor。

4. 获取时间相关的信息,如DeltaSeconds和RealTimeSeconds等。

5. 获取引擎和游戏设置的各种信息,如视角、用户设置等。

在UE中,WorldContextObject的一个常见用例是作为游戏蓝图中函数的参数,以便这些函数可以访问当前世界的上下文信息。例如,可以使用WorldContextObject在蓝图中实现一些特定于世界的逻辑,比如在特定的地图中触发特殊的音效或效果。

总之,WorldContextObject是一个包含当前世界上下文信息的对象,在许多场景中都是必须的对象,可用于访问世界的许多属性和方法。

11、UE中函数和事件的区别?

在Unreal Engine中,函数和事件都是可编程的代码块,用于执行特定的操作。虽然它们在概念上非常相似,但在使用时有细微的差别。

函数(Function)是一种带有输入参数和返回值的代码块。函数通常会执行一些特定的计算,根据输入参数计算结果,并将计算结果返回给调用者。在程序中,函数可以方便地重复使用,并可以使用参数进行自定义。在Unreal Engine中,函数可以用于在蓝图和C++代码之间共享行为。

事件(Event)是一种在特定条件下触发的代码块,可以用来响应用户或其他系统的行为。例如,当玩家按下键盘上的特定按键时,可以触发一个事件,例如按下“跳跃”键。事件也可以通过蓝图或C++代码进行定义和触发。

根据上述描述,函数和事件的区别可以总结如下:

1. 函数是一种计算型代码块,而事件则是一种响应型代码块。

2. 函数需要显式地调用才能执行,而事件则是在特定条件下自动触发。

3. 函数通常有输入参数和返回值,而事件没有输入参数和返回值。

4. 函数的执行通常是立即的,而事件的执行通常是异步的。

在实际开发中,可以根据具体情况选择何时使用函数和事件。函数通常用于定义和重复使用特定行为,而事件则通常用于响应用户或其他系统行为。

12、如何在sequence中触发蓝图功能?

在Unreal Engine中,Sequence是一种用于制作动画和交互式场景的可视化编辑工具。如果您想要在Sequence中触发蓝图功能,您可以通过在Sequence中添加并设置一个Event Track来完成。

以下是在Sequence中触发蓝图功能的基本步骤:

1. 在需要触发蓝图功能的地方,向Sequence中添加Event Track。

2. 选择Event Track并在轨道上右键单击,然后选择“Add Event”。

3. 在弹出的“Event”窗口中,勾选“Blueprint”选项。

4. 从列表中选择要触发的蓝图功能。如果列表为空,则需要先在蓝图中创建相应的功能。

5. 点击“OK”按钮,然后调整事件的持续时间和重复次数等属性。

6. 在需要触发蓝图功能的时间点上,在Event Track上创建一个关键帧。

7. 在关键帧上,可以通过属性面板来调整事件触发时的参数值,也可以通过蓝图进行更进一步的操作。

8. 启动Sequence预览或在游戏中播放,然后等待事件触发。

总之,通过在Sequence中添加并设置Event Track,可以很容易地在Sequence中触发蓝图功能。请注意,此步骤仅适用于蓝图函数等可在运行时调用的功能。如果要执行的操作需要修改场景或其他复杂操作,则需要考虑使用Actor蓝图或Level蓝图等更高级别的编程方法。

13、Sequence中能否嵌套子Sequence,有什么注意事项

在Unreal Engine中,Sequence是一种可视化编辑工具,用于制作动画和交互式场景。在Sequence中,可以嵌套其他Sequence,以便更好地组织复杂的动画和场景。下面是关于在Sequence中嵌套子Sequence的几个要点和注意事项:

1. 如何在Sequence中嵌套子Sequence?

要在Sequence中嵌套子Sequence,您可以使用Track中包含子Sequence的方式。在Sequence的轨道栏中,有许多类型的轨道可用于显示事件,音频,Animation,子Sequence等。要嵌套子Sequence,您需要创建一个子Sequence轨道并向其中添加一个子Sequence。

添加子Sequence轨道后,您将看到子Sequence轨道上的关键帧用于标记子Sequence的开始和结束。为了添加子Sequence,请右键单击子Sequence轨道上的关键帧,然后选择“Add SubSection”,在弹出的窗口中选择要添加的子Sequence。

2. 子Sequence何时开始播放?

要使子Sequence开始播放,您需要在父Sequence中将子Sequence关键帧拖动到父Sequence时间轴上。可以将子Sequence嵌套到其他Sequence中的方式有所不同,但您可以通过根据需要添加或移除关键帧来控制何时子Sequence开始播放。

3. 注意事项

当在Sequence中嵌套子Sequence时,需要注意以下几个问题:

- Sequence中的子Sequence会继承父Sequence的属性设置。如果您想对子Sequence进行单独控制,则需要在子Sequence轨道上设置子Sequence的持续时间、重复次数等属性。

- 当父Sequence和子Sequence都在运行时,可能会出现时间轴的同步问题,因为子Sequence在父Sequence的主时间轴下运行。为了避免此类问题,建议在子Sequence的时间轴上,不要使用StopAtTime等行为,以避免与父Sequence的时间轴冲突。 

总之,在父Sequence中嵌套子Sequence是一种强大的方式,可用于组织、调整和重复Sequence的部分内容或整体,但需要注意上述问题以实现预期的结果。

14、LevelSequenceActor放在场景中可以提供什么功能?

在Unreal Engine中,Level Sequence(关卡序列)是一种专为实现电影和游戏之间高度互动的场景视觉故事而设计的时间线编辑工具。而LevelSequenceActor(关卡序列Actor)则是一种特殊的Actor,用于将关卡序列放置在场景中以提供更多的交互和控制功能。下面是LevelSequenceActor在场景中提供的一些主要功能:

1. 播放关卡序列

将LevelSequenceActor放入场景中后,可以使用UE的事件图表系统(Blueprints)来启动、暂停、停止、重置等关卡序列的播放控制。通过LevelSequenceActor图标的右键单击可以找到“Bindings”选项卡,从中可以设置蓝图控制器或该Actor中的组件与序列中的Trigger和Variable关联起来。这些关联可以触发、控制和连接到序列中的关键点使之启动。

2. 监听关卡序列事件

LevelSequenceActor提供一些事件可以在Sequence播放时被捕获,例如序列开始播放、结束播放、暂停播放等。您可以使用这些事件来执行自定义的蓝图逻辑,例如在序列结束时显示一个UI、重置关卡的状态等。

3. 更好的控制动画和相机

LevelSequenceActor支持直接在关卡序列中编辑相机的位置、角度和插值,通过在关卡序列中添加相机角度、相机移动轨迹来实现复杂的相机运动效果。可以使用UE的时间线编辑器(Timeline Editor)来创建流畅的动画效果,并通过调整序列中的AnimationSection的跟踪曲线,也可以播放动画蒙太奇和物体行为以改变场景中的物体状态。

总之,将LevelSequenceActor放入场景中可以极大地拓展序列的交互性和控制范围,为游戏制作和场景演示提供了更好的工具和手段。

15、Sequence的任意值类型轨道由什么通用性?

在Unreal Engine中,Sequence(序列)是一种时间线编辑工具,用于在关卡中创建动画、相机运动等表现场景中的各种内容。任意值类型轨道(Generic-Type Track)是一种通用的序列轨道类型,它可以用来追踪任意类型的值,例如表示特定对象或场景中其他数据的变化。

由于任意值类型轨道具有通用性,作为一种常见的轨道类型,它具有以下通用性:

1. 可以追踪任意类型的数据

任意值类型轨道可以追踪任意类型的数据,例如布尔值、整数、浮点数、向量、旋转等。由于轨道可以追踪所有值类型,因此它可以被用于许多不同的场景中。

2. 可与蓝图逻辑和时间线曲线一起使用

任意值类型轨道可以与蓝图逻辑和时间线编辑器中的曲线一起使用,使其更加灵活和强大。可以应用各种时间线曲线智能地控制值在序列中的变化,或者设置关键帧来确保正确地编辑和处理追踪的值。轨道当前值还可以在逻辑蓝图中使用来实现更多功能。

3. 便于与其他轨道交互

任意值类型轨道不仅可以独立运作,还可以和其他轨道进行交互。例如,当需要相机沿着路径运动时,可以使用放置路径的Transform轨道和相机运动的位置并联使用,通过偏移轨道创造出甚至更复杂的运动。

总之,由于任意值类型轨道的数据可以追踪所有数据类型,因此在UE中,它是一种常见的序列轨道类型,能够为各种场景动画和相机运动等行为提供更多的强大和更自定义的精细控制方式。

16、是否了解主关卡加载子关卡的分工合作模式?

在Unreal Engine中,主关卡和子关卡是一种常见的场景组织方式,其中子关卡只包含场景的一部分,主关卡则将这些部分添加到一个整体场景中。在加载时,主关卡可以通过多种方式与子关卡进行分工合作。

主要有以下两种在UE中进行子关卡加载的方式:

1. Streaming Levels

Streaming Levels是一种功能强大的UE子关卡加载方式,它可以根据需要分段加载场景,既可以提高性能,也可以保证主关卡更流畅,并且在关卡编辑器( Level Editor )内可以预先放置子关卡拼凑整体场景。Streaming Levels可以根据需要加载并且可以管理场景资源,也可以在运行时轻松地添加,移除和替换子关卡。

2. Level Sequences

Level Sequences也是一种使用动画序列编辑器的UE子关卡加载方式,它允许您使用序列编辑器在关卡中设置动画和相机轨道的位置与旋转等动画效果,序列会认定子关卡的动态激活,并在需要时快速激活或禁用特定子关卡。

无论使用哪种方式,主关卡都可以方便地与子关卡进行交互。在载入时,主关卡可以预先加载子关卡中的资源,并根据需要将它们添加到场景中,从而为子关卡提供更容易的访问,提高整个的游戏性能,保证玩家游戏体验。

需注意使用Streaming Levels 最佳实践为: 每个Streaming Level大约应该是3到4个Kilobytes 在大小范围内 (最大不超过400MB)并且不要过多的拆分区域,以免加载过程时间过长。

17、蓝图加载和固定加载的区别?

在Unreal Engine中,蓝图加载和固定加载是两种常见的资源加载方式,它们在加载时会有一些不同之处。

1. 蓝图加载

蓝图加载是使用蓝图编辑器创建的图表类型来描述一个系统或对象的运行行为,它是一种动态加载模式,加载后实例化多个同样的蓝图内容。在蓝图加载时,蓝图只是一个定义,您需要调用LoadClass或Class.LoadObject等功能去加载并且实例化它,然后在运行时使用它。这种加载方式可以减少游戏的内存占用,加快工作流程和提高开发效率。但是它在加载和实例化的过程中需要更多的运行时计算资源,可能会对游戏性能产生一些负面影响。

2. 固定加载

固定加载通常是指在编译时就已经加载完成并预先实例化的资源,这些资源在游戏中是可以直接使用的。这种加载方式常用于一些复杂的场景构建或模拟运算,它可以在游戏开始时保证资源的可用性,减少了游戏运行时的计算开销,从而提高游戏表现。

总之,两种加载方式都有其优点和不足各提供适用的场景和用例,而UE中通常使用这两种方式中的一种或者二者配合使用来满足开发需求。如果需要更灵活的资源加载方式,蓝图加载比较合适;而如果需要在特定时间点和场景下保证资源的高效稳定的使用,固定加载可能更为可靠并且节省开销。

18、蓝图中如何动态修改材质的某个属性?

在Unreal Engine中,您可以使用蓝图动态修改材质的某个属性,下面是具体的步骤:

1. 首先,您需要创建一个带有材质的Actor或创建蓝图并选择一个带材质的组件。

2. 打开蓝图并添加一个动态材质实例(Dynamic Material Instance)节点。

3. 将材质实例节点拖到蓝图上,并使用Get的方法获取材质实例。

4. 从蓝图节点中找到Set Vector Parameter Value节点。将材质的Material节点连接到Target节点。在Vector Parameter的名称字段中输入您需要修改属性的名称,例如,如果您需要更改漫反射颜色,可以输入Diffuse Color。

5. 随后,您需要为Vector Value设置一个新值。拖动鼠标连接到Vector Value,打开一个Color Picker或者使用Vector作为颜色属性的另一个蓝图节点。

6. 最后,将您设置好的材质实例更新到所需要的目标点即可实时更新材质属性的值。

参考下面的伪代码实例:

```unrealengine
//获取Mesh组件
UPrimitiveComponent* MeshComponent = GetMeshComponent();

// 获取材质
UMaterialInterface* Material = MeshComponent->GetMaterial(0);

// 将材质转为Dynamic Material Instance
UDynamicMaterialInstance* DynamicMaterial = MeshComponent->CreateDynamicMaterialInstance(0, Material);

// 将Diffuse属性的颜色通过Set Vector Parameter Value节点设置为红色
DynamicMaterial->SetVectorParameterValue(FName("Diffuse Color"),FLinearColor(1.f,0.f,0.f,1.0f));
```

19、蓝图中如何触发例子系统发射?

在Unreal Engine中,您可以使用蓝图触发粒子系统发射,下面是具体步骤:

1. 首先,您需要在场景中或组件中添加一个粒子系统。如果您需要为此粒子系统创建一个自定义蓝图,则可以使用带粒子系统组件的Actor或创建一个自定义组件。

2. 找到触发发射的事件或条件,例如角色移动,按下按键或按照计时器发射等等。下面以按下按键为例。

3. 在蓝图中添加一个输入事件(Input Event),并将它命名为您需要的按键名称,例如SpaceBar或鼠标左键。

4. 从Input Event节点中拖出一个Create Event节点,然后选择对应的粒子系统组件。

5. 从Create Event节点中拖出Spawn Emitter At Location节点,并将粒子系统节点连接到Emitter Template节点。您可以在场景中设置发射器的位置和旋转值。

6. 接下来,您可以使用此节点连接到其他的节点来实现您的需求,例如,您可以添加一个变量节点来设置粒子的生命周期、大小,形状、颜色等。

参考下面的伪代码实例:

```unrealengine
//获取粒子组件并播放发射器。
UParticleSystemComponent* ParticleSystemComp = GetParticleSystemComponent();

//获取并设置发射器位置和旋转信息
FVector Location = GetActorLocation();
FRotator Rotation = GetActorRotation();

//发射粒子
ParticleSystemComp->SpawnEmitterAtLocation(nullptr,Location,Rotation);
```
  • 2
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值