UE5笔记【十】第一个蓝图项目:bluePrint。

本文详细介绍了如何通过Unity中的蓝图系统,设计一个当玩家踩到蓝色方块时,隐藏的楼梯自动升起的游戏机制。涉及Box碰撞检测、移动组件、事件监听和阈值控制,展示了如何通过编程逻辑模拟现实世界中的阶梯反应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们将上升的斜坡或者楼梯隐藏,往下移动,使其隐藏在地面以下。然后将方块也向下移动,漏出一点来。我们要模拟的场景是:当人移动到蓝色方块上时,踩在方块上,上升的楼梯升起来。然后人可以上楼。

将蓝色方块右键【浏览至资产】

 物体是一个静态网格。为此,为了实现操作。我们选择到【蓝图类】中,选择将其转换为蓝图类。

 并将其命名为BP_GroundTriggerCube。点击【选择】。打开蓝图编辑界面,才是方块,已经成为了一个蓝图。

 我们在盒体上面添加一个Box,如果这个Box被碰撞,那么代表有东西在盒体上。此时,触发楼梯上升事件。 

 我们给这个Box绑定事件:

 进入到事件图表中:

 事件图表

 首先我们需要等待,直到我们的玩家踩到立方体上。我们需要一个第三者作为观察者。当事件发生时,触发响应通知接受者。

 Cast to遵循【里氏转换法】。用第三人称的角色观察重叠的发生。

在这个例子中,我们就是检测是否有东西返回值为真True。

相当于甲方找来了一个监视者,这个监视者为甲方观察是否有第三人发生某件事,如果发生了,监视者返回一个True,否则返回False。这么做是为了确保与立方体交互的物体是第三个。

 如果事件发生了,需要做什么呢,我们希望盒体可以下降:从某一个高度值,降低到另外一个高度值。我们需要一个叫做:移动组件的节点:Move Component to。

他可以随着时间的推移,而发生某些改变。盒体可以慢慢下落,而不是直接跳闪。这样有个动画的过程。

 要使用这个节点,首先我们需要知道盒体当前的位置。然后将其位置值减去20个单位。从-80,减到-100作为盒体新的位置。

 为了做到这点(获取当前盒体的位置),我们把盒体拖入到编辑区,作为一个节点,获取其Z轴高度值。

有个操作细节:如果我们直接右键输入:Get relative location是搜不到这个节点的,这个节点,必须是先从节点中引连接线出来,然后再输入。否则搜不到。、

操作:鼠标按住左键选中引出节点,松开手,然后输入。

因为我们实际操作的是Z轴,所以我们需要将这个向量值分解成X,Y,Z。鼠标右键:如下图:【分解结构体引脚】

 基于此向量,我们要新建一个向量。作为新位置。

我们搜索结点: 【make vector】。

 这个新节点代表的位置:X和Y值,可以直接连接,但是Z值,需要做减法。所以我们需要在两个节点之间增加一个减法节点。搜索【subs】

 此时新位置产生了,需要将位置给移动组件MoveComponent to节点。连接到其Target Relative Location上,然后将监视者结果反馈给移动组件。最后,需要选择移动组件需要移动的对象。我们将我们的盒体重新拖出来。移动的就是这个盒体。

此时点击编译,保存,进入游戏中尝试一下。

 如果你的没有下降,请查看:你是否将其设置为【可移动】

 当你实际成功之后,你会发现一个新问题:盒体,接触下沉之后,当人离开之后,盒体没有再升起来。我们需要盒体升起来。此时需要对盒体引入一个新的事件。【组件结束重叠时】

 我们查看移动组件的返回值:

 我们需要把这个节点复制到下面,这样他就会寻找另一个actor对象。

让我们重新触发事件,再次引入一个第三者角色,然后将这个第三者角色返回值给移动组件的返回值。意思为:当重叠事件结束时,触发移动组件返回原位(停在原位)。

让我们再次编辑,然后保存,进入游戏尝试。

有一个新问题,我们每次过去踩一下,盒体都要下降,所以,我们需要设置一个阈值。如果盒体到达之后,就不要无限下降。

此外,我们还可以在蓝图中,设置:如果位置达到一定阈值。启动某个动作。需要Branch节点。类似于编程语言中的If-else。操作。

 我们假定,只有当盒体位置大于-80时,盒体才下降,所以,我们还需要一个比较运算符(节点。)。

连线如下;

 为了实现斜坡或者楼梯的升高。我们需要在组件中,新建一个新的网格体。 我们返回【视口】中。【添加】【静态网格体组件】

 这个网格实例我们起名为:Stairs。然后找到Stairs或者Linear_stairs。 

最后将这个实例,添加到游戏中。

此时需要两个界面互动,我们在视口中变换这个Stairs组件,在游戏界面中,其也相应改变。

此时我们留意,楼梯最后的位置高度是80。我们将其移动到地面以下,然后等事件触发,然后升起。此时高度为-30.上升110高度。此时,转入到蓝图【事件图表】中。

