17072802(UE4的批量Import)

【目标】

UE4的Import

【思路】

1 FNewAssetOrClassContextMenu.MakeContextMenu

FNewAssetOrClassContextMenu.ExecuteImportAsset

2 UFactory.StaticImportObject

3 居然有自动Import

在自动测试的时候可以自动导入

FAssetTools.ImportAssetsAutomated

还有Commandlet

UImportAssetsCommandlet.Main

试一下指令



UE4Editor.exe DemonHunter.uproject ImportAssets

发现 UE4的Commandlet参数不同

eg.

试一下指令



UE4Editor.exe DemonHunter.uproject -run=ImportAssets

出来了



如果有importsttings,就不需要用-source -dest来指定单个文件路径

问:那么importsettings如何去配置?

答:是将UAutomatedAssetImportData 类转成Json来配置

/**

* Contains data for a group of assets to import

*/

UCLASS(Transient)

class UNREALED_API UAutomatedAssetImportData : public UObject

{

GENERATED_BODY()

public:

UAutomatedAssetImportData();

/** @return true if this group contains enough valid data to import*/

bool IsValid() const;

/** Initalizes the group */

void Initialize(TSharedPtr<FJsonObject> InImportGroupJsonData);

/** @return the display name of the group */

FString GetDisplayName() const;

public:

/** Display name of the group. This is for logging purposes only. */

UPROPERTY()

FString GroupName;

/** Filenames to import */

UPROPERTY()

TArray<FString> Filenames;

/** Content path in the projects content directory where assets will be imported */

UPROPERTY()

FString DestinationPath;

/** Name of the factory to use when importing these assets. If not specified the factory type will be auto detected */

UPROPERTY()

FString FactoryName;

/** Whether or not to replace existing assets */

UPROPERTY()

bool bReplaceExisting;

/** Whether or not to skip importing over read only assets that could not be checked out */

UPROPERTY()

bool bSkipReadOnly;

/** Pointer to the factory currently being sued */

UPROPERTY()

UFactory* Factory;

/** Json data to be read when importing this group */

TSharedPtr<FJsonObject> ImportGroupJsonData;

};

那尝试新建一个json文件

{

"ImportGroups":[

{

"GroupName":

"Filenames":"F:\A_Works\trunk_C\DevEnv\ue3\Binaries\Win32\EEE\ExampleGame\Content\Characters\daoju\daoju_rw_092\daoju_rw_092.fbx"

"DestinationPath":"ttt"

"FactoryName":"ReimportFbxStaticMeshFactory"

"bReplaceExisting":1

"bSkipReadOnly":0

}

]

}

http://www.sojson.com/ 检测一下

查找到错误

{

"ImportGroups": [

{

"GroupName": "Group11",

"Filenames": [

"F:\\A_Works\\trunk_C\\DevEnv\\ue3\\Binaries\\Win32\\EEE\\ExampleGame\\Content\\Characters\\daoju\\daoju_rw_092\\daoju_rw_092.fbx"

],

"DestinationPath": "ttt",

"FactoryName": "FbxFactory",

"bReplaceExisting": 1,

"bSkipReadOnly": 0

}

]

}

测试指令



DemonHunter.uproject -run=ImportAssets -importsettings=G:\Import.json

跟踪发现可以生成资源,但是没保存到文件

修改一下UImportAssetsCommandlet.ImportAndSave.

bool bIsReadOnly = IFileManager::Get().IsReadOnly(*PackageFilename);

if(bIsReadOnly && ImportData->bSkipReadOnly)

{

bShouldAttemptToSave = ImportData->bSkipReadOnly;

if(bIsReadOnly)

{

UE_LOG(LogAutomatedImport, Error, TEXT("%s is read only and -skipreadonly was specified.  Will not save"), *PackageFilename);

bImportAndSaveSucceeded = false;

}

}

else if (bIsReadOnly)

{

bShouldAttemptToSave = FPlatformFileManager::Get().GetPlatformFile().SetReadOnly(*PackageFilename, false);

if (!bShouldAttemptToSave)

{

UE_LOG(LogAutomatedImport, Error, TEXT("%s is read only and could not be made writable.  Will not save"), *PackageFilename);

bImportAndSaveSucceeded = false;

}

}

else

bShouldAttemptToSave = true;

可以保存了

导入成功!!


4 每个资源有ImportSettings可以配置

UFbxImportUI

/** Type of asset to import from the FBX file */

UPROPERTY()

TEnumAsByte<enum EFBXImportType> MeshTypeToImport;

....

  • 如果是骨骼动画的就设置成SkeletalMesh
  • 在UE3导出时就需要生成json配置文件

