UE5 Python脚本自动化Sequence Key帧
前言
码上1024了,给大家分享一个UE5的脚本小功能,UE5中Sequence动态Key功能,这样我们就可以根据我们的数据动态更新了,非常实用,适合刚入门或者小白,接下来我就把整个过程分享给大家。
过程
- 新建一个工程,添加好我们自己的Map后,在Edit -> Editor Preference中搜索Python,对Enable Content Browser Integration 进行勾选

- 在根目录Content中创建Python文件夹,因为这一步是官方操作只有放在这个文件中的Python脚本才会显示在我们的工程中,可以直接新建文本,把我们后面的内容粘贴进去修改后缀为.py即可,然后点击Tools -> Execute Python Scipt 导入我们的python脚本就可以了,导入完成后如果没看到我们的python脚本,重启下工程。

- 双击我们导入的脚本即可对其进行编辑和修改,修改完直接保存即可
- 整个脚本如下,直接看注释就可以,处理过程非常简单,我们在使用的过程中检查好自己的json路径json名称以及Sequence路径即可。
#连接虚幻API库 import unreal,json,osdef JsonGetData(filename):# 读取/项目目录/JsonFile中的JSON文件数据存入json_dataroot_path = unreal.SystemLibrary.get_project_directory() + 'Content/SeqPlayerInfo/Json/'final_path = root_path + filename + '.json'fp = open(final_path, 'r', encoding='utf-8')json_str = fp.read()json_data = json.loads(json_str)unreal.log("=== INFO: Json Get OK ===")return json_datadef Seqcreate():#当前写入的dict_outnew1为我们的json名称json_path = JsonGetData("dict_outnew1")# 获取资产工具asset_tools = unreal.AssetToolsHelpers.get_asset_tools()# 在根内容文件夹中创建一个名为LevelSequenceName的关卡序列level_sequence = unreal.AssetTools.create_asset(asset_tools, asset_name=json_path["seqname"],package_path="/Game/SeqPlayerInfo/LevelSequence/",asset_class=unreal.LevelSequence,factory=unreal.LevelSequenceFactoryNew())# 创建一个帧率对象并设置为所需的fps数值frame_rate = unreal.FrameRate(numerator=json_path["frametime"], denominator=1)# 设置显示速率level_sequence.set_display_rate(frame_rate)# 将播放范围设置为20-200level_sequence.set_playback_start(json_path["starttimestamp"])level_sequence.set_playback_end(json_path["endtimestamp"])# 获取Actor子系统以抓取选定的Actoractor_system = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)# 获取选定的Actoractor = actor_system.get_selected_level_actors()[0]# 将Actor作为可拥有物添加到关卡中actor_binding = level_sequence.add_possessable(actor)# 刷新以直观地查看添加的新绑定unreal.LevelSequenceEditorBlueprintLibrary.refresh_current_level_sequence()# 使用绑定将轨迹添加到Sequencer(由轨迹类型指定)transform_track = actor_binding.add_track(unreal.MovieScene3DTransformTrack)# 将分段添加到轨迹以便能够设置范围、参数或属性transform_section = transform_track.add_section()transform_section.set_start_frame_seconds(json_path["starttimestamp"])transform_section.set_end_frame_seconds(json_path["endtimestamp"])# 获取位置的xyz通道channel_location_x = transform_section.get_channels()[0]channel_location_y = transform_section.get_channels()[1]channel_location_z = transform_section.get_channels()[2]# 获取旋转xyz的关键帧channel_rotation_x = transform_section.get_channels()[3]channel_rotation_y = transform_section.get_channels()[4]channel_rotation_z = transform_section.get_channels()[5]#获取Json数据 value=index:value为当前帧数links = json_path["links"]for index in range(0, len(links)):new_time0 = unreal.FrameNumber(value=index)channel_location_x.add_key(new_time0, float(links[index]["location_x"]), 0.0)channel_location_y.add_key(new_time0, float(links[index]["location_y"]), 0.0)channel_location_z.add_key(new_time0, float(links[index]["location_z"]), 0.0)channel_rotation_x.add_key(new_time0, float(links[index]["rotation_x"]), 0.0)channel_rotation_y.add_key(new_time0, float(links[index]["rotation_y"]), 0.0)channel_rotation_z.add_key(new_time0, float(links[index]["rotation_z"]), 0.0)unreal.EditorAssetLibrary.save_loaded_asset(level_sequence, False)# 刷新以直观地查看新增的轨迹和分段unreal.LevelSequenceEditorBlueprintLibrary.refresh_current_level_sequence()unreal.log("=== INFO: Seq Create Completed Please check the file===")if __name__ == '__main__':Seqcreate() - 如果是没有json数据的情况下,我们把link那部分换成静态数据即可
#value为当前帧数 new_time0 = unreal.FrameNumber(value = 0) channel_location_x.add_key(new_time0, 213, 0.0) channel_location_y.add_key(new_time0, 324, 0.0) channel_location_z.add_key(new_time0, 543, 0.0) channel_rotation_x.add_key(new_time0, 0, 0.0) channel_rotation_y.add_key(new_time0, 0, 0.0) channel_rotation_z.add_key(new_time0, 0, 0.0)new_time1 = unreal.FrameNumber(value = 1) channel_location_x.add_key(new_time1, 228, 0.0) channel_location_y.add_key(new_time1, 335, 0.0) channel_location_z.add_key(new_time1, 668, 0.0) channel_rotation_x.add_key(new_time1, 0, 0.0) channel_rotation_y.add_key(new_time1, 0, 0.0) channel_rotation_z.add_key(new_time1, 0, 0.0) - Json格式如下,也可以根据自己的需求修改
{"starttimestamp": "0", //起始帧"endtimestamp": "2", //总帧数,目前就两组数据就是两帧"seqname": "VideoPlayerSeq","links": [{"location_x": "-213","location_y": "-213","location_z": "-213","rotation_x": "0","rotation_y": "0","rotation_z": "0"},{"location_x": "-213","location_y": "-213","location_z": "-213","rotation_x": "0","rotation_y": "0","rotation_z": "0"} } - 修改以及保存后,在Outliner中先点击我们场景中要Key帧的物体,UE 鼠标右键点击导入的脚本,点击Run,即可运行我们的脚本,我们在路径下查看Sequence是否被创建,如果未在我们的路径下检测到创建的Sequence,在脚本中检查自己的Sequence路径和输出中查看报错信息

结语
这样我们就可以通过ython脚本自动给我们想要的物体根据数据添加关键帧了。
相关文章:
UE5 Python脚本自动化Sequence Key帧
前言 码上1024了,给大家分享一个UE5的脚本小功能,UE5中Sequence动态Key功能,这样我们就可以根据我们的数据动态更新了,非常实用,适合刚入门或者小白,接下来我就把整个过程分享给大家。 过程 新建一个工程…...
2023年整理的自动化测试面试题及答案
selenium中如何判断元素是否存在? 没有提供原生的方法判断元素是否存在,一般我们可以通过定位元素异常捕获的方式判断selenium中hidden或者是display = none的元素是否可以定位到?不可以,想点击的话,可以用…...
docker 命令记录
常用 docker 命令 查看 docker 系统运行状态: systemctl status docker查看 docker 版本: docker -v查看本地镜像: docker images查看本地 docker 容器: docker ps # 正在运行的 docker 容器 docker ps -a # 所有的 docke…...
二、ElasticSearch中索引库与文档操作
文章目录 二、索引库与文档2.1 mapping映射属性2.2 操作索引库2.3 文档操作 二、索引库与文档 2.1 mapping映射属性 mapping映射属性 官方网址:https://www.elastic.co/guide/en/elasticsearch/reference/7.12/dynamic-mapping.html mapping 是对索引库中文档的…...
few shot learnning笔记
课程地址 https://youtu.be/hE7eGew4eeg?siKBM0lY7eY_AdD8Wr PPT地址 https://github.com/wangshusen/DeepLearning 第一节 Few-Shot Learning Basics 第二节 Siamese Network 第三节 Pretraining Fine Tuning(以图像识别举例) 基础 support set&…...
2022最新版-李宏毅机器学习深度学习课程-P25 Spacial Transformer Layer
data augmentation/spacial transformer CNN 并不能够处理影像放大缩小,或者是旋转的问题。所以在做影像辨识的时候,往往都要做 Data Augmentation,把你的训练数据截一小块出来放大缩小、把图片旋转,CNN 才会做到好的结果。 有一个架构叫 spacial Tran…...
轻松上手,制作电子期刊就这么简单
嗨,年轻的朋友们!你是否想过用你的创意和热情来制作一本属于自己的电子期刊?现在,这个梦想已经触手可及!只需要用到这款工具即可轻松上手,就能拥有自己的电子期刊 工具:FLBOOK在线制作电子杂志平…...
网络电视机顶盒怎么样?内行揭晓网络电视机顶盒排名
网络电视机顶盒怎么样?可以说是家家户户不可或缺的部分,但很多朋友买回家发现经常死机和卡顿,究竟要如何选择才不踩坑呢?我身为业内人士给各位分享业内最新发布的网络电视机顶盒排名,跟着我一起看看哪些网络机顶盒最值…...
2023秋招华为技术岗线上面试经历
2023/10/16 个人情况:博士,预计2024年毕业,参加了2023秋招,华为应聘到3面主管面。 下面按招聘流程顺序,记录我的面试经历。因为想写详细一点的独立文章,所以想来想去还是放到CSDN上。 1. 宣讲会 宣讲会…...
保姆级VitrualBox下载ubantu
首先先到此处下载VitrualBox选择对应的配置 Oracle VM VirtualBox 下载VitrualBox的同时要下载一个Visual,支持VitrualBox运行 最新受支持的 Visual C 可再发行程序包下载 | Microsoft Learn 同时再根据下面的网址去下载Ubantu 下载好后桌面出现这两个,…...
【学习笔记】RabbitMQ-6 消息的可靠性投递2
参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 十一、队列Queue的消息属性11.1 具体属性11.2 自动删除11.2 自定义参数11.2.1 **Message TTL** 消息存活时间11.2.2 **Auto expire** 队列自动到期时间11.2.3 **Overflow behaviour** 溢出行为11.2.4…...
黑豹程序员-知识点-写一个bat一次执行多条命令
start cmd 执行命令行窗口 /c 执行完命令就关闭,/k执行完命令不关闭 执行多条命令,命令直接使用&&连接 echo onstart cmd /k "pnpm create vite vhello --template vue && cd vhello && pnpm install && pnpm run…...
从头开始机器学习:线性回归
一、说明 本篇实现线性回归的先决知识是:基本线性代数,微积分(偏导数)、梯度和、Python (NumPy);从线性方程入手。 代码/注释存储库链接 拉曼欣德 GitHub - ramanthind02/Machine_learning_from…...
1-k8s1.23.6-底座搭建-基于docker
这里写自定义目录标题 一、服务器准备二、安装docker三、安装k8s四、安装部署dashboard 一、服务器准备 服务器准备 服务器名称服务器IP角色CPU(最低要求)内存(最低要求)master192.168.248.10master2核2Gworker1192.168.248.11node2核2Gworker2192.168.248.12node2核2G 修改ip&…...
【SA8295P 源码分析 (一)】76 - Thermal 功耗 之 /dev/thermalmgr 相关调试命令汇总
【SA8295P 源码分析】76 - Thermal 功耗 之 /dev/thermalmgr 相关调试命令汇总 1、配置文件:/mnt/etc/system/config/thermal-engine.conf2、获取当前SOC所有温度传感器的温度:cat /dev/thermalmgr3、查看所有 Thermal 默认配置和自定义配置:echo query config > /dev/th…...
每日汇评:随着上升趋势的恢复,黄金在1950美元上方等待破位
周三早间,黄金价格逼近1950美元,买家纷纷出手; 尽管市场情绪谨慎,但美元与美债交投疲弱,中国的乐观情绪逐渐消退; 金价重拾200日移动均线,但料持续升穿1950美元; 金价正从每盎司1943…...
postgresql字符串处理的函数
1. SPLIT_PART SPLIT_PART() 函数通过指定分隔符分割字符串,并返回第N个子串。语法: SPLIT_PART(string, delimiter, position) string : 待分割的字符串 delimiter:指定分割字符串 position:返回第几个字串,从1开始&…...
(1)攻防世界web-Training-WWW-Robots
1.开启环境,查看网页 翻译一下 2.前往robots.txt 命令:http://61.147.171.105:57663/robots.txt 3.前往fl0g.php 命令:http://61.147.171.105:57663/fl0g.php 4.得到flag cyberpeace{92ec1ef9b6d900100399093b9ae9e386}...
list.set交换数据需要(or不需要)添加其他中间变量,两个例子告诉你
说明:set()方法是来修改指定位置的元素。 两个参数,第一个参数是要修改的元素的索引,第二个参数是要设置的新值。 案例一:当链表中传入的是字符串时: public static void main(String[] args) {List list new Linke…...
Linux中的主要系统调用
Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(C…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
