UE开发的一点心得经验(一)
UE开发的一点心得经验(一)
lingyun前言
最近在做一些unreal的开发,语言上使用的是python(对于我自己能力而言,使用python效率会快一些,C++只会个基础)。
但众所周知,unreal的python文档比较难阅读,很多命令和方法都得靠猜和尝试。
刚开始做unreal开发的时,要实现一些功能都得从搜索引擎去获得一些代码参考。
无法直接从帮助文档中找到想要的结果。不过到后来熟悉了unreal的“套路”,也总结了一些开发经验和心得,在这里分享给大家。
unreal版本是4.26,有些模块需要开启Sequencer Scripting和Editor Scripting Utilities插件。
maya到unreal概念转换
熟悉unreal的朋友可以跳过,这里为了给maya初入unreal的开发者传达几个概念。
首先是Level(关卡),这里可以把一个Level看作是一个maya文件。
打开一个Level,在右侧的World Outliner
就是这个“maya”文件的大纲视图。
里面的所有物体,都被称作为Actor
。
Content Browser
相当于整个项目的资产库,里面的物体类型被称作为Asset
。
关于Actor
获取大纲视图选择的Actor
cmds.ls(sl=True)
应该是maya开发者很常用的命令。
我们在开发一个工具时,要对物体进行操作,首先要获取物体对象。
在unreal里这样来获取:
1 | import unreal |
返回一个列表,里面是Actor类对象。
Actor对象属性修改
这里用一个摄像机来举例,修改它的Filmback和FocusMethod属性:
首先要获取到这个camera actor对象,用上面讲的方法:
1 | cam = get_selected_actors()[0] |
打印一下它,可以看到它是一个CineCameraActor
对象,
然后去文档看看有没有setAttr之类的方法,结果一个”set”打头的都没有。
观察摄像机的属性栏(Details),可以看到有类似于maya里Transform和Shape节点的关系:SceneComponent
下有个CameraComponent
,而我们想要修改的Filmback和FocusMethod属性是属于CameraComponent
的。
那怎么获取到这个”Shape”呢?帮助文档里刚好有这个方法。
1 | component = cam.get_cine_camera_component() |
print一下可以看到它返回的是CineCameraComponent
对象,在文档里找到了filmback的属性。
这个属性下面的Type是CameraFilmbackSetting
,点开看看它要什么样的参数:
知道它需要什么样的参数了,我们直接把参数传进去。
1 | component.filmback = unreal.CameraFilmbackSettings(sensor_width=24.889999, |
生效了!unreal里的属性发生了变化。
这里把文档往下翻翻,还可以直接去设置一个预设。
1 | component.set_filmback_preset_by_name('16:9 Film') |
或者可以偷懒一点,直接把参数传进去:
1 | component.filmback = (36.000000, 20.250000, 1.777778) |
然后是FocusMethod属性设置,跟上述的步骤一样,
看它要什么参数类型然后直接传入就行了。
1 | focus_settings = unreal.CameraFocusSettings() |
获取所有Actor以及类型过滤
1 | import unreal |
如果要进行类型过滤:
1 | # 打印出它的class类型名称,对它进行if判断就行 |
每一个unreal对象都有
get_class()
方法。
关于Asset
获取选择的asset
1 | import unreal |
它返回的是一个列表,里面是unreal.Object
对象,继承了unreal._ObjectBase
这个基类。
有什么方法属性可以查这个文档。
获取所有assets
1 | import unreal |
Content Browser拥有文件夹层级结构,它的根目录名为”/Game”,这里就是列出根目录下所有资产。EditorAssetLibray
更多方法可以参考文档,比如删除,移动,复制,读取资产等操作都在里面。
导入一个asset
1.创建一个导入任务
abc和fbx类型都可以使用AssetImportTask
来导入,
首先根据参数创建一个导入的任务
1 | import unreal |
这里说下set_editor_property()
这个方法,它是所有unreal对象都拥有的一个方法。
它可以传入参数名和参数,来设置这个对象的属性。(参考Unreal Object基类)
在设置属性的时候可以调用这个方法,也可以直接传入参数,像这样:
1 | import unreal |
现在我们得到了一个导入任务的实例化对象task
,还需要执行一个命令来进行实际的导入操作。
1 | unreal.AssetToolsHelpers.get_asset_tools().import_asset_tasks([task]) |
这里传入的参数是一个列表,就是说你可以实例化多个任务一起导入。
如果中间导入任务出错了,它会继续进行下一个任务,然后在最后弹出Error信息的对话框。
2.导入设置
刚刚的导入使用的是默认选项,如果要对导入设置进行修改,调用FbxImportUI()
。
首先说说上述窗口的一些勾选项,按照惯例查看FbxImportUI文档
可以通过名字找到这些属性,直接进行设置就行。
1 | task.options = unreal.FbxImportUI() |
接着看Import Content Type
属性,它是一个下拉框。
继续翻文档,看着名称比较像的就是这个。
点开它的参数类型,FBXImportType查看
用代码来实现:
1 | task.options.mesh_type_to_import = unreal.FBXImportType.FBXIT_ANIMATION |
当然也可以用:
1 | task.options.set_editor_property('mesh_type_to_import', unreal.FBXImportType.FBXIT_ANIMATION) |
然后是skeleton
选项的设置,在对话框里是选择一个Skeleton的资产。
FbxImportUI
的帮助文档里有skeleton
的属性,点开它的参数类型得知它需要一个Skeleton
对象。
这个对象其实就是Content Browser里的一个skeleton asset。
之前说过怎么获取被选择的asset,下面是通过路径来获取asset,然后传入给属性就可以了。
1 | skeleton_asset = unreal.load_asset('/Game/test/Salute_Skeleton') |
接下来是几个标签里的选项,Animation,Transform,Material等。
可以在下面的这些属性去找:
- anim_sequence_import_data
- static_mesh_import_data
- skeletal_mesh_import_data
- texture_import_data
你要问我是怎么知道是这些属性的,那就是可以一一点开它们,
查看它们拥有哪些属性,对照看一下就可以猜出来。
套路还是那个套路:
根据名称在帮助文档里找到比较接近的属性名,然后点进去看它需要的参数类型。
往下就不细说了,参考代码吧,规律一看就可以明白。
针对有骨骼的情况,导入动画。完整的代码示例:
1 | fbx_path = r'D:\temp\Salute_ani.fbx' |
总结
这篇文章差不多到这里,写太多了有点像流水账了。
总的来说知道了unreal文档的套路,要找到方法还是比较快的。
下篇我们继续聊聊关于sequencer的一些code与经验分享。
觉得文章还不错,可以关注这个公众号thx!