蓝图基础:节点和变量
节点
节点概述
在Unreal Engine的蓝图系统中,节点(Node)是构建蓝图逻辑的基本单元。每个节点代表一个特定的功能或操作,例如事件处理、函数调用、条件判断等。节点之间通过引脚(Pin)连接,形成一个逻辑流程图,这样可以直观地看到游戏逻辑的执行顺序。
常见节点类型
事件节点(Event Node)
事件节点用于触发蓝图中的逻辑。例如,当角色移动、触发区域或按键被按下时,可以使用事件节点来启动相应的逻辑。
例子:
假设我们想在玩家按下“跳跃”键时执行跳跃逻辑,可以使用Event Tick
节点来实现。但更常用的是Event BeginPlay
和Event Input
节点。
-
Event BeginPlay:在Actor开始播放时触发。
-
Event Input:在输入事件(如按键按下)时触发。
// 使用Event BeginPlay节点
Event BeginPlay
// 在这里添加初始化逻辑
// 使用Event Input节点
Event Input Jump
// 在这里添加跳跃逻辑
函数节点(Function Node)
函数节点用于封装一组逻辑,使其可以在蓝图中多次调用。这有助于提高代码的复用性和可维护性。
例子:
假设我们有一个角色需要执行多个相同的攻击动作,可以封装一个Attack
函数节点。
-
创建函数节点:在蓝图编辑器中右键选择“添加函数”(Add Function),命名为
Attack
。 -
添加逻辑:在
Attack
函数节点中添加角色攻击的逻辑,例如播放动画和播放音效。
// Attack函数节点
Function Attack
// 播放攻击动画
Play Animation (Animation Sequence: AttackAnim)
// 播放攻击音效
Play Sound (Sound Cue: AttackSound)
变量节点(Variable Node)
变量节点用于存储和传递数据。可以是基本类型(如整数、浮点数、布尔值)或复杂类型(如Actor、Vector、Rotation等)。
例子:
假设我们有一个角色需要跟踪其生命值和攻击力,可以创建两个变量节点。
-
创建变量节点:在蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
Health
和AttackPower
,分别设置为浮点数类型。 -
使用变量节点:在蓝图逻辑中使用这些变量来执行相应的操作。
// 创建Health变量
Variable Health (Type: Float, Default Value: 100.0)
// 创建AttackPower变量
Variable AttackPower (Type: Float, Default Value: 50.0)
// 在某个逻辑中使用这些变量
Event TakeDamage (Damage: Float)
// 减少Health
Set Health (New Value: Health - Damage)
// 检查Health是否小于等于0
If (Health <= 0)
// 触发死亡逻辑
Event Died
条件节点(Condition Node)
条件节点用于根据条件选择不同的逻辑分支。常见的条件节点包括If
、Switch
、Compare
等。
例子:
假设我们有一个角色需要在生命值低于一定阈值时显示一个警告消息,可以使用If
节点来实现。
-
创建条件逻辑:在蓝图编辑器中添加一个
If
节点,连接Health
变量和一个常量值。 -
设置条件:如果
Health
小于等于50,则显示警告消息。
// 检查Health是否小于等于50
If (Health <= 50)
// 显示警告消息
Print String (Text: "Health is low! Take a potion.")
节点连接
节点之间的连接通过引脚(Pin)实现。引脚分为输入引脚(Input Pin)和输出引脚(Output Pin),用于传递数据和控制流。
例子:
假设我们有一个简单的逻辑,当玩家按下“攻击”键时,角色会执行攻击动作,并在攻击后减少敌人的生命值。
-
创建Event Input Attack节点:在蓝图编辑器中右键选择“添加事件”(Add Event),选择
Input Action
,命名为Attack
。 -
连接攻击逻辑:将
Event Input Attack
节点连接到Attack
函数节点。 -
减少敌人生命值:在
Attack
函数节点中添加逻辑来减少敌人的生命值。
// Event Input Attack节点
Event Input Attack
// 调用Attack函数
Call Function Attack
// Attack函数节点
Function Attack
// 获取敌人Actor
Get Enemy (Type: Actor)
// 获取敌人的Health变量
Get Enemy Health (Type: Float)
// 减少敌人的Health
Set Enemy Health (New Value: Enemy Health - AttackPower)
变量
变量概述
变量(Variable)是存储数据的基本单元,可以在蓝图中用于传递和操作数据。变量可以是局部的(Local Variable),也可以是全局的(Global Variable)。局部变量仅在当前函数或事件中可见,而全局变量在整个蓝图中可见。
变量类型
基本类型
-
整数(Integer):用于存储整数值。
-
浮点数(Float):用于存储小数值。
-
布尔值(Boolean):用于存储真或假的值。
-
字符串(String):用于存储文本数据。
例子:
假设我们有一个游戏中的计分系统,需要存储玩家的得分和等级。
-
创建得分变量:在蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
Score
,设置为整数类型。 -
创建等级变量:在蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
Level
,设置为整数类型。
// 创建Score变量
Variable Score (Type: Integer, Default Value: 0)
// 创建Level变量
Variable Level (Type: Integer, Default Value: 1)
复杂类型
-
Actor:用于存储游戏中的Actor对象。
-
Vector:用于存储三维向量,常用于表示位置和方向。
-
Rotation:用于存储旋转,常用于表示Actor的朝向。
-
Transform:用于存储位置、旋转和缩放信息。
-
数组(Array):用于存储一组相同类型的变量。
-
结构体(Struct):用于存储一组相关变量的集合。
例子:
假设我们有一个游戏中的物品系统,需要存储玩家背包中的物品列表。
-
创建物品数组变量:在蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
Inventory
,设置为数组类型,数组元素类型为Item
。 -
添加物品:在蓝图逻辑中添加逻辑来向背包中添加物品。
// 创建Inventory变量
Variable Inventory (Type: Array, Element Type: Item)
// 添加物品到背包
Event AddItem (Item: Item)
// 将物品添加到Inventory数组
Add Item to Inventory (Item: Item)
变量的使用
获取变量值
在蓝图中,可以通过引脚(Pin)获取变量的值。例如,获取角色的生命值。
例子:
假设我们有一个角色,需要在其生命值低于一定阈值时显示警告消息。
-
获取Health变量值:在蓝图编辑器中拖拽
Health
变量的引脚,连接到If
节点。 -
设置条件:在
If
节点中设置条件,如果Health
小于等于50,则显示警告消息。
// 获取Health变量值
Get Health (Type: Float)
// 检查Health是否小于等于50
If (Health <= 50)
// 显示警告消息
Print String (Text: "Health is low! Take a potion.")
设置变量值
在蓝图中,可以通过引脚(Pin)设置变量的值。例如,减少角色的生命值。
例子:
假设我们有一个角色,需要在其受到伤害时减少生命值。
-
创建TakeDamage事件:在蓝图编辑器中右键选择“添加事件”(Add Event),选择
Input Action
,命名为TakeDamage
。 -
设置Health变量值:在
TakeDamage
事件中添加逻辑来减少Health
变量的值。
// 创建TakeDamage事件
Event Input TakeDamage (Damage: Float)
// 获取当前Health值
Get Health (Type: Float)
// 计算新的Health值
Set Health (New Value: Health - Damage)
变量的可见性和作用域
-
局部变量:仅在当前函数或事件中可见。
-
全局变量:在整个蓝图中可见。
例子:
假设我们有一个角色,需要在其攻击时临时存储敌人的位置。
-
创建局部变量:在
Attack
函数节点中右键选择“添加局部变量”(Add Local Variable),命名为EnemyLocation
,设置为Vector类型。 -
使用局部变量:在
Attack
函数节点中使用EnemyLocation
变量来存储敌人的位置。
// Attack函数节点
Function Attack
// 创建局部变量EnemyLocation
Local Variable EnemyLocation (Type: Vector)
// 获取敌人的位置
Get Enemy Location (Type: Vector)
// 设置局部变量EnemyLocation
Set EnemyLocation (New Value: Enemy Location)
// 使用EnemyLocation进行攻击逻辑
Move To (Target Location: EnemyLocation)
变量的初始化
变量可以在创建时设置默认值,也可以在蓝图逻辑中初始化。初始化变量可以确保变量在使用前具有有效的值。
例子:
假设我们有一个角色,需要在游戏开始时初始化其生命值和攻击力。
-
创建Event BeginPlay节点:在蓝图编辑器中右键选择“添加事件”(Add Event),选择
BeginPlay
。 -
初始化Health和AttackPower变量:在
Event BeginPlay
节点中添加逻辑来初始化Health
和AttackPower
变量。
// Event BeginPlay节点
Event BeginPlay
// 初始化Health
Set Health (New Value: 100.0)
// 初始化AttackPower
Set AttackPower (New Value: 50.0)
变量的绑定和引用
变量可以在蓝图之间进行绑定和引用。例如,一个角色蓝图可以引用另一个角色蓝图中的变量。
例子:
假设我们有一个主角色和一个敌人角色,主角色需要引用敌人的生命值来判断是否击败敌人。
-
在敌人蓝图中创建Health变量:在敌人蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
Health
,设置为浮点数类型。 -
在主角色蓝图中引用敌人Health变量:在主角色蓝图编辑器中拖拽敌人对象的引脚,选择
Health
变量。
// 敌人蓝图中的Health变量
Variable Health (Type: Float, Default Value: 100.0)
// 主角色蓝图中的逻辑
Event CheckEnemyHealth (Enemy: Actor)
// 获取敌人的Health变量
Get Enemy Health (Type: Float)
// 检查敌人的Health是否小于等于0
If (Enemy Health <= 0)
// 触发击败敌人逻辑
Event EnemyDefeated
变量的生命周期
变量的生命周期取决于其作用域。局部变量在函数或事件执行完毕后会被销毁,而全局变量在整个蓝图生命周期中都存在。
例子:
假设我们有一个角色,需要在攻击时临时存储敌人的位置,但在攻击结束后不再需要这个位置。
-
创建局部变量:在
Attack
函数节点中右键选择“添加局部变量”(Add Local Variable),命名为EnemyLocation
,设置为Vector类型。 -
使用局部变量:在
Attack
函数节点中使用EnemyLocation
变量来存储敌人的位置。
// Attack函数节点
Function Attack
// 创建局部变量EnemyLocation
Local Variable EnemyLocation (Type: Vector)
// 获取敌人的位置
Get Enemy Location (Type: Vector)
// 设置局部变量EnemyLocation
Set EnemyLocation (New Value: Enemy Location)
// 使用EnemyLocation进行攻击逻辑
Move To (Target Location: EnemyLocation)
变量的类型转换
在蓝图中,不同类型的变量可以通过类型转换节点(Type Cast Node)进行转换。例如,将字符串转换为整数。
例子:
假设我们有一个输入框,玩家可以输入一个字符串表示伤害值,我们需要将其转换为整数并减少角色的生命值。
-
创建输入框变量:在蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
InputDamage
,设置为字符串类型。 -
创建类型转换节点:在蓝图编辑器中添加一个
Type Cast
节点,将InputDamage
转换为整数。 -
减少Health变量值:在蓝图逻辑中使用转换后的整数值来减少
Health
变量的值。
// 创建InputDamage变量
Variable InputDamage (Type: String, Default Value: "0")
// 创建Event Input Damage节点
Event Input Damage (Damage: String)
// 将输入的字符串转换为整数
Type Cast to Integer (Value: Damage, Out Integer: DamageInt)
// 获取当前Health值
Get Health (Type: Float)
// 计算新的Health值
Set Health (New Value: Health - DamageInt)
变量的默认值和常量
变量可以在创建时设置默认值,也可以在蓝图逻辑中设置为常量。常量在运行时不能被修改,但可以在编辑时设置。
例子:
假设我们有一个角色,需要设置其默认的生命值和攻击力,并在游戏逻辑中使用这些值。
-
创建Health和AttackPower变量:在蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
Health
和AttackPower
,分别设置为浮点数类型,并设置默认值。 -
在逻辑中使用这些变量:在蓝图逻辑中使用
Health
和AttackPower
变量。
// 创建Health变量
Variable Health (Type: Float, Default Value: 100.0)
// 创建AttackPower变量
Variable AttackPower (Type: Float, Default Value: 50.0)
// 在某个逻辑中使用这些变量
Event Attack (Enemy: Actor)
// 获取敌人的Health变量
Get Enemy Health (Type: Float)
// 减少敌人的Health
Set Enemy Health (New Value: Enemy Health - AttackPower)
变量的引用和传递
变量可以在蓝图节点之间进行引用和传递。例如,将一个角色的生命值传递给另一个角色。
例子:
假设我们有两个角色,一个是主角色,另一个是敌人角色。主角色需要获取敌人的生命值并显示在屏幕上。
-
在敌人蓝图中创建Health变量:在敌人蓝图编辑器中右键选择“添加变量”(Add Variable),命名为
Health
,设置为浮点数类型。 -
在主角色蓝图中引用敌人Health变量:在主角色蓝图编辑器中拖拽敌人对象的引脚,选择
Health
变量。 -
显示敌人的生命值:在主角色蓝图逻辑中使用
Health
变量来显示敌人的生命值。
// 敌人蓝图中的Health变量
Variable Health (Type: Float, Default Value: 100.0)
// 主角色蓝图中的逻辑
Event DisplayEnemyHealth (Enemy: Actor)
// 获取敌人的Health变量
Get Enemy Health (Type: Float)
// 显示敌人的Health
Print String (Text: "Enemy Health: " + Health.ToString())
变量的动态创建和销毁
在蓝图中,可以动态创建和销毁变量。例如,根据游戏状态动态创建或销毁敌人的生命值变量。
例子:
假设我们有一个动态生成敌人系统,需要在敌人生成时创建其生命值变量,并在敌人被击败时销毁该变量。
-
创建敌人生成逻辑:在蓝图编辑器中添加逻辑来生成敌人,并动态创建
Health
变量。 -
创建敌人击败逻辑:在蓝图编辑器中添加逻辑来销毁敌人的
Health
变量。
// 生成敌人
Event SpawnEnemy (Enemy: Actor)
// 动态创建Health变量
Create Dynamic Variable Health (Type: Float, Default Value: 100.0)
// 击败敌人
Event EnemyDefeated (Enemy: Actor)
// 动态销毁Health变量
Destroy Dynamic Variable Health
变量的持久化
变量可以在游戏会话之间进行持久化,确保数据在重新加载时仍然有效。例如,保存角色的生命值和得分。
例子:
假设我们有一个角色,需要在游戏会话之间保存其生命值和得分。
-
创建持久化逻辑:在蓝图编辑器中添加逻辑来保存和加载
Health
和Score
变量。 -
保存数据:在游戏结束时将
Health
和Score
变量保存到文件中。 -
加载数据:在游戏开始时从文件中加载
Health
和Score
变量。
// 保存数据
Event SaveGame
// 保存Health
Save Variable Health (File Path: "Game/PlayerData/Health.sav")
// 保存Score
Save Variable Score (File Path: "Game/PlayerData/Score.sav")
// 加载数据
Event LoadGame
// 加载Health
Load Variable Health (File Path: "Game/PlayerData/Health.sav")
// 加载Score
Load Variable Score (File Path: "Game/PlayerData/Score.sav")
变量的同步和复制
变量可以在多玩家游戏中进行同步和复制,确保所有玩家都能看到相同的数据。例如,同步角色的生命值和位置。
例子:
假设我们有一个多玩家游戏,需要同步角色的生命值和位置。
-
创建变量同步逻辑:在蓝图编辑器中添加逻辑来同步
Health
和Location
变量。 -
同步数据:在蓝图逻辑中使用
Replicate
节点来同步变量。
// 创建Health变量
Variable Health (Type: Float, Default Value: 100.0)
// 创建Location变量
Variable Location (Type: Vector, Default Value: (X: 0.0, Y: 0.0, Z: 0.0))
// 同步Health变量
Event ReplicateHealth
// 获取当前Health值
Get Health (Type: Float)
// 同步Health值
Replicate Variable Health (To All Clients: True)
// 同步Location变量
Event ReplicateLocation
// 获取当前Location值
Get Location (Type: Vector)
// 同步Location值
Replicate Variable Location (To All Clients: True)
总结
在Unreal Engine的蓝图系统中,节点和变量是构建游戏逻辑的核心组件。节点用于表示功能和操作,变量用于存储和传递数据。通过合理使用这些组件,可以实现复杂的游戏逻辑,提高代码的复用性和可维护性。希望本文档能帮助你更好地理解和使用蓝图系统中的节点和变量。