吹弹牛皮之Unity 工具制作常用交互bat ini python

用户7698595 2021-10-26 14:46:57
工具 unity 制作 牛皮 吹弹

在小菜的《吹弹牛皮之Unity 100行代码找出性能消耗源头》公众号文章中,小菜提及了一版lua版的性能采样分析工具。由于不够全面,且存在多处设计上需要改良的地方。基于此,在最近的项目上又做了一版c#版本的。

Unity命令行

调用Unity

不管是bat(windows批处理调用),还是python调用Unity的方式,都只有一种。总结如下

set unityPath="C:\program files\Unity\Editor\Unity.exe"
set projectPath="D:\WorkSpace\Project_Main\Client"
%unityPath% -quit -batchmode -projectPath %projectPath% -nographics -executeMethod JenkinsBuild.DistributedBuildSetup
  • 指定Unity.exe的位置
  • 指定UnityProject的路径
  • 设定Unity处于静默状态执行(看不见Unity的界面窗口)
  • 指定调用到的Unity中去处理的接口函数(JenkinsBuild.DistributedBuildSetup)

当然了在调用前,我们也需要切掉当前正在打开的Unity.exe

taskkill /f /im Unity.exe

Unity命令行详解

[-batchmode]

在批处理模式下运行Unity。应始终与其他命令行参数一起使用,因为它确保不会弹出窗口,无需任何人为的干预。当脚本代码在执行过程中发生异常,资源服务器更新失败或其他操作失败时Unity将立即退出,并返回代码为1。请注意,在批处理模式下, Unity将向控制台发送输出版本最小的日志。当然,日志文件将包含完整的日志信息。

[-quit]

其他命令执行完毕后将退出Unity编辑器。请注意,这可能会导致错误消息被隐藏(但他们将显示在Editor.log文件)

[-projectPath]

打开指定路径的项目

[-nographics] (Windows only)

当运行在批处理模式,不会初始化显卡设备。这使得它可以在你的机器上自动按工作流程运行,甚至它没有GPU。

[-executeMethod]

在Unity启动的同时会执行静态方法,该项目是开放的并且是在可选资源服务器更新完成之后。这可以用来不断的整合,进行单元测试,制作模型,准备一些数据等。如果你想通过命令行返回一个错误,你可以抛出一个异常,会引发代码为1的Unity关闭或其他引发EditorApplication.Exit非零代码。

[-logFile]

指定将要被写入编辑的log文件

[-importPackage]

导入提供的package,不会显示导入对话框

[-createProject]

根据提供的路径建立一个空项目

Bat调用Unity

bat是windows下的批处理命令。经过上面的介绍大体有了一个认识。调用Unity如下:

set unityPath="C:\program files\Unity\Editor\Unity.exe"
set projectPath="D:\WorkSpace\Project_Main\Client"
taskkill /f /im agent.exe
taskkill /f /im conductor.exe
taskkill /f /im Unity.exe
%unityPath% -quit -batchmode -projectPath %projectPath% -nographics -executeMethod JenkinsBuild.DistributedBuildSetup

Bat驱动Python

Bat调用Python是非常简单的

python F:\WorkSpace\ToolTest\ToolPython.py

当然了也可以传入参数

python F:\WorkSpace\ToolTest\ToolPython.py -targetModel "1" -unity "C:\Program Files\Unity\Editor\Unity.exe" -project "D:\WorkSpace\Project_Main\Client"

python中解析Bat中传入的参数如下

def WriteFileLog(logContext):
fileName = "pythonLog.txt"
logFile = open(fileName,"a+")
logFile.write(logContext + '\n')
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description=u'Unity realtime log printing build!')
parser.add_argument('-targetModel', required=True, help=u'Target Model')
parser.add_argument('-unity', required=True, help=u'Unity executable file path')
parser.add_argument('-project', required=True, help=u'Unity project path')
args = parser.parse_args()
WriteFileLog(args.unity)
WriteFileLog(args.project)
if args.targetModel == "1":
WriteFileLog("1111111")
else:
WriteFileLog("222222")

Bat通过ini文件传入参数

根据设计模式中的开闭原则。尽可能在外部的改动时,不会动到原有的实现了,而是扩展。我们的工作操作者很可能是非技术,更多的情形他们认识配置文件,却无从改动编码。因此我们希望常改动配置的项放在ini文件中。

#unity路径
unityPath=C:/Program Files/Unity/Editor/Unity.exe
#工程路径
projectPath=F:/Branches/Int_RG/Client
targetModel=1

现在我们的Bat只要将ini作为参数传入python就好。

python ToolPython_ini.py ToolIni.ini

如何在python中解析这些参数呢? 跟着小菜往下看

def WriteFileLog(logContext):
fileName = "pythonLog.txt"
logFile = open(fileName,"a+")
logFile.write(logContext + '\n')
if __name__ == '__main__':
config = sys.argv[1]
unityPath = readconfig(config, "unityPath").replace("\n","")
projectPath = readconfig(config, "projectPath").replace("\n", "")
targetModel = readconfig(config, "targetModel").replace("\n", "")
WriteFileLog(unityPath)
WriteFileLog(projectPath)
if targetModel == "1":
WriteFileLog("1111111")
else:
WriteFileLog("222222")

Python脚本中调用Unity

“我可以悄悄学个Python然后惊艳所有人!” 哈哈终于派到python出场了。 这里尤其要说明python的头定义报错问题。 在python的脚本前定义上这两行编码

#!/usr/bin/python
# -*- coding: UTF-8 -*-

下面是一段完整的Pyhton调用Unity编码,具体细节在UnityBuild函数中

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import platform
import os
import thread
import tail
import subprocess
#执行命令,如果错误,打印错误代码
_isWinPlatform = ("Windows" in platform.system())
def DoCmd(cmd):
if _isWinPlatform:
print("cmd: " + cmd)
status = os.system(cmd)
print ("\ncmd [" + cmd + "]: " + str(status))
return status == 0
return False
def WriteFileLog(logContext):
fileName = "pythonLog.txt"
logFile = open(fileName,"a+")
logFile.write(logContext + '\n')
def fullpath(path):
return os.path.abspath(os.path.expanduser(path))
def tail_thread(tail_file):
print "wait for tail file ... %s" % tail_file
while True:
if os.path.exists(tail_file):
print "Start tail file..... %s" % tail_file
break
t = tail.Tail(tail_file)
t.register_callback(unity_log_tail)
t.follow(s=1)
def unity_log_tail(txt):
print(txt)
def UnityBuild(projectPath,unityPath,args1,args2,args3):
DoCmd('''taskkill /f /im Unity.exe''')
build_cmd = [unityPath, '-batchmode', '-quit', '-projectPath', projectPath, '-nographics', '-executeMethod', 'JenkinsBuild.DistributedBuildSetup' 'Args1='+args1, 'Args2='+args2, 'Args3='+args3]
print 'Unity running ....'
logOutPath = fullpath(os.path.join(projectPath, 'UnityBuildLog.txt')
# new thread to tail log file
thread.start_new_thread(tail_thread, (logOutPath, ))
process = subprocess.Popen(
build_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, cwd=projectPath
)
while True:
out = process.stdout.read(1)
if out == '' and process.poll() != None:
break
if out != '':
sys.stdout.write("[Unity process console output]: " + out)
sys.stdout.flush()
print 'sys.stdout.flush. out: ' + out
print 'done!'
time.sleep(5)
def WriteFileLog(logContext):
fileName = "pythonLog.txt"
logFile = open(fileName,"a+")
logFile.write(logContext + '\n')
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description=u'Unity realtime log printing build!')
parser.add_argument('-targetModel', required=True, help=u'Target Model')
parser.add_argument('-unity', required=True, help=u'Unity executable file path')
parser.add_argument('-project', required=True, help=u'Unity project path')
args = parser.parse_args()
WriteFileLog(args.unity)
WriteFileLog(args.project)
if args.targetModel == "1":
WriteFileLog("1111111")
else:
WriteFileLog("222222")
Args1 = "agcdefg"
Args2 = "66666"
Args3 = "true"
UnityBuild(fullpath(args.project),fullpath(args.unity),Args1,Args2,Args3)

脚本分享

百度网盘地址: 链接:https://pan.baidu.com/s/1gRnEWKqf2uqVBRxLjNEi7Q 提取码:w4so

微信公众号:吹弹牛皮之unity程序设计 作者:赵晋伟 《吹弹牛皮之Unity 工具制作常用交互bat ini python》版权归原作者小菜(赵晋伟)所有,请勿随意转载和抄袭一经作者发现将需要追究其法律责任和经济损失!谢谢!

本文分享自微信公众号 - 吹弹牛皮之unity程序设计(gh_4f97f8f53f59)

原文出处及转载信息见文内详细说明,如有侵权,请联系 [email protected] 删除。

原始发表时间: 2021-10-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

版权声明
本文为[用户7698595]所创,转载请带上原文链接,感谢
https://cloud.tencent.com/developer/article/1893447

  1. It's time for everyone to see your blog written in Django (including deployment tutorial video)
  2. Python扩展速记符 要求用for循环,if语句
  3. Python擴展速記符 要求用for循環,if語句
  4. Le sténographe d'extension Python nécessite une boucle pour, si instruction
  5. Python+人工智能就业班v5.0wumi
  6. python编程技术的题目,希望能得到解答
  7. Pandas determines the header row dynamically
  8. 关于#python#的问题:模拟登陆后能获取到cookie,就是cookie一天就过期
  9. pandas为dataframe添加新的数据行(rows)、在dataframe后面纵向添加一行数据(数据为列表list形式)、列有不匹配将会使用NA值进行填补
  10. pandas使用组合条件筛选、过滤数据行
  11. 热烈祝贺1024,求解Python3.10闪退问题
  12. Python基础题练习题库有没呢?
  13. python构建神经网络,正向和反向传播
  14. python爬虫输入数字翻页才成功,用变量代替不成功,为什么?
  15. 【Python 爬虫】 2、HTTP基本原理
  16. 【Python 爬虫】 1、爬虫基础概念
  17. Python中如何用find函数计数?
  18. 一文搞懂Python装饰器
  19. python数据结构之递归
  20. 关于#python#的问题:为什么这个open函数会报错
  21. Python:多输入数字求和(Python 程序控制结构)
  22. python忽略警告
  23. Python多维数组问题(编写程序统计成绩)
  24. 一步一步展示并总结Python的异常【建议收藏】
  25. Python中奇葩的round函数!
  26. 总结一下Python的模块加载解析
  27. 保姆级指导给Python库创建桌面快捷方式【赶紧收藏】
  28. 多图速成Python基础语法下篇【万字建议收藏】
  29. Python 命令行工具辅助getopt使用解析!
  30. 【python种子项目ppc】保姆级别指导给项目添加测试
  31. 【python种子项目ppc】一行代码生成项目与开发详细指导
  32. 保姆级教程带你开发优质的Python库之下篇【种子项目】
  33. 保姆级教程带你开发优质的Python库之中篇【命令行发行】
  34. 保姆级教程带你开发优质的Python库之上篇【建议收藏】
  35. python列表自动计算总分程序
  36. 某企业职工的月薪问题python 求解 不知道自己哪里写错了
  37. Python中外部函数对class类中的属性的调用
  38. 朋友股票亏惨了,我一怒用Python爬取了证券最新数据
  39. 习题8和9怎么写(Python基础)
  40. python数据分析,求任务4,5
  41. Python 的 f-strings,远比你想象的要强大!
  42. django channels channel_layer.group_send 造成内存溢出
  43. 判断天数问题用python 解决 不知道自己哪里写错了 一直显示invalid syntax
  44. OpenCV-Python对比度受限的自适应直方图均衡CLAHE知识介绍
  45. pandas 如何读取指定位置和数量的列
  46. django后台模型中的文件字段,上传后再下载时提示找不到页面
  47. 关于#python#的问题:使用requests请求网页时出现网页过期是怎么回事啊,cookie也没有过期,也提交了头文件的
  48. Pycharm开发Django项目外键和表关系
  49. [PYTHON][BAT][SHELL] 常见易忘 python、bat、shell 脚本操作汇总(持续更新)
  50. django学习-34.【多对多】表关系对应的完整业务操作
  51. 在GitHub上下载了一个python代码,看readme很疑惑,求解答
  52. 怎么用python程序做这问题
  53. python程序设计实验4-程序的异常处理
  54. 【Python每日作业】Day7: 如何在一个表达式里面合并两个字典?
  55. Python Type Hints 从入门到实践
  56. pyinstaller 打包 exe 无法在没有装python的电脑上运行,提示如下。。
  57. 关于Python中的Image. open函数的使用出现的问题
  58. 代码0基础先学哪个?WEB、python、JAVA
  59. Python基于PCANBasic二次开发使用方法
  60. Python实现相加为奇数则用户赢,如果并且用户能自行选择退出游戏,且计算他们的分数