UE5 一些关于过场动画sequencer,轨道track的一些Python操作

删除多余的轨道

import unreal
def execute():movie_scene_actors = []sequence_assets = []data = 0.0# 获取编辑器实用工具库lib = unreal.EditorUtilityLibrary()selected_assets = lib.get_selected_assets()for asset in selected_assets:if asset.get_class() == unreal.LevelSequence().get_class():asset = unreal.MovieSceneSequence.cast(asset)movie_scene_actors.append(asset)for movie_scene in movie_scene_actors:sequence_assets.clear()# 获取关卡中的所有轨道tracks = movie_scene.get_tracks()sequence_assets.append(movie_scene)for track in tracks:sections = track.get_sections()for section in sections:if isinstance(section, unreal.MovieSceneSubSection):# 获取绑定的序列path = section.get_sequence().get_path_name()if "vCam_VP_" in path or "MainStage_Floor_" in path:print(f"Found path: {path}")# 确保在删除 section 之前,该部分依然是轨道的有效部分if section in sections:print(f"Removing section with path: {path}")track.remove_section(section)  # 删除该部分else:print(f"Section with path {path} is no longer valid or has already been removed.")

移动sequence时间从0开始

import unrealdef execute():def set_playback_time(_movie_scene, new_start_frame):# 更改序列关卡的播放起始时间和结束时间playback_star = _movie_scene.get_playback_start()playback_end = _movie_scene.get_playback_end()_duration = playback_end - playback_star_movie_scene.set_playback_start(new_start_frame)_movie_scene.set_playback_end(new_start_frame + _duration)def start_conversion(_sequence_assets, _data):for _movie_scene in _sequence_assets:_movie_scene.set_read_only(False)set_playback_time(_movie_scene, _data)for __bind in _movie_scene.get_bindings():for __track in __bind.get_tracks():for __section in __track.get_sections():start_frame = __section.get_start_frame()end_frame = __section.get_end_frame()duration = end_frame - start_frame# 注意:这里要保证轨道中只有一个片段,否则会多个片段重叠在一个起始时间里if _data > start_frame:__section.set_end_frame(_data + duration)__section.set_start_frame(_data)else:__section.set_start_frame(_data)__section.set_end_frame(_data + duration)duration_key = _data - start_framefor _channel in __section.get_all_channels():for key in _channel.get_keys():key.set_time(unreal.FrameNumber(key.get_time().frame_number.value + duration_key))# # 获取关卡中的所有轨道_tracks = _movie_scene.get_tracks()for __track in _tracks:# 获取轨道中的所有片段__sections = __track.get_sections()for __section in __sections:# 修改片段的起始时间和结束时间start_frame = __section.get_start_frame()end_frame = __section.get_end_frame()duration = end_frame - start_frame# 注意:这里要保证轨道中只有一个片段,否则会多个片段重叠在一个起始时间里if _data > start_frame:__section.set_end_frame(_data + duration)__section.set_start_frame(_data)else:__section.set_start_frame(_data)__section.set_end_frame(_data + duration)movie_scene_actors = []sequence_assets = []data = 0.0# 获取编辑器实用工具库lib = unreal.EditorUtilityLibrary()selected_assets = lib.get_selected_assets()for asset in selected_assets:if asset.get_class() == unreal.LevelSequence().get_class():asset = unreal.MovieSceneSequence.cast(asset)movie_scene_actors.append(asset)for movie_scene in movie_scene_actors:sequence_assets.clear()# 获取关卡中的所有轨道tracks = movie_scene.get_tracks()sequence_assets.append(movie_scene)for track in tracks:sections = track.get_sections()for section in sections:if isinstance(section, unreal.MovieSceneSubSection):# 获取绑定的序列path = section.get_sequence().get_path_name()sequence_assets.append(unreal.load_asset(path))start_conversion(sequence_assets, data)

移动vCam_VP轨道时间LTC

