2025-04-30 14:52:55 +08:00
|
|
|
|
#!/bin/bash
|
|
|
|
|
|
# 打开unity并等待编译完成后自动退出
|
|
|
|
|
|
# 当前目录在C:/Work/Projects/NLDClient/Tool/dll_tools
|
|
|
|
|
|
# 找到同级别C:/Work/Projects/NLDClient/ProjectNLD
|
2025-04-30 15:23:48 +08:00
|
|
|
|
# 需要删除 C:/Work/Projects/NLDClient/ProjectNLD/Assets/Code/Scripts/GamePlay_Dll
|
2025-04-30 14:52:55 +08:00
|
|
|
|
# 打开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"
|
|
|
|
|
|
|
2025-04-30 15:23:48 +08:00
|
|
|
|
# 删除指定文件夹
|
|
|
|
|
|
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
|
|
|
|
|
|
|
2025-04-30 14:52:55 +08:00
|
|
|
|
# 创建临时日志文件
|
|
|
|
|
|
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..."
|
|
|
|
|
|
|
2025-05-06 13:13:30 +08:00
|
|
|
|
# 设置最大等待时间(以秒为单位)
|
|
|
|
|
|
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进程的退出状态
|
2025-04-30 14:52:55 +08:00
|
|
|
|
wait $UNITY_PID
|
2025-05-06 13:13:30 +08:00
|
|
|
|
EXIT_CODE=$?
|
2025-04-30 14:52:55 +08:00
|
|
|
|
|
|
|
|
|
|
# 删除临时编辑器脚本
|
|
|
|
|
|
rm -f "$TEMP_SCRIPT"
|
|
|
|
|
|
|
2025-05-06 13:13:30 +08:00
|
|
|
|
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
|