在虚幻引擎中使用Python批处理3:批量修改属性

23 篇文章 2 订阅
20 篇文章 4 订阅

Unreal Python API 文档: - https://docs.unrealengine.com/4.26/en-US/PythonAPI/

在上一篇文章在虚幻引擎中使用Python批处理2_unreal库的学习:批量重命名
),通过教程学习了Python脚本的使用方式,接下来我希望能实现一些我想做的操作-批量修改对象属性。

虽然在这位宝藏up主的视频中找到了可能很有帮助的指导虚幻引擎自动化 - 自动化 Python 纹理参数设置器,但我不准备先看它,我希望我可以尝试通过查阅API官方文档等其他信息来掌握学习的方法。而这个视频将是我四处碰壁后的求助方式。

这里我很快就找到了API文档地址(通过随意搜索了个关键字 unreal.SystemLibrary)。简单浏览了下,真够长的,单单Library的关键函数就有176个。要通过这个文档找到对应函数估计要有点骨头啃了。

接下来分析下具体需求。
我的USD资产下有很多组件,我需要一一将组件内的参数设为主通道中不渲染(还有其他参数先不用考虑)。
那么,我需要罗列下操作逻辑

  • 获取选中对象
  • 查看对象内组件
  • 设置参数值

这里由于是USD资源估计查找组件相对复杂。先拿个普通对象试试。

1 获取选中对象
先试着检索了文档大纲中的Select关键字,发现多达33个,通过函数名称筛选出两个比较接近的
在这里插入图片描述
点击去看了下详情,貌似没用

通过上篇文章的选择方法,可以猜测出常用命令都集合在了各种Library类中,试着查阅EditorUtilityLibrary类,查看内置方法

插播一条消息
在启动USD插件时发现其加载了一个py脚本,顺着路径找到USD的python文件夹,如果需要操作USD估计能从这里找到方法!
D:\Program Files\Epic Games\UE_4.26\Engine\Plugins\Importers\USDImporter\Content\Python


这是一条漫长的分割线


当我获取完选中对象后,我在查询和设置对象属性上卡住了,经过一番折腾动弹不得,不得已求助了上述大佬视频教程,跟着教程设置贴图对象的sRGB和压缩设置属性,详 - 在虚幻引擎中使用Python批处理4_:贴图参数设置

有所开窍,撸起袖子准备大干一场,有卡住了,设置的操作几乎报错该参数名称不存在与XX对象上。
尝试了大小写调整,下划线空格调整等都是报错,明明可见的参数就是设置不上。气!

无果后我把希望寄托于上述提到的USD插件带的大量脚本,有意思的是测试各种报错

伤感的事就不说了,贴上几个在我学习路上遇到的好资源:

  • 在 UE4 中开始使用 Python - 这是个入门文章,它对我最大的帮助是获取对象的类的重要性,以及如何获取该类的属性和功能。
    类其实在我们获取对象时就会显示,但并没有很重视,而其实我们要设置的属性参数,可能并不在该类上,要确认这一点,就可以使用文章说的help命令,直接help这个对象,就可以得到该类的帮助信息,里面有可以设置的属性以及可以调用的方法。

  • 得知了该类并没有这个属性后,那要去哪设置,我想设置对象渲染属性面板上的 Render in Main Pass
    在这里插入图片描述
    通过官方帮助文档检索,找到了unreal.PrimitiveComponent,能感受到要设置这个参数离不开这个,但我依旧搞不定如何使用它,直到我找到这篇文章将 fbx 相机导入到虚幻引擎时出现问题,大佬附带的源码提供了新的帮助
    在这里插入图片描述

如何设置相机的参数

import unreal

def set_attr():
    # 实例化unreal类
    editor_util = unreal.EditorUtilityLibrary()

    # 获取相机(这里我通过直接选取)
    selected_assets = editor_util.get_selection_set()
    cine_camera = selected_assets[0]
    unreal.log(cine_camera)

    # 我要设置的感应器尺寸并不在cine_camera上,因为CineCameraActor类并没有该属性设置
    unreal.log(help(cine_camera))
    
set_attr()

这里获取了相机,但感应器尺寸的参数并不在该对象上
从help(cine_camera)可以找到这段
在这里插入图片描述

import unreal


def set_attr():
    # 实例化unreal类
    editor_util = unreal.EditorUtilityLibrary()

    # 获取相机(这里我通过直接选取)
    selected_assets = editor_util.get_selection_set()
    cine_camera = selected_assets[0]
    unreal.log(cine_camera)

    # 获取相机组件
    cam_component = cine_camera.get_cine_camera_component()
    unreal.log(help(cam_component))
    
set_attr()

在相机组件上就能找到filmback设置
在这里插入图片描述
通过取值可得出一下字典

unreal.log(cam_component.get_editor_property("filmback"))
LogPython: <Struct 'CameraFilmbackSettings' (0x00000297826CC954) {sensor_width: 22.459999, sensor_height: 18.670000, sensor_aspect_ratio: 1.202999}>

就可以进行设置了,尝试了一下没有问题,

import unreal

def set_attr():
    # 实例化unreal类
    editor_util = unreal.EditorUtilityLibrary()

    # 获取相机(这里我通过直接选取)
    selected_assets = editor_util.get_selection_set()
    cine_camera = selected_assets[0]

    # 获取相机组件
    cam_component = cine_camera.get_cine_camera_component()

    # 设值
    cam_component.set_editor_property("filmback", {"sensor_width": 24})

set_attr()

现在问题应该算是找到答案了,参数一直设置不上的原因是参数是在Actor的组件上

设置静态网格体:Render in Main Pass

import unreal

def set_attr():
    # 实例化unreal类
    editor_util = unreal.EditorUtilityLibrary()

    # 获取对象(这里我通过直接选取)
    selected_assets = editor_util.get_selection_set()
    actor = selected_assets[0]

    # 获取相机组件
    componentList = actor.get_components_by_class(unreal.StaticMeshComponent)
    for component in componentList :
        component.set_render_in_main_pass(False)

set_attr()

好消息是USD对象也是可以通用的,oH yHH

希望这笔记帮到你

乾杯 []~( ̄▽ ̄)~*

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值