import unreal
def execute():def set_playback_time(_movie_scene, new_start_frame):# 更改序列关卡的播放起始时间和结束时间playback_star = _movie_scene.get_playback_start()playback_end = _movie_scene.get_playback_end()_duration = playback_end - playback_star_movie_scene.set_playback_start(new_start_frame)_movie_scene.set_playback_end(new_start_frame + _duration)def start_conversion(_sequence_assets, _data, sub_signal):for _movie_scene in _sequence_assets:_movie_scene.set_read_only(False)set_playback_time(_movie_scene, _data['LTC'])for __bind in _movie_scene.get_bindings():for __track in __bind.get_tracks():for __section in __track.get_sections():start_frame = __section.get_start_frame()end_frame = __section.get_end_frame()duration = end_frame - start_frame# 注意:这里要保证轨道中只有一个片段,否则会多个片段重叠在一个起始时间里if _data['LTC'] > start_frame:__section.set_end_frame(_data['LTC'] + duration)__section.set_start_frame(_data['LTC'])else:__section.set_start_frame(_data['LTC'])__section.set_end_frame(_data['LTC'] + duration)duration_key = _data['LTC'] - start_framefor _channel in __section.get_all_channels():for key in _channel.get_keys():key.set_time(unreal.FrameNumber(key.get_time().frame_number.value + duration_key))# # 获取关卡中的所有轨道_tracks = _movie_scene.get_tracks()for __track in _tracks:# 获取轨道中的所有片段__sections = __track.get_sections()for __section in __sections:# 修改片段的起始时间和结束时间start_frame = __section.get_start_frame()end_frame = __section.get_end_frame()duration = end_frame - start_frame# 注意:这里要保证轨道中只有一个片段,否则会多个片段重叠在一个起始时间里if _data['LTC'] > start_frame:__section.set_end_frame(_data['LTC'] + duration)__section.set_start_frame(_data['LTC'])else:__section.set_start_frame(_data['LTC'])__section.set_end_frame(_data['LTC'] + duration)if sub_signal:for _movie_scene in _sequence_assets:pack = '/'.join(str(_movie_scene.get_path_name()).split('/')[:-1])name = "vCam_VP_" + _data["VPTakeName"] + ".vCam_VP_" + _data["VPTakeName"]unreal.EditorAssetLibrary.rename_asset(_movie_scene.get_path_name(), f"{pack}/{name}")_movie_scene.set_read_only(True)movie_scene_actors = []sequence_assets = []sequence_sub_assets = []data = {}# 获取编辑器实用工具库lib = unreal.EditorUtilityLibrary()# 选择所有选择的单位selected_assets = lib.get_selected_assets()for asset in selected_assets:# 如果单位是LevelSequence类型if asset.get_class() == unreal.LevelSequence().get_class():# 转换为MovieSceneSequence类型(因为python是动态语言,不转换其实也可以)asset = unreal.MovieSceneSequence.cast(asset)# 保存起来movie_scene_actors.append(asset)for movie_scene in movie_scene_actors:data.clear()sequence_assets.clear()sequence_sub_assets.clear()# 获取关卡中的所有轨道tracks = movie_scene.get_tracks()if len(tracks) == 0:sequence_sub_assets.append(movie_scene)bindings = movie_scene.get_bindings()for binding in bindings:if binding.get_display_name() == 'vCam_VP':for _track in binding.get_tracks():for _section in _track.get_sections():for channel in _section.get_all_channels():if _track.get_display_name() == 'VPTakeName':data["VPTakeName"] = channel.get_default()if channel.get_keys():keys = channel.get_keys()[0]if _track.get_display_name() == 'LTC':data['LTC'] = keys.get_value()elif _track.get_display_name() == 'STC':data['STC'] = keys.get_value()else:sequence_assets.append(movie_scene)for track in tracks:# 获取轨道中的所有片段sections = track.get_sections()for section in sections:# 判断是否为关卡子序列if isinstance(section, unreal.MovieSceneSubSection):# 获取绑定的序列path = section.get_sequence().get_path_name()sequence_sub_assets.append(unreal.load_asset(path))if track.get_display_name() != 'vCam_VP':continuefor bind in section.get_sequence().get_bindings():# 获取指定序列sequence = bind.sequencefor _bind in sequence.get_bindings():for _track in _bind.get_tracks():for _section in _track.get_sections():for channel in _section.get_all_channels():if _track.get_display_name() == 'VPTakeName':data["VPTakeName"] = channel.get_default()if channel.get_keys():keys = channel.get_keys()[0]if _track.get_display_name() == 'LTC':data['LTC'] = keys.get_value()elif _track.get_display_name() == 'STC':data['STC'] = keys.get_value()if not data:unreal.log_error('你的关卡序列中不存在vCam_VP蓝图 或者 不存在LTC和STC属性!')returnstart_conversion(sequence_assets, data, False)start_conversion(sequence_sub_assets, data, True)

