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
英文地址,請注明出處:http://en.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制作的儀表盤工程,感覺非常炫酷!分享給大家!下面的儀表盤會將選中的道路數及長度,動態顯示在相應的儀表項中!下面的儀表盤會將選中的道路數及長度,動態顯示在相應的儀表項…