当前位置: 首页 > news >正文

UE4 Cook 从UAT传递参数给UE4Editor

需求

一句Cook的命令如下:

${EnginePath}/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -project=${ClientPath}/${ProjectName}.uproject -noP4 -platform=IOS -cooksinglepackage -client -clientconfig=${CookConfig} -iterate -skipbuild -nocompile -NoMutex -cook -DisableUnsolicitedPackages -DisableCrashPackageReport -FastCook -SkipCookingEditorContent -skippak -skipstage -skipdeploy -ignorejunk -buildmachine -manifests -prereqs ${PARAM_IGNORE_COOK_ERRORS} ${SHADER_COMPRESS} -AdditionalCookerOptions="-IgnoreIniSettingsOutOfDate -DisableUnsolicitedPackages" -log=${ClientPath}/Saved/CookLog.log

如果我想要给它添加一个开关 -DisableCookAssert,并传递给UE4Editor(cpp)中,如下

(图1)

应该怎么添加?怎么传递呢?

RunUAT.sh

拿iOS中的 Engine\Build\BatchFiles\RunUAT.sh 来举例,其中的核心脚本是:

# you can't set a dotted env var nicely in sh, but env will run a command with
# a list of env vars set, including dotted ones
echo Start UAT: mono AutomationTool.exe "${Args[@]}"
env uebp_LogFolder="$LogDir" mono AutomationTool.exe "${Args[@]}" $UATCompileArg &
UATPid=$!
wait $UATPid
UATReturn=$?

它的语法和含义如何

  • env uebp_LogFolder="$LogDir" mono AutomationTool.exe "${Args[@]}" $UATCompileArg &:
  • env:这个命令用于运行另一个程序,同时设置环境变量,而不改变当前的环境。
  • uebp_LogFolder="$LogDir":这是设置的环境变量,uebp_LogFolder是环境变量的名称,$LogDir是它的值,这个值应该是之前在脚本中定义的变量。
  • mono AutomationTool.exe "${Args[@]}" $UATCompileArg:这部分与上面的命令相同,但是这次它将在设置了uebp_LogFolder环境变量后执行,并且添加了一个额外的参数$UATCompileArg。
  • &:这个符号告诉shell在后台运行这个命令,这样它就不会阻塞当前shell,可以继续执行后续命令。
  • UATPid=$!:
  • $!:这个特殊的变量代表最近一个后台命令的进程ID(PID)。
  • UATPid=$!:这条命令将后台运行的进程的PID赋值给变量UATPid,以便后续可以引用或等待该进程。
  • wait $UATPid:
  • wait:这个命令会等待指定的进程ID结束。
  • $UATPid:这是之前保存的后台进程的PID。
  • 这条命令将阻塞shell,直到由UATPid变量指定的进程结束。
  • UATReturn=$?:
  • $?:这个特殊变量包含了最后一条命令的退出状态(返回码)。
  • UATReturn=$?:这条命令将最后一条命令(这里是wait命令)的退出状态保存到变量UATReturn中。由于wait命令返回的是它等待的进程的退出状态,所以UATReturn将包含mono AutomationTool.exe命令的退出状态。
     

调试AutomationTool.exe

参考  UE4如何调试BuildCookRun_ue 的 automationtool如何debug-CSDN博客

BuildCookRun的调用关系

${EnginePath}/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun 实际上将会调用下面若干个步骤:

1、Project.Build()
      编译
      由 -build / -skipbuild 决定

2、Project.Cook()
      资源Cook
      由 -cook / -skipcook 决定

3、Project.CopyBuildToStagingDirectory()
      也就是Stage的步骤,也是简单的拷贝
      由 -stage / -skipstage 决定

4、Project.Package()
      由 -package / -skippackage 决定
      包括NDK-Build,打包成Apk

5、Project.Archive()
      很简单的拷贝,存放到某个Archive目录下
      由 -archive / -skiparchive 决定

6、Project.Deploy()
      安装apk,实际上构建里没有走这一步骤
      由 -deploy / -skipdeploy 决定

7、Project.Run()
      由 -run / -skiprun 决定

众所周知,一个 SomeXXCommand.cs 在执行

让我们一起来找找传参的过程。Project.Build()中的Params截图,供参考:

继续往下看,Project.Cook() :

一、UAT调用传递给 CookCommandlet()方法,将会调用UE4Editor-cmd.exe

二、IgnoreCookError功能的生效原理是给 CookCommandlet()方法 包一下try catch并在catch中放弃处理Cook Failure。IgnoreCookError功能并不直接体现在UE4Editor的cpp功能中。

三、DisableCookAssert 需要在cpp中解析参数,和 IgnoreCookError功能的生效原理 有所不同。见图1

四、修改建议:此处补充传递DisableCookAssert

调试与验证

按照前面提到的 “调试AutomationTool.exe” 章节,填写 -DisableCookAssert 传参,并断点,查看console中的日志以便确认效果。

http://www.lryc.cn/news/484178.html

相关文章:

  • 【学习日记】notebook添加JAVA支持
  • 以太坊系地址衍生算法分层确定性生成逻辑
  • 【Unity】ScriptableObject的应用:利用配方合成新物体
  • 31DNS设置
  • 使用Docker快速部署FastAPI Web应用
  • 全面掌握Spring Boot异常处理:策略与实践
  • 【LeetCode】【算法】11. 盛最多水的容器
  • ES6代理和反射新特性,详细讲解
  • vue计算属性 初步使用案例
  • 大模型时代,呼叫中心部门如何建设一套呼出机器人系统?
  • 使用Java绘制图片边框,解决微信小程序map组件中marker与label层级关系问题,label增加外边框后显示不能置与marker上面
  • 力扣 LeetCode 142. 环形链表II(Day2:链表)
  • 用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析
  • C++中的动态断言和静态断言
  • 运算放大器的学习(一)输入阻抗
  • Rust枚举之卧龙凤雏(Rust Option枚举、Rust Result枚举)(Rust Enum、Some(T)、Ok(T)、Err(E))链式操作
  • TCP/IP协议,TCP和UDP区别
  • 【go从零单排】Timer、Epoch 时间函数
  • 壁仞科技上市前最后一波 校招 社招 内推
  • 【微软报告:多模态基础模型】(2)视觉理解
  • Linux 驱动
  • 【数学二】线性代数-线性方程组-齐次线性方程组、非齐次线性方程组
  • Git别名设置
  • 算法基础 -- 红黑树原理与插入伪代码
  • 力扣 LeetCode 27. 移除元素(Day1:数组)
  • 微服务链路追踪skywalking安装
  • mqtt学习笔记(一)
  • Kafka Eagle 安装教程
  • Ajax 获取进度和中断请求
  • 实验5:网络设备发现、管理和维护