移动vCamWithHud_PC轨道时间轴STC

import unrealdef execute():def set_playback_time(_movie_scene, new_start_frame):# 更改序列关卡的播放起始时间和结束时间playback_star = _movie_scene.get_playback_start()playback_end = _movie_scene.get_playback_end()_duration = playback_end - playback_star_movie_scene.set_playback_start(new_start_frame)_movie_scene.set_playback_end(new_start_frame + _duration)def start_conversion(_sequence_assets, _data, sub_signal):for _movie_scene in _sequence_assets:_movie_scene.set_read_only(False)set_playback_time(_movie_scene, _data['STC'])for __bind in _movie_scene.get_bindings():for __track in __bind.get_tracks():for __section in __track.get_sections():start_frame = __section.get_start_frame()end_frame = __section.get_end_frame()duration = end_frame - start_frame# 注意:这里要保证轨道中只有一个片段,否则会多个片段重叠在一个起始时间里if _data['STC'] > start_frame:__section.set_end_frame(_data['STC'] + duration)__section.set_start_frame(_data['STC'])else:__section.set_start_frame(_data['STC'])__section.set_end_frame(_data['STC'] + duration)duration_key = _data['STC'] - start_framefor _channel in __section.get_all_channels():for key in _channel.get_keys():key.set_time(unreal.FrameNumber(key.get_time().frame_number.value + duration_key))# # 获取关卡中的所有轨道_tracks = _movie_scene.get_tracks()for __track in _tracks:# 获取轨道中的所有片段__sections = __track.get_sections()for __section in __sections:# 修改片段的起始时间和结束时间start_frame = __section.get_start_frame()end_frame = __section.get_end_frame()duration = end_frame - start_frame# 注意:这里要保证轨道中只有一个片段,否则会多个片段重叠在一个起始时间里if _data['STC'] > start_frame:__section.set_end_frame(_data['STC'] + duration)__section.set_start_frame(_data['STC'])else:__section.set_start_frame(_data['STC'])__section.set_end_frame(_data['STC'] + duration)if sub_signal:for _movie_scene in _sequence_assets:pack = '/'.join(str(_movie_scene.get_path_name()).split('/')[:-1])name = "vCamWithHud_PC_" + _data["VPTakeName"] + ".vCamWithHud_PC_" + _data["VPTakeName"]unreal.EditorAssetLibrary.rename_asset(_movie_scene.get_path_name(), f"{pack}/{name}")_movie_scene.set_read_only(True)movie_scene_actors = []sequence_assets = []sequence_sub_assets = []data = {}# 获取编辑器实用工具库lib = unreal.EditorUtilityLibrary()# 选择所有选择的单位selected_assets = lib.get_selected_assets()for asset in selected_assets:# 如果单位是LevelSequence类型if asset.get_class() == unreal.LevelSequence().get_class():# 转换为MovieSceneSequence类型(因为python是动态语言,不转换其实也可以)asset = unreal.MovieSceneSequence.cast(asset)# 保存起来movie_scene_actors.append(asset)for movie_scene in movie_scene_actors:data.clear()sequence_assets.clear()sequence_sub_assets.clear()# 获取关卡中的所有轨道tracks = movie_scene.get_tracks()if len(tracks) == 0:sequence_sub_assets.append(movie_scene)bindings = movie_scene.get_bindings()for binding in bindings:if binding.get_display_name() == 'vCamWithHud_PC':for _track in binding.get_tracks():for _section in _track.get_sections():for channel in _section.get_all_channels():if _track.get_display_name() == 'VPTakeName':data["VPTakeName"] = channel.get_default()if channel.get_keys():keys = channel.get_keys()[0]if _track.get_display_name() == 'LTC':data['LTC'] = keys.get_value()elif _track.get_display_name() == 'STC':data['STC'] = keys.get_value()else:sequence_assets.append(movie_scene)for track in tracks:# 获取轨道中的所有片段sections = track.get_sections()for section in sections:# 判断是否为关卡子序列if isinstance(section, unreal.MovieSceneSubSection):# 获取绑定的序列path = section.get_sequence().get_path_name()sequence_assets.append(unreal.load_asset(path))if track.get_display_name() != 'vCamWithHud_PC':continuefor bind in section.get_sequence().get_bindings():# 获取指定序列sequence = bind.sequencefor _bind in sequence.get_bindings():for _track in _bind.get_tracks():for _section in _track.get_sections():for channel in _section.get_all_channels():if _track.get_display_name() == 'VPTakeName':data["VPTakeName"] = channel.get_default()if channel.get_keys():keys = channel.get_keys()[0]if _track.get_display_name() == 'LTC':data['LTC'] = keys.get_value()elif _track.get_display_name() == 'STC':data['STC'] = keys.get_value()if not data:unreal.log_error('你的关卡序列中不存在vCamWithHud_PC蓝图 或者 不存在LTC和STC属性!')returnstart_conversion(sequence_assets, data, False)start_conversion(sequence_sub_assets, data, True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89556.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89556.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战

