当前位置: 首页 > news >正文

UE5 Python脚本自动化Sequence Key帧

前言


       码上1024了,给大家分享一个UE5的脚本小功能,UE5中Sequence动态Key功能,这样我们就可以根据我们的数据动态更新了,非常实用,适合刚入门或者小白,接下来我就把整个过程分享给大家。

过程

  1. 新建一个工程,添加好我们自己的Map后,在Edit ->  Editor Preference中搜索Python,对Enable Content Browser Integration 进行勾选
  2. 在根目录Content中创建Python文件夹,因为这一步是官方操作只有放在这个文件中的Python脚本才会显示在我们的工程中,可以直接新建文本,把我们后面的内容粘贴进去修改后缀为.py即可,然后点击Tools -> Execute Python Scipt 导入我们的python脚本就可以了,导入完成后如果没看到我们的python脚本,重启下工程。
  3. 双击我们导入的脚本即可对其进行编辑和修改,修改完直接保存即可
  4. 整个脚本如下,直接看注释就可以,处理过程非常简单,我们在使用的过程中检查好自己的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()
    
  5. 如果是没有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)
  6. 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"}
    }
  7. 修改以及保存后,在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 下载好后桌面出现这两个&#xff0c…...

【学习笔记】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…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异&#xff…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...