148 lines
4.4 KiB
Bash
148 lines
4.4 KiB
Bash
#!/bin/bash
|
||
# 打开unity并等待编译完成后自动退出
|
||
# 当前目录在C:/Work/Projects/NLDClient/Tool/dll_tools
|
||
# 找到同级别C:/Work/Projects/NLDClient/ProjectNLD
|
||
# 需要删除 C:/Work/Projects/NLDClient/ProjectNLD/Assets/Code/Scripts/GamePlay_Dll
|
||
# 打开unity
|
||
# 等待编译完成
|
||
# 退出unity
|
||
|
||
# 获取当前脚本所在目录的绝对路径
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
||
# 基于当前脚本位置计算PROJECT_PATH
|
||
# 当前目录是C:/Work/Projects/NLDClient/Tool/dll_tools
|
||
# 我们需要向上两级再进入ProjectNLD目录
|
||
PROJECT_PATH="$(dirname "$(dirname "$SCRIPT_DIR")")/ProjectNLD"
|
||
echo "Calculated PROJECT_PATH: $PROJECT_PATH"
|
||
|
||
# 检查PROJECT_PATH是否存在
|
||
if [ ! -d "$PROJECT_PATH" ]; then
|
||
echo "PROJECT_PATH does not exist: $PROJECT_PATH"
|
||
exit 1
|
||
fi
|
||
echo "PROJECT_PATH exists: $PROJECT_PATH"
|
||
|
||
# 检查本地是否有local_env.sh文件, 如果有则使用其中的路径, 里面定义了UNITY_PATH
|
||
# 如果没有则使用默认的unity地址
|
||
if [ -f ./local_env.sh ]; then
|
||
source ./local_env.sh
|
||
echo "found the local_env file"
|
||
else
|
||
# 没有则使用默认的unity地址
|
||
# UNITY_PATH="/Applications/Unity/Hub/Editor/2022.3.50f1c1/Unity.app/Contents/MacOS/Unity"
|
||
echo "local_env.sh not found, using default UNITY_PATH"
|
||
UNITY_PATH="/Applications/Unity/Hub/Editor/2022.3.50f1c1/Unity.app/Contents/MacOS/Unity"
|
||
fi
|
||
# 输出UNITY_PATH
|
||
echo "UNITY_PATH: $UNITY_PATH"
|
||
|
||
# 删除指定文件夹
|
||
NEED_DELETE_PATH="$PROJECT_PATH/Assets/Code/Scripts/GamePlay_Dll"
|
||
if [ -d "$NEED_DELETE_PATH" ]; then
|
||
echo "Deleting $NEED_DELETE_PATH"
|
||
rm -rf "$NEED_DELETE_PATH"
|
||
else
|
||
echo "$NEED_DELETE_PATH does not exist, skipping deletion."
|
||
fi
|
||
|
||
# 创建临时日志文件
|
||
LOG_FILE="unity_build_$(date +%Y%m%d_%H%M%S).log"
|
||
echo "Unity build log will be saved to $LOG_FILE"
|
||
|
||
# 创建一个临时的编辑器脚本,用于在编译完成后退出Unity
|
||
TEMP_SCRIPT="$PROJECT_PATH/Assets/Editor/TempQuitAfterBuild.cs"
|
||
mkdir -p "$(dirname "$TEMP_SCRIPT")"
|
||
|
||
cat > "$TEMP_SCRIPT" << 'EOL'
|
||
using UnityEditor;
|
||
using UnityEngine;
|
||
|
||
[InitializeOnLoad]
|
||
public class QuitAfterBuild
|
||
{
|
||
static QuitAfterBuild()
|
||
{
|
||
EditorApplication.update += WaitForCompilation;
|
||
}
|
||
|
||
static void WaitForCompilation()
|
||
{
|
||
if (!EditorApplication.isCompiling)
|
||
{
|
||
Debug.Log("Compilation finished. Quitting Unity...");
|
||
EditorApplication.update -= WaitForCompilation;
|
||
EditorApplication.Exit(0);
|
||
}
|
||
}
|
||
}
|
||
EOL
|
||
|
||
echo "Starting Unity in batchmode..."
|
||
|
||
# 使用Unity的batchmode命令行参数打开项目
|
||
"$UNITY_PATH" -projectPath "$PROJECT_PATH" -logFile "$LOG_FILE" &
|
||
|
||
# 保存Unity进程ID
|
||
UNITY_PID=$!
|
||
|
||
echo "Unity started with PID: $UNITY_PID"
|
||
echo "Waiting for Unity to complete compilation and exit..."
|
||
|
||
# 设置最大等待时间(以秒为单位)
|
||
MAX_WAIT_TIME=3000 # 50分钟
|
||
START_TIME=$(date +%s)
|
||
|
||
# 等待Unity进程结束或超时
|
||
while kill -0 $UNITY_PID 2>/dev/null; do
|
||
# 检查是否超时
|
||
CURRENT_TIME=$(date +%s)
|
||
ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
|
||
|
||
if [ $ELAPSED_TIME -gt $MAX_WAIT_TIME ]; then
|
||
echo "Timeout reached after $MAX_WAIT_TIME seconds. Unity might be stuck."
|
||
echo "Killing Unity process..."
|
||
kill $UNITY_PID
|
||
sleep 2
|
||
# 如果进程仍然存在,强制终止
|
||
if kill -0 $UNITY_PID 2>/dev/null; then
|
||
kill -9 $UNITY_PID
|
||
fi
|
||
echo "Unity process was terminated due to timeout."
|
||
rm -f "$TEMP_SCRIPT"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查日志文件中是否有编译错误
|
||
if [ -f "$LOG_FILE" ] && grep -q "CompilerErrorException" "$LOG_FILE"; then
|
||
echo "Compilation errors detected in log file."
|
||
echo "Killing Unity process..."
|
||
kill $UNITY_PID
|
||
sleep 2
|
||
if kill -0 $UNITY_PID 2>/dev/null; then
|
||
kill -9 $UNITY_PID
|
||
fi
|
||
echo "Unity process was terminated due to compilation errors."
|
||
rm -f "$TEMP_SCRIPT"
|
||
exit 1
|
||
fi
|
||
|
||
# 每秒检查一次
|
||
sleep 1
|
||
done
|
||
|
||
# 获取Unity进程的退出状态
|
||
wait $UNITY_PID
|
||
EXIT_CODE=$?
|
||
|
||
# 删除临时编辑器脚本
|
||
rm -f "$TEMP_SCRIPT"
|
||
|
||
if [ $EXIT_CODE -ne 0 ]; then
|
||
echo "Unity process exited with error code: $EXIT_CODE"
|
||
echo "Check the build log for errors: $LOG_FILE"
|
||
exit $EXIT_CODE
|
||
else
|
||
echo "Unity process has exited successfully."
|
||
echo "Build log available at: $LOG_FILE"
|
||
fi |