前端性能优化“核武器”:新一代图片格式(AVIF/WebP)与自动化优化流程实战 当你的页面加载时间超过3秒时,用户的跳出率会飙升到40%以上。而在所有的前端性能优化手段中,图片优化无疑是投入产出比最高的一环。一张未经优化的巨大图片&#xff0…

单元测试学习+AI辅助单测

标题单元测试衡量指标具体测试1、Resource2、MockBean3、Test4、Test模板5、单测示例H2数据库JSON1、使用方式AI辅助单测使用方法单元测试 单元测试一般指程序员在写好代码后,提交测试前,需要验证自己的代码是否可以正常工作,同时将自己的代…

Spring Cloud Gateway与Envoy Sidecar在微服务请求路由中的架构设计分享

Spring Cloud Gateway与Envoy Sidecar在微服务请求路由中的架构设计分享 在现代微服务架构中,请求路由层承担着流量分发、安全鉴权、流量控制等多重职责。传统的单一网关方案往往面临可扩展性和可维护性挑战。本文将从真实生产环境出发,分享如何结合Spri…

GitHub Pages+Jekyll 静态网站搭建(二)

GitHub PagesJekyll 静态网站搭建(二)GitHub PagesJekyll 静态网站搭建(二内容简介搭建模板网站部署工作流程GitHub PagesJekyll 静态网站搭建(二 内容简介 🚩 Tech Contents 该文主要涉及Jekyll主题的下载与使用。Gi…

Django 实战:I18N 国际化与本地化配置、翻译与切换一步到位

文章目录一、国际化与本地化介绍定义相关概念二、安装配置安装 gettext配置 settings.py三、使用国际化视图中使用序列化器和模型中使用四、本地化操作创建或更新消息文件消息文件说明编译消息文件五、项目实战一、国际化与本地化介绍 定义 国际化和本地化的目标,…

通过国内扣子(Coze)搭建智能体并接入discord机器人

国内的扣子是无法直接授权给discord的,但是用国外的coze的话,大模型调用太贵,如果想要接入国外的平台,那就需要通过调用API来实现。 1.搭建智能体(以工作流模式为例) 首先,我们需要在扣子平台…

【办公类-107-02】20250719视频MP4转gif(削减MB)

背景需求 最近在写第五届智慧项目结题(一共3篇)写的昏天黑地,日以继夜。 我自己《基于“AI技术”的幼儿园教学资源开发和运用》提到了AI绘画、AI视频和AI编程。 为了更好的展示AI编程的状态,我在WORD里面插入了MP4转gif的动图。 【教学类-75-04】20241023世界名画-《蒙…

一文讲清楚React的render优化,包括shouldComponentUpdate、PureComponent和memo

文章目录一文讲清楚React的render优化,包括shouldComponentUpdate、PureComponent和memo1. React的渲染render机制2. shouldComponentUpdate2.1 先上单组件渲染,验证state变化2.2 上父子组件,验证props2. PureComponent2.1 单组件验证state2.…

物联网iot、mqtt协议与华为云平台的综合实践(万字0基础保姆级教程)

本学期的物联网技术与应用课程,其结课设计内容包含:mqtt、华为云、PyQT5和MySQL等结合使用,完成了从华为云配置产品信息以及转发规则,到mqtt命令转发,再到python编写逻辑代码实现相关功能,最后用PyQT5实现面…

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson项目

使用IntelliJ IDEA和Maven搭建SpringBoot集成Fastjson项目 下面我将详细介绍如何在IntelliJ IDEA中使用Maven搭建一个集成Fastjson的SpringBoot项目,包含完整的环境配置和代码实现。 一、环境准备 软件要求 IntelliJ IDEA 2021.x或更高版本JDK 1.8或更高版本&#x…

Java从入门到精通!第九天, 重点!(集合(一))

十一、集合1. 为什么要使用集合(1) 数组存在的弊端1) 数组在初始化之后,长度就不能改变,不方便扩展。2) 数组中提供的属性和方法比较少,不便于进行添加、删除、修改等操作,并且效率不高,同时无法直接存储元素的个数。3…