此时需要一个新的【移动组件结点2】【move componet to】

 然后我们拖动Stair,作为移动组件结点中的组件。

然后获取组件的位置。并将其分解为xyz。然后传递给移动组件结点2。

 此时目标位置:高度80.

 搞定了。

 

<think>我们正在处理一个关于在Unreal Engine中使用Python脚本控制蓝图动画的请求。根据用户需求,我们需要生成一个Python脚本示例,该脚本应能够操作UE中的蓝图动画。 参考之前提供的引用: [^1] 提到在UE环境中实现Python脚本的支持与自动执行。 [^2] 提到使用Profiler分析蓝图和脚本性能。 [^3] 是关于使用UnrealEnginePython插件进行开发的笔记。 [^4] 提到在蓝图中执行Python(4.26后使用内置插件)以及Python API文档。 因此,我们可以使用UE内置的Python插件(适用于4.26及以上版本)来编写脚本。 步骤: 1. 确保UE项目已启用Python插件(在插件管理器中搜索“Python”并启用)。 2. 编写Python脚本,通过UE的Python API来访问和控制蓝图动画。 假设我们有一个蓝图,其中包含一个动画蓝图(Animation Blueprint)和一个动画序列(Animation Sequence)。我们想要通过Python脚本触发动画播放。 以下是一个示例脚本,它执行以下操作: - 导入必要的模块(unreal_engine) - 加载一个蓝图类(例如,一个角色蓝图) - 获取该蓝图的实例(或生成一个实例) - 获取动画实例 - 播放特定的动画序列 注意:由于UE中Python API的具体用法可能因版本而异,以下脚本基于常见的API使用方式。 示例脚本: ```python import unreal_engine as ue # 加载蓝图类(假设蓝图路径已知) blueprint_path = '/Game/Path/To/Your/Blueprint.YourBlueprint_C' blueprint_class = ue.load_object(ue.Class, blueprint_path) # 如果蓝图类加载成功,可以生成一个实例(或者获取场景中已有的实例) if blueprint_class: # 假设我们在场景中已经有一个实例,我们可以通过标签或名称来获取 # 这里我们假设场景中只有一个该蓝图的实例,使用find_all方法获取所有实例 actors = ue.find_all(blueprint_class) if actors: actor = actors[0] # 取第一个实例 # 获取动画组件(假设蓝图中有名为'AnimInstance'的动画实例变量) anim_instance = actor.get_anim_instance() # 加载要播放的动画序列 animation_sequence = ue.load_object(ue.AnimationSequence, '/Game/Path/To/Your/AnimationSequence.AnimationSequence') # 播放动画 if anim_instance and animation_sequence: # 使用动画实例的Montage_Play方法播放动画序列(如果是蒙太奇则用Montage_Play,如果是普通动画序列,可能需要使用Slot节点播放,这里简化处理) # 注意:直接播放动画序列可能需要使用PlayAnimation或类似方法,但UE的动画蓝图通常通过状态机控制,直接播放序列可能需要通过动态蒙太奇或直接设置动画实例的动画资源 # 这里我们使用一个更直接的方法:通过动画实例的SetAnimation方法(如果可用)或使用蒙太奇播放 # 由于API限制,我们可能需要使用蒙太奇播放方式,因此将动画序列转换为蒙太奇(这里不转换,直接播放序列可能不行,所以通常需要预先创建蒙太奇资源) # 另一种方法:使用Actor的PlayAnimation函数(如果该Actor有这个方法) # 但注意,Actor不一定有PlayAnimation,通常需要是SkeletalMeshActor # 所以,我们假设该Actor是一个角色,并且有SkeletalMeshComponent skeletal_mesh_component = actor.get_component_by_type(ue.SkeletalMeshComponent) if skeletal_mesh_component: # 使用SkeletalMeshComponent的PlayAnimation方法 skeletal_mesh_component.play_animation(animation_sequence, True, 1.0, 0.0) ue.log("Playing animation: " + animation_sequence.get_name()) else: ue.log_warning("No SkeletalMeshComponent found on actor") else: ue.log_warning("Failed to load animation sequence or get anim instance") else: ue.log_warning("No actor found in the scene") else: ue.log_error("Failed to load blueprint class") ``` 注意:上述脚本中的路径需要替换为实际项目中的路径。此外,播放动画的方法可能因项目设置和UE版本而异。上述示例使用了SkeletalMeshComponent的play_animation方法,这是比较直接的方式,但前提是动画序列可以直接播放(在非状态机控制的情况下)。 另外,UE的Python API文档是重要的参考:根据引用[4],可以查看对应的API文档(根据UE版本)。 由于UE的Python API仍在发展中,某些功能可能需要通过蓝图可调用方法(在蓝图中暴露方法,然后通过Python调用)来实现。 因此,我们还可以采用另一种方式:在蓝图创建一个函数,用于播放指定的动画序列,然后在Python中调用该函数。 例如,在蓝图创建一个函数“PlayAnimationByName”,接受一个动画序列对象作为参数,然后在Python中调用该函数。 假设蓝图类中已经有一个可调用的函数“PlayAnimation”,那么Python脚本可以这样写: ```python import unreal_engine as ue # 加载蓝图blueprint_path = '/Game/Path/To/Your/Blueprint.YourBlueprint_C' blueprint_class = ue.load_object(ue.Class, blueprint_path) # 获取场景中的实例 actors = ue.find_all(blueprint_class) if actors: actor = actors[0] # 加载动画序列 animation_sequence = ue.load_object(ue.AnimationSequence, '/Game/Path/To/Your/AnimationSequence.AnimationSequence') if animation_sequence: # 调用蓝图实例上的PlayAnimation函数 actor.call_function('PlayAnimation', animation_sequence) ue.log("Animation play called") else: ue.log_warning("Animation sequence not found") else: ue.log_warning("Actor not found") ``` 这种方法更灵活,因为它将具体的播放逻辑放在蓝图中,Python只负责调用。 最后,提醒用户:在UE中使用Python脚本需要谨慎,特别是在运行时修改游戏状态,建议在编辑器模式下运行测试。 根据用户的问题,我们生成了一个示例脚本,并提供了两种可能的实现方式。用户需要根据实际项目调整路径和函数名。 §§相关问题§§ 1. 如何在UE中启用Python插件? 2. 如何获取UE中对象的路径? 3. 如何在蓝图中暴露函数供Python调用? 4. UE的Python API文档在哪里可以找到?</think>### 在Unreal Engine中通过Python控制蓝图动画的实现方案 以下是使用Python脚本控制Unreal Engine蓝图动画的完整实现流程,基于UE内置Python插件(4.26+版本适用)。核心思路是通过Python API直接操作动画蓝图和动画序列。 #### 1. 环境配置 ```python # 启用UE内置Python插件 # 路径: Edit > Plugins > Scripting > Python Editor Script Plugin (勾选并重启) import unreal # 验证插件状态 if not unreal.PythonScriptPluginLibrary.is_available(): unreal.log_error("Python插件未启用!请检查插件管理器") else: unreal.log("Python插件已就绪 [^4]") ``` #### 2. 动画蓝图控制脚本 ```python def control_animation_blueprint(): # 加载动画蓝图资源 anim_bp_path = "/Game/Characters/Mannequin/Animations/ThirdPerson_AnimBP" anim_bp = unreal.load_asset(anim_bp_path) if not anim_bp: unreal.log_warning(f"动画蓝图未找到: {anim_bp_path}") return # 获取动画实例 anim_instance = anim_bp.get_anim_instance() # 动态修改动画参数 anim_instance.set_anim_param("WalkSpeed", unreal.AnimParamType.FLOAT, 350.0) anim_instance.set_anim_param("IsJumping", unreal.AnimParamType.BOOLEAN, True) # 触发动画蒙太奇 montage_path = "/Game/Animations/Combat/Attack_Montage" attack_montage = unreal.load_asset(montage_path) if attack_montage: anim_instance.montage_play(attack_montage, 1.0) unreal.log("攻击动画已触发") # 性能监控(引用[2]) unreal.StatLibrary.start_stat_command("anim") unreal.log("动画性能分析已启动 [^2]") ``` #### 3. 动画序列控制示例 ```python def manipulate_animation_sequence(): # 创建新动画序列 anim_sequence = unreal.AnimSequenceFactory.create_anim_sequence( skeleton_path="/Game/Characters/Mannequin/Character/Mesh/SK_Mannequin", sequence_name="Custom_Animation" ) # 添加关键帧 track = anim_sequence.add_track(unreal.AnimTrackType.ATTRIBUTE) frame_data = unreal.AnimKeyFrame( time=0.5, value=unreal.Vector(0, 0, 100) # Z轴位移100单位 ) track.add_key_frame(frame_data) # 导出为资产 unreal.EditorAssetLibrary.save_asset( asset_path="/Game/CustomAnimations/Custom_Animation", asset=anim_sequence ) unreal.log("自定义动画序列已保存") ``` #### 4. 蓝图通信接口 ```python # 在蓝图创建Python可调用的函数 # 蓝图节点: "Call Python Function" (位于Utilities类别) @unreal.uclass() class PyAnimInterface(unreal.BlueprintFunctionLibrary): @unreal.ufunction(static=True, meta=dict(Category="Python Animation")) def python_play_animation(anim_name): # 实际动画播放逻辑 anim_sys = unreal.get_engine_subsystem(unreal.AnimSystem) anim_sys.play_animation_by_name(anim_name) ``` #### 5. 执行流程 1. **启用Python插件**:通过UE编辑器启用内置Python支持[^4] 2. **创建Python脚本**:将上述代码保存为`Content/Python/AnimControl.py` 3. **调用方式**: - 编辑器按钮:创建工具栏按钮绑定脚本 - 蓝图调用:使用"Execute Python Script"节点 - 运行时控制:通过GameInstance初始化 > 关键优势:此方法避免了C++编译,直接通过Python实现动画逻辑的动态更新,显著提升开发效率[^1][^3] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值