5 试一下配置ImportSettings

修改Json文件

{

"ImportGroups": [

{

"GroupName": "Group11",

"Filenames": [

"F:\\A_Works\\trunk_C\\DevEnv\\ue3\\Binaries\\Win32\\EEE\\ExampleGame\\Content\\Characters\\daoju\\daoju_rw_092\\daoju_rw_092.fbx"

],

"DestinationPath": "ttt",

"FactoryName": "FbxFactory",

"bReplaceExisting": 1,

"bSkipReadOnly": 0,

"ImportSettings": {

"MeshTypeToImport": 1

}

}

]

}

运行导入成功

6 问:如果是导入动画如何来关联骨骼?

手动导入动画时会弹出以下界面



如果不选择是Import不了的

导入动画时Option的内容

ImportUI(也就是可配置的ImportSettings)的内容

数据流

UnFbx.ApplyImportUIToImportOptions 中

UFbxImportUI ->FBXImportOptions

问:这个Skeleton内容是否可以由Json创建呢?

答:

尝试配置一个路径,需要注意路径格式

{

"ImportGroups": [

{

"GroupName": "Group11",

"Filenames": [

"F:\\A_Works\\trunk_C\\DevEnv\\ue3\\Binaries\\Win32\\EEE\\ExampleGame\\Content\\Characters\\daoju\\daoju_rw_092\\Mesh\\Anim\\skill01.fbx"

],

"DestinationPath": "ttt",

"FactoryName": "FbxFactory",

"bReplaceExisting": 1,

"bSkipReadOnly": 0,

"ImportSettings": {

"OriginalImportType": 2,

"MeshTypeToImport": 2,

"Skeleton": "/Game/ttt/daoju_rw_092_Skeleton.daoju_rw_092_Skeleton"

}

}

]

}

结果是可以构建Skeleton

但是测试下来没有保存资源文件,原来是骨骼不匹配

测试一下多文件同时导入

{

"ImportGroups": [

{

"GroupName": "Group1",

"Filenames": [

"F:\\A_Works\\trunk_C\\DevEnv\\ue3\\Binaries\\Win32\\EEE\\ExampleGame\\Content\\Characters\\daoju\\daoju_rw_092\\Mesh\\daoju_rw_092.fbx"

],

"DestinationPath": "ttt",

"FactoryName": "FbxFactory",

"bReplaceExisting": 1,

"bSkipReadOnly": 0,

"ImportSettings": {

"MeshTypeToImport": 1

}

},

{

"GroupName": "Group11",

"Filenames": [

"F:\\A_Works\\trunk_C\\DevEnv\\ue3\\Binaries\\Win32\\EEE\\ExampleGame\\Content\\Characters\\daoju\\daoju_rw_092\\Mesh\\Anim\\skill01.fbx"

],

"DestinationPath": "/Game/ttt/Anim",

"FactoryName": "FbxFactory",

"bReplaceExisting": 1,

"bSkipReadOnly": 0,

"ImportSettings": {

"OriginalImportType": 2,

"MeshTypeToImport": 2,

"Skeleton": "/Game/ttt/daoju_rw_092_Skeleton.daoju_rw_092_Skeleton"

}

}

]

}

如果原来有文件就会弹出确认框 确认是否合并骨骼

点击确认之后还是动画有问题,打开编辑器查看是有模型了,但是骨骼数还是没有变化

删掉重新导入试下

生成的资源有这些

【步骤】

1 修改



        ErrorWarningList->InsertColumn( 3, *LocalizeUnrealEd("FullName"), wxLIST_FORMAT_LEFT, 100 );...

....

2 修改

if (ewi->Object)

...

ErrorWarningList->SetItem( Index, 3, *ObjectName );

3



void USkelControlHitPlacement::CalculateNewBoneTransforms(INT BoneIndex, USkeletalMeshComponent* SkelComp, TArray<FBoneAtom>& OutBoneTransforms)
{

....
}

【运行】

3

来自为知笔记(Wiz)

时间: 2024-08-02 21:13:11

17072802(UE4的批量Import)的相关文章

UE4灯光批量修改插件(如:把关卡中选中的灯光的光照强度同时乘以1.5倍)(C++篇)

C++:首先我们需要创建一个插件类,个人建议使用UE4插件界面创建,该好处会把一些基础类给你创建出来,我使用的是编辑器模式类插件 该插件可在窗口模式那里创建新的窗口 类创建好之后我们就可以看见UE4自身帮你创建了三个类(XXclass,XXModeclass,XXModeToolkitclass),我们写UI层逻辑主要是在XXModeToolkitclass这个类里面写,该类里面就Init()函数就是用来写SlateUI的,其中的ToolkitWidget变量是该SlateUI的最低层的UI,一

Houdini技术体系 基础管线(三) :UE4以选择区域的方式对地形做生成和更新 上篇

背景 前一节里,解决了Houdini地形无缝导入到UE4的流程问题.但这种方法也有它的局限性,在实际游戏项目里,LA和LD还是偏向在游戏引擎编辑器里工作,他们的一些设计也会影响到地形的信息,那么就需要Houdini对已经导入UE4中并Bake成Landscape的地形资源做二次修改.通常会选择两种方案: 方案一:把整个地形和建筑都导回到Houdini里,重新过程化和调整生成后,再全部导入回UE4做处理. 方案二:使用HDA节点的Input和Output,通过调用Houdini Engine AP

使用Cobbler批量安装操作系统

个人博客地址:http://www.pojun.tech/ 欢迎访问 前言 在实际生产中,我们常常会遇到这样一种情况,就是我们需要同时安装几十甚至上百台服务器,如果我们使用U盘或者光盘的方式的话,或许老板直接就将我们辞退了.这里我们介绍一种能够实现自动化安装操作系统的方式. 我们搭建Cobbler的实验环境是基于CentOS 7.3 -1611 的基础的. 同时这个实验可以帮助你一步步的完成所有的操作,不过,如果你想自定义安装的内容的话,建议你先看本文 自定义kickstart文件 部分,以便有

Powershell管理系列(二十六)PowerShell操作之批量导出&导入邮箱

-----提供AD\Exchange\Lync\Sharepoint\CRM\SC\O365等微软产品实施及外包,QQ:185426445.电话18666943750 项目中有时候做跨林邮箱迁移的时候,条件不成熟,比如安全考虑或者其他考虑,不能做双林信任,这样就提出了一个问题,历史邮件需要使用的话怎么办,一个简单高效的解决办法就是从源森林批量导出邮件为.pst文件,在批量导入到目的域森林,具体操作如下: 1.赋予管理账号邮件导入导出权限,命令如下: cls whoami New-Manageme

Python脚本远程批量执行命令

摘要 本文主要写用python脚本远程连接多台服务器,然后批量执行命令,最终返回命令执行结果. 这个可以说是Ansible,Puppet等工具的最简单的雏形. 做运维的同学应该都知道的. 正文 multi_task.py #_*_coding:utf-8_*_ import  multiprocessing import paramiko import getpass import ConfigParser class MultiTask(object):     '''handles all 

批量执行shell命令

虽然目前都实现了自动化如puppet saltstack在环境中的应用,但工作中不可避免的要自己写一些简单的批量执行shell命令的脚本. python paramiko模块是目前使用得较为顺手的模块,执行命令时基本无需要转换,直接将shell命令扔进去执行就OK 简单示例,10个线程同时执行ssh或scp动作,未设置timeout时间,如执行长时间无反应会导致脚本执行问题: #!/usr/bin/python # _*_ coding: utf-8 _*_ import paramiko im

JDBC: 批量处理提高SQL处理速度

   当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 JDBC的批量处理语句包括下面两个方法: addBatch(String):添加需要批量处理的SQL语句或是参数: executeBatch():执行批量处理语句: 通常我们会遇到两种批量执行SQL语句的情况: 多条SQL语句的批量处理: 一个SQL语句的批量传参: 测试代码: import java.sql.Connection; import

再议使用Python批量裁切栅格

曾经写过<使用Python脚本批量裁切栅格>,但今天又遇到这个情况则发现了问题.我们遇到的实际问题往往是有一个需要裁剪的影像(大块的),另外有一个矢量面,现在需要按矢量面每一个要素进行裁剪,无奈arcgis里的工具无法方便地做到.只能自己写工具,这次使用了clip而不是ExtractByMask,因为ExtractByMask有很多限制! 下面是工具的操作示例:按每一个要素进行裁剪栅格,输出栅格以选择的字段命名,前提是字段的每个值是唯一的. 下面是消息输入和裁剪矢量表的属性表: 下面是Pyth

selenium之批量执行测试用例

把写好的测试用例放在指定目录下,使用discover函数扫描该目录,并根据关键字自动筛选需要执行的用例.本例使用Python3.6版本. 1 # 遍历指定目录,批量执行测试用例 2 import unittest 3 4 case_dir = 'D:\\test_case' 5 6 7 def suites_run(): 8 '''运行测试套件,批量执行测试用例''' 9 # discover函数遍历指定目录,按条件过滤文件,返回测试套件列表 10 discover_suites = unitt