为什么使用时序数据库

为什么使用时序数据库? 时序数据库(Time-Series Database, TSDB)是专为时间序列数据优化的数据库,相比传统关系型数据库(如MySQL)或NoSQL数据库(如MongoDB),它在以下方面…

计算机网络:(十一)多协议标记交换 MPLS

计算机网络:(十一)多协议标记交换 MPLS前言一、传统网络的问题二、MPLS:给数据包贴个“标签”三、MPLS的工作流程1. 入站2. 中间3. 出站四、MPLS的能力前言 前面我们讲解了计算机网络中网络层的相关知识,包括网络层转发…

docker run elasticsearch 报错

谷粒商城 p103 前提条件: 下载镜像文件 #存储和检索数据 docker pull elasticsearch:7.4.2 #可视化检索数据 docker pull kibana:7.4.2 创建挂载的文件和配置 mkdir -p /mydata/elasticsearch/config mkdir -p /mydata/elasticsearch/data echo "http.h…

巧用Callbre RVE生成DRC HTML report及CTO的使用方法

对于后端版图人员,在芯片TO前的LV signoff阶段,犹如一段漫长而有期待的朝圣之旅,需要耐心,毅力和信心,在庞杂的DRC中找到一条收敛之路。为了让此路更为清晰收敛,Calibre提供了一套可追溯对比的富文本方式-H…

产品需求文档(PRD)格式全解析:从 RP 到 Word 的选择与实践

产品需求文档(PRD)的形式多种多样,但核心目标始终一致:清晰传递产品需求,让团队高效协作。不同公司对 PRD 的格式要求可能不同,有的偏爱直接在原型工具中撰写,有的则习惯用 Word 整理归档。本文…

【C++】入门阶段

一、初始化C中的初始化指为变量赋予初始值的过程。初始化方式多样,适用于不同场景。char cha0; char chb{0}; char chc(\0); char chdcha; char che{};注意事项优先使用列表初始化({}),避免窄化转换风险。在c11中{ }在变量&#x…

tailscale在ubuntu22.04上使用

支持 x86 和 ARM 架构 CPU 的软件包已提供 32 位和 64 位版本。 添加 Tailscale 的软件包签名密钥及仓库: curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg >/dev/null c…

深入解析Linux文件重定向原理与dup2系统调用

在Linux中,重定向(Redirection)是一种强大的功能,允许用户控制命令的输入来源(stdin)和输出目标(stdout和stderr)。通过重定向,你可以将命令的输出保存到文件、从文件读取…

QGIS制作的仪表盘工程

在QGIS的官方资源库下载了一个QGIS制作的仪表盘工程,感觉非常炫酷!分享给大家!下面的仪表盘会将选中的道路数及长度,动态显示在相应的仪表项中!下面的仪表盘会将选中的道路数及长度,动态显示在相应的仪表项…