基本原理:命令行啟動Unity,然后執行對應的類中的靜態方法。
unity命令行參數簡介:https://my.oschina.net/mbreath/blog/759480
Unity工程目錄:
D:\0_lugsProjects\XLua\xlua
Unity安裝目錄:
D:\1_WorkSoftware\Unity2017.2.0p4\Unity\Editor\Unity.exe
編寫CShrap代碼:
1 using UnityEditor; 2 using UnityEngine; 3 4 public class EditorMenu 5 { 6 [MenuItem("Test/測試Python調用Unity方法")] 7 public static void TestPythonUnity() 8 { 9 Debug.Log("測試Python調用Unity方法"); 10 } 11 }
運行之后,將“測試Python調用Unity方法”這句話寫入log文件。
編寫Python腳本:
1 import os 2 import subprocess 3 import psutil 4 5 #判斷進程是否正在運行 6 def Exist(process_name): 7 pl = psutil.pids() 8 for pid in pl: 9 if psutil.Process(pid).name() == process_name: 10 return pid 11 12 #殺掉運行中的Unity 13 def KillUnity(): 14 if isinstance(Exist("Unity.exe"),int): 15 os.system("taskKill /F /IM Unity.exe") 16 else: 17 print('no such process...') 18 19 def ExcuteUnityMethod(): 20 unityPath = "D:\\1_WorkSoftware\\Unity2017.2.0p4\\Unity\\Editor\\Unity.exe" 21 logFilePath = "D:\\0_lugsProjects\\Python\\Log_PythonUnity.txt" 22 projectPath = "D:\\0_lugsProjects\\XLua\\xlua" 23 className = "EditorMenu" 24 methodName = "TestPythonUnity" 25 cmd = "%s -quit -batchmode -logFile %s -projectPath %s -executeMethod %s.%s" % (unityPath,logFilePath,projectPath,className,methodName) 26 #print(cmd) 27 subprocess.Popen(cmd) 28 29 def Main(): 30 KillUnity() 31 ExcuteUnityMethod() 32 33 Main() 34 35 input("Enter any key ...")
注意:psutil是一個模塊,需要單獨安裝。以下網址為其介紹。
https://www.liaoxuefeng.com/wiki/1016959663602400/1183565811281984
運行python腳本結果的部分截圖:
可以看到CSharp代碼中的方法被正確執行了。
如果想在CSharp方法中拿到python傳過去的參數該如何做呢?很簡單,CSharp提供了獲取命令行參數額接口,代碼如下:
1 static void ParseCommandParams() 2 { 3 string[] array = System.Environment.GetCommandLineArgs(); 4 if (null != array) 5 { 6 for (int i = 0; i < array.Length; ++i) 7 { 8 DebugLog(array[i]); 9 } 10 } 11 }