UE Python笔记
插件
官方
商城
Python Editorhttps://www.fab.com/listings/f4c99ba0-1a86-4f6a-b19d-2fd13f15961b
GitHUB
好像只更新到了2020年4.2x的版本。可能有大佬改了5.x的版本。也希望分享给我一份。谢谢
https://github.com/20tab/UnrealEnginePython
学习笔记
网上教程一大堆。边学边写。学会到哪写到哪。哪天不更新了。就是这个笔记又太监了。写的不对的地方喷的时候也麻烦轻点。
Sequencer中的Python脚本https://dev.epicgames.com/documentation/zh-cn/unreal-engine/python-scripting-in-sequencer-in-unreal-engine?application_version=5.0
UE 使用Python控制Sequencehttps://zhuanlan.zhihu.com/p/13347612063
这下面这个文档解释的比较细:
UE5 中用 Python 接口创建 Level Sequence 与设置 TriggerEvent-腾讯云开发者社区-腾讯云遇到了一个美术需求,需要批量读取一段动画,制作成 UE 中的 Level Sequence,然后给动画添加几个 Event Track。随后,需要在 Event Track 中添加 Trigger Event,设置插件 uDraper 布料的缓存数据路径。总之,最终效果如下:https://cloud.tencent.com/developer/article/2146577
跟着学的案例
目前还没“复刻”成功=复制粘贴都不行.gif:
复刻成功=没学会:
1.这个Json文件少了个]。其他按照他这个做基本能复刻。
UE5 Python脚本自动化Sequence Key帧_ue sequnece python-CSDN博客
2.Json(latitude,longitude,elevation)= Python(uex,uey,uez)。因为我没有PythonEditor所以改成了固定的main方式。
【UE4】Python读取Json数据创建对应关卡序列_json设计关卡-CSDN博客
Json相关
读取(祖传代码)
(filename = 外部输入的名字)特别要注意的是Json格式问题。
#def JsonGetData(filename):# 读取/项目目录/JsonFile中的JSON文件数据存入json_dataroot_path = unreal.SystemLibrary.get_project_directory() + 'Content/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_data
报这个错误就是Json格式出现问题了。
JSON在线 | JSON解析格式化—SO JSON在线工具
解析
示例
"commands": [{"commandtype": "Create","objectcreateinfo": {"object": {"id": "1","objecttype": "myship"},"propertys": [{"key": "DisplayName","value": "我的船","propertytype": "String","displaystring": "我的船"}],
#读取各项数据创建关键帧commands = json_data["commands"]#循环获取commands里面的数据for index in range(0,len(commands)):#for command in commands:#json中commandtype为Create时执行if commands[index]["commandtype"] == "Create":# 获取到"commands->objectcreateinfo->object->objecttype"这一层是否等于myshipif commands[index]["objectcreateinfo"]["object"]["objecttype"] == "myship":
Main方法
没有这个函数的话。直接右键运行是不会执行任何东西的。
//有这个右键脚本运行才能有效
if __name__ == '__main__':create()
python获取场景中的actor
# 获取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# 将分段添加到轨迹以便能够设置范围、参数或属性transform_section = transform_track.add_section()#位移:获取位置的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]#获取旋转yz的关键帧channel_rotation_x = transform_section.get_channels()[3]channel_rotation_y = transform_section.get_channels()[4]channel_rotation_z = transform_section.get_channels()[5]#添加关键帧links = json_path["links"]for index in range(0, len(links)):new_time0 = unreal.FrameNumber(value=index*int(json_path["fov"]))#channel_fov.add_key(new_time0, float(json_path["fov"]), 0.0)channel_location_x.add_key(new_time0, float(links[index]["x"]), 0.0)channel_location_y.add_key(new_time0, float(links[index]["y"]), 0.0)channel_location_z.add_key(new_time0, float(links[index]["z"]), 0.0)channel_rotation_x.add_key(new_time1, float(links[index]["roll"]), 0.0)channel_rotation_y.add_key(new_time1, float(links[index]["pitch"]), 0.0)channel_rotation_z.add_key(new_time1, float(links[index]["yaw"]), 0.0)#设置显示隐藏:#为actor添加可视性(隐藏)关键帧channel_visibility_bool = visibility_section.get_channels()[0]#添加关键帧channel_visibility_bool.add_key(new_time,False)
获取蓝图自定义的变量(感谢DeepSeeK)
import unreal# 方法1:获取当前关卡中所有蓝图实例
def get_blueprint_variable(actor_class_name, variable_name):# 获取当前关卡所有Actoractors = unreal.EditorLevelLibrary.get_all_level_actors()# 遍历查找目标蓝图类实例for actor in actors:if actor.get_class().get_name() == actor_class_name:# 检查变量是否存在if actor.property_exists(variable_name):value = actor.get_editor_property(variable_name)print(f"Found variable '{variable_name}': {value}")return valueelse:print(f"Variable '{variable_name}' not found in actor.")return Noneprint(f"Actor of class '{actor_class_name}' not found.")return None# 使用示例:获取类名为"MyBlueprintClass"的Actor的"MyVariable"变量
get_blueprint_variable("MyBlueprintClass", "MyVariable")# 方法2:通过选中Actor获取(需提前在编辑器中选中)
selected_actors = unreal.EditorLevelLibrary.get_selected_level_actors()
if selected_actors:actor = selected_actors[0]value = actor.get_editor_property("MyVariable")print(f"Selected actor's variable value: {value}")#我自己是用的这个写法(上面都是DeepSeek发的)# 获取Actor子系统以抓取选定的Actoractor_system = unreal.get_editor_subsystem(unreal.EditorActorSubsystem)# 获取选定的Actoractor = actor_system.get_selected_level_actors()[0]print(actor)value = actor.get_editor_property("TestInt")
Sequence添加Int/float轨道
# 创建整型轨道(int)int_track = actor_binding.add_track(unreal.MovieSceneIntegerTrack)property_name_int = "VAR_Index"int_track.set_property_name_and_path(property_name_int, property_name_int)#将分段添加到轨迹以便能够设置范围、参数或属性int_section = int_track.add_section()#设置开始和结束帧数int_section.set_start_frame_seconds(0)int_section.set_end_frame_seconds(600)channel_int = int_section.get_channels()[0] # 假设第一个通道是整型通道 # 创建浮点轨道(假设变量类型为float)float_track = actor_binding.add_track(unreal.MovieSceneFloatTrack)property_name = "Alpha"float_track.set_property_name_and_path(property_name, property_name)#将分段添加到轨迹以便能够设置范围、参数或属性float_section = float_track.add_section()#设置开始和结束帧数float_section.set_start_frame_seconds(0)float_section.set_end_frame_seconds(600)channel_float = float_section.get_channels()[0] # 假设第一个通道是float通道links = json_path["links"]for index in range(0, len(links)):new_time0 = unreal.FrameNumber(value=index*int(json_path["fov"]))#channel_fov.add_key(new_time0, float(json_path["fov"]), 0.0)channel_int.add_key(new_time0, float(links[index]["va"]), 0.0)#print("index",float(links[index]["va"]))#float_track.add_key(new_time0, float(links[index]["al"]), 0.0)channel_float.add_key(new_time0, float(links[index]["al"]), 0.0)
尝试
Json
{"starttimestamp": 0,"endtimestamp": 600,"frametime": 60,"seqname": "VideoPlayerSeqSpline","fov": 60,"links": [{"x": 0,"y": 0,"z": 0},{"x": 1088.2844551244866,"y": -6.1749946553391055e-05,"z": 9.0949470177292824e-13},{"x": 962.03462911456836,"y": 1326.0205919409059,"z": -2.1247876702545909e-07},{"x": 1655.6119959682651,"y": 1939.9672775097956,"z": 6.2318827929175313e-06},{"x": 2921.7209372361831,"y": 1163.8111134544288,"z": -1.546140993013978e-11},{"x": 3168.7212710348158,"y": -502.86935341987612,"z": 36.471531137039221},{"x": 3168.7212776581878,"y": -1900.5658369533642,"z": 36.471531137031945},{"x": 3168.7212858682856,"y": -2762.9053314381854,"z": 15.992892525690252},{"x": 1705.8193762352209,"y": -2821.7894823782708,"z": 15.992892525679338},{"x": 1705.8193759169985,"y": -1617.7851900597982,"z": 15.992892525679792},{"x": 273.03898678036694,"y": -1617.7851516590028,"z": 15.992892525679792}]
}
Python
#连接虚幻API库
import unreal,json,osdef JsonGetData(filename):# 读取/项目目录/JsonFile中的JSON文件数据存入json_dataroot_path = unreal.SystemLibrary.get_project_directory() + 'Content/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():json_path = JsonGetData("test")# 获取资产工具asset_tools = unreal.AssetToolsHelpers.get_asset_tools()# 在根内容文件夹中创建一个名为LevelSequenceName的关卡序列level_sequence = unreal.AssetTools.create_asset(asset_tools, asset_name=json_path["seqname"],package_path="/Game/Sequence/",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)# 设置播放范围level_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"])channel_location_x = transform_section.get_channels()[0]channel_location_y = transform_section.get_channels()[1]channel_location_z = transform_section.get_channels()[2]links = json_path["links"]for index in range(0, len(links)):new_time0 = unreal.FrameNumber(value=index*int(json_path["fov"]))#channel_fov.add_key(new_time0, float(json_path["fov"]), 0.0)channel_location_x.add_key(new_time0, float(links[index]["x"]), 0.0)channel_location_y.add_key(new_time0, float(links[index]["y"]), 0.0)channel_location_z.add_key(new_time0, float(links[index]["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()
相关文章:

UE Python笔记
插件 官方 商城 Python Editorhttps://www.fab.com/listings/f4c99ba0-1a86-4f6a-b19d-2fd13f15961b GitHUB 好像只更新到了2020年4.2x的版本。可能有大佬改了5.x的版本。也希望分享给我一份。谢谢 https://github.com/20tab/UnrealEnginePython 学习笔记 网上教程一大堆。…...

使用django调用deepseek api,搭建ai网站
一、deepseek简介 DeepSeek是一家人工智能公司,专注于开发先进的人工智能模型和技术。以下是关于DeepSeek的一些详细介绍: 1.公司背景 DeepSeek由杭州深度求索人工智能基础技术研究有限公司开发,致力于通过创新的技术和算法,推…...

YOLOv12 ——基于卷积神经网络的快速推理速度与注意力机制带来的增强性能结合
概述 实时目标检测对于许多实际应用来说已经变得至关重要,而Ultralytics公司开发的YOLO(You Only Look Once,只看一次)系列一直是最先进的模型系列,在速度和准确性之间提供了稳健的平衡。注意力机制的低效阻碍了它们在…...
两台互通的服务器使用Docker部署一主两从MySQL8.0.35
文章目录 1. 使用Docker Overlay网络(需Swarm模式)在服务器1(172.25.0.19)上:在服务器2(172.25.0.20)上:创建 overlay 网络(172.25.0.19): 2. 部署…...
Java23种设计模式案例
目录 一、概述 二、创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂方法模式 (Factory Method Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 三、结构型模式 (Structu…...

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)
简介: 这个小车的芯片是STM32F103C8T6,其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…...
JavaScript知识点4
1.解释一下这段JavaScript代码 var fruits ["Apple", "Orange", "Apple", "Mango"]; var a fruits.indexOf("Apple",-1); console.log("index"a); 输出的a值为-1,indexOf的第二个参数是-1…...

形式化数学编程在AI医疗中的探索路径分析
一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…...

QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,加密压缩,带有压缩进度
前言 最近在做项目时遇到一个需求,需要将升级的文件压缩成zip,再进行传输; 通过网络调研,有许多方式可以实现,例如QT私有模块的ZipReader、QZipWriter;或者第三方库zlib或者libzip或者quazip等࿱…...

Ubuntu 安装 Nginx并配置反向代理
Ubuntu版本:Ubuntu 24.04.2 LTS 一、安装Nginx 更新系统软件包 安装前需确保系统处于最新状态,避免依赖冲突 sudo apt update && sudo apt upgrade -y 安装Nginx主程序 Ubuntu官方仓库已包含稳定版Nginx,直接安装即可 sudo…...
GitHub SSH连接问题解决指南
🔍 GitHub SSH连接问题解决指南 问题描述 遇到错误:ssh: connect to host github.com port 22: Connection refused 说明您的网络环境无法访问GitHub的SSH端口22,常见原因: 防火墙/网络运营商限制(国内常见…...
C++ 跨平台的 GetCurrentThreadId() 获取当前线程ID实现
支持:C11 及早前标准库版本,而无需使用:std::this_thread::get_id()。 支持:NDK/ANDROID、Windows、Linux、MacOS X 等多个操作系统平台。 int64_t GetCurrentThreadId() noexcept { #if defined(_WIN32) || defined(_WIN64)retu…...

钉钉MAKE AI生态大会思考
1. 核心特性 1.1 底层模型开放 除原有模型通义千问外,新接入猎户星空、智普、MinMax、月之暗面、百川智能、零一万物。 1.2 AI搜索 AI搜索贯通企业和个人散落在各地的知识(聊天记录、文档、会议、日程、知识库、项目等),通过大模型对知识逻辑化,直接生成搜索的答案,并…...
SQL笔记#复杂查询
一、视图 1、视图和表 使用试图时会执行SELECT语句并创建一张临时表。视图中保存的是SELECT语句;表中保存的是实际数据。 2、创建视图的方法 CREATE VIEW 视图名称(<视图列名1>,<视图列名2>,……) AS <SELECT语句> CREATE VIEW ProductSum (prod…...

【Linux】基于UDP/TCP套接字编程与守护进程
目录 一、网路套接字编程 (一)基础概念 1、源IP地址与目的IP地址 2、端口号 3、TCP与UDP 4、网络字节序 (二)套接字编程接口 1、socket 常见API 2、sockaddr结构 (三)UDP套接字 1、UDP服务器创建…...
springboot 引入前端
前端 打包 npm run build vue.config.js 文件 publicPath 默认建议保持 / publicPath: ‘/’ 后端 目录 粘贴下面目录之一: src/main/resources/static/ src/main/resources/public/ 补充(用的少) server:servlet:context-path: /thirdAdm…...

RTSP/Onvif安防平台EasyNVR接入EasyNVS显示服务缺失的原因与解决方案
EasyNVS云管理平台具备强大的汇聚与管理功能,支持EasyGBS、EasyNVR等平台的接入,能够将接入的视频资源进行统一输出,提供远程可视化运维等管理功能,特别适合解决设备现场没有固定公网IP但仍需在公网直播的需求。 在某次用户现场部…...

算法系列之回溯算法
在计算机科学领域,算法是解决问题的核心。回溯算法作为一种经典的算法设计技巧,以其试错和回退的思想,在解决许多复杂问题时展现出强大的能力。本文将深入探讨回溯算法,包括其核心概念、实现步骤、代码示例以及适用场景࿰…...
Uniapp 小程序接口封装与使用
深入理解 Uniapp 小程序接口封装与使用 在 Uniapp 小程序开发中,接口请求是获取和交互数据的关键部分。合理地封装接口不仅能提高代码的可维护性,还能增强项目的健壮性。今天,我们就来详细探讨一下如何在 Uniapp 中进行接口封装、引入以及使…...

Harmony开发笔记(未完成)
一、感想 作为一名拥有11年经验的Android开发者,我亲历了Android从高速发展到如今面临“僧多粥少”的过程。技术的世界瞬息万变,没有一种技术能够让人依赖一辈子。去年初,我自学了鸿蒙系统,并顺利通过了鸿蒙官方的初级和高级认。…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...