# Unity Environment Setup Script for ROS2 Integration # 配置Unity环境以支持ROS2机器人控制系统 param( [switch]$CheckVersion, [switch]$OpenProject, [switch]$UpdatePackages, [switch]$VerifySetup, [string]$UnityPath = "C:\Program Files\Unity\Hub\Editor\2021.3.33f1c1\Editor\Unity.exe" ) # 项目路径配置 $ProjectRoot = Split-Path -Parent $PSScriptRoot $PickAndPlaceProject = Join-Path (Split-Path -Parent $ProjectRoot) "PickAndPlaceProject" $UnityProject = Join-Path $ProjectRoot "unity-project" Write-Host "=== Unity Environment Setup Script ===" -ForegroundColor Green Write-Host "Unity Path: $UnityPath" -ForegroundColor Cyan Write-Host "Project Root: $ProjectRoot" -ForegroundColor Cyan Write-Host "PickAndPlace Project: $PickAndPlaceProject" -ForegroundColor Cyan function Test-UnityInstallation { Write-Host "`nChecking Unity installation..." -ForegroundColor Yellow if (Test-Path $UnityPath) { Write-Host "Unity 2021.3.33f1c1 found at: $UnityPath" -ForegroundColor Green # 获取Unity版本信息 try { $versionInfo = & $UnityPath -version 2>&1 | Out-String Write-Host "Unity Version Info: $versionInfo" -ForegroundColor Gray } catch { Write-Host "Could not retrieve version info, but Unity executable exists" -ForegroundColor Yellow } return $true } else { Write-Host "Unity not found at specified path!" -ForegroundColor Red Write-Host "Please verify Unity installation path" -ForegroundColor Red return $false } } function Test-ProjectCompatibility { Write-Host "`nChecking project compatibility..." -ForegroundColor Yellow $projectVersionFile = Join-Path $PickAndPlaceProject "ProjectSettings\ProjectVersion.txt" if (Test-Path $projectVersionFile) { $content = Get-Content $projectVersionFile $editorVersion = ($content | Where-Object { $_ -match "m_EditorVersion:" }) -replace "m_EditorVersion: ", "" Write-Host "Current Project Version: $editorVersion" -ForegroundColor Gray Write-Host "Target Unity Version: 2021.3.33f1c1" -ForegroundColor Gray if ($editorVersion -like "2022.*") { Write-Host "Project was created with Unity 2022.x" -ForegroundColor Yellow Write-Host "Downgrading to Unity 2021.3 may require package updates" -ForegroundColor Yellow return $false } elseif ($editorVersion -like "2021.3.*") { Write-Host "Project version compatible with Unity 2021.3" -ForegroundColor Green return $true } else { Write-Host "Unknown version compatibility" -ForegroundColor Yellow return $false } } else { Write-Host "Project version file not found!" -ForegroundColor Red return $false } } function Test-ROSPackages { Write-Host "`nChecking ROS packages..." -ForegroundColor Yellow $manifestFile = Join-Path $PickAndPlaceProject "Packages\manifest.json" if (Test-Path $manifestFile) { $manifest = Get-Content $manifestFile -Raw | ConvertFrom-Json # 检查关键的ROS包 $requiredPackages = @{ "com.unity.robotics.ros-tcp-connector" = "ROS TCP Connector"; "com.unity.robotics.urdf-importer" = "URDF Importer" } $allPackagesFound = $true foreach ($package in $requiredPackages.Keys) { if ($manifest.dependencies.PSObject.Properties.Name -contains $package) { $version = $manifest.dependencies.$package Write-Host "$($requiredPackages[$package]): $version" -ForegroundColor Green } else { Write-Host "Missing: $($requiredPackages[$package])" -ForegroundColor Red $allPackagesFound = $false } } return $allPackagesFound } else { Write-Host "Package manifest not found!" -ForegroundColor Red return $false } } function Update-ProjectVersion { Write-Host "`nUpdating project version..." -ForegroundColor Yellow $projectVersionFile = Join-Path $PickAndPlaceProject "ProjectSettings\ProjectVersion.txt" if (Test-Path $projectVersionFile) { $newContent = @( "m_EditorVersion: 2021.3.33f1c1" "m_EditorVersionWithRevision: 2021.3.33f1c1 (b9a993fd2ece)" ) Set-Content -Path $projectVersionFile -Value $newContent -Encoding UTF8 Write-Host "Project version updated to Unity 2021.3.33f1c1" -ForegroundColor Green } else { Write-Host "Could not update project version file" -ForegroundColor Red } } function Open-UnityProject { Write-Host "`nOpening Unity project..." -ForegroundColor Yellow if (Test-Path $PickAndPlaceProject) { Write-Host "Opening project: $PickAndPlaceProject" -ForegroundColor Cyan # 启动Unity并打开项目 Start-Process -FilePath $UnityPath -ArgumentList "-projectPath `"$PickAndPlaceProject`"" -NoNewWindow Write-Host "Unity project opening..." -ForegroundColor Green Write-Host "Please wait for Unity to load and resolve packages" -ForegroundColor Gray } else { Write-Host "Project directory not found!" -ForegroundColor Red } } function Show-SetupInstructions { Write-Host "`n=== Unity Setup Instructions ===" -ForegroundColor Cyan Write-Host "" Write-Host "1. Project Compatibility Check:" -ForegroundColor Yellow Write-Host " - Current project created with Unity 2022.x" Write-Host " - Needs downgrade to Unity 2021.3.33f1c1" Write-Host " - May require package re-import" Write-Host "" Write-Host "2. ROS Package Verification:" -ForegroundColor Yellow Write-Host " - ROS TCP Connector: Installed (v0.7.0)" Write-Host " - URDF Importer: Installed (v0.5.2)" Write-Host "" Write-Host "3. Recommended Steps:" -ForegroundColor Yellow Write-Host " a) Backup current project" Write-Host " b) Open project with Unity 2021.3.33f1c1" Write-Host " c) Allow Unity auto upgrade/downgrade" Write-Host " d) Check ROS packages in Package Manager" Write-Host " e) Re-import necessary assets" -ForegroundColor Yellow Write-Host "" Write-Host "4. Connection Configuration:" -ForegroundColor Yellow Write-Host " - ROS TCP Endpoint: localhost:10000" Write-Host " - Test connection after Docker container is running" Write-Host "" } function Test-NetworkConnectivity { Write-Host "`nTesting network connectivity..." -ForegroundColor Yellow # 测试Docker容器端口 $rosPort = 10000 try { $connection = Test-NetConnection -ComputerName "localhost" -Port $rosPort -WarningAction SilentlyContinue if ($connection.TcpTestSucceeded) { Write-Host "ROS TCP Endpoint accessible on port $rosPort" -ForegroundColor Green } else { Write-Host "ROS TCP Endpoint not accessible (Docker container may not be running)" -ForegroundColor Yellow } } catch { Write-Host "Could not test network connectivity" -ForegroundColor Yellow } } # 主执行逻辑 if ($CheckVersion) { Test-UnityInstallation Test-ProjectCompatibility Test-ROSPackages } elseif ($OpenProject) { if (Test-UnityInstallation) { Update-ProjectVersion Open-UnityProject } } elseif ($UpdatePackages) { Write-Host "Package update functionality will be implemented after Unity opens" -ForegroundColor Yellow Show-SetupInstructions } elseif ($VerifySetup) { Test-UnityInstallation Test-ProjectCompatibility Test-ROSPackages Test-NetworkConnectivity Show-SetupInstructions } else { # 默认执行完整检查 Write-Host "Running complete Unity environment check..." -ForegroundColor Cyan $unityOK = Test-UnityInstallation $projectOK = Test-ProjectCompatibility $packagesOK = Test-ROSPackages if ($unityOK -and $projectOK -and $packagesOK) { Write-Host "`nUnity environment ready!" -ForegroundColor Green Write-Host "Use -OpenProject to launch Unity with the project" -ForegroundColor Cyan } else { Write-Host "`nUnity environment needs attention" -ForegroundColor Yellow Show-SetupInstructions } } Write-Host "`n=== Available Commands ===" -ForegroundColor Cyan Write-Host ".\setup-unity-environment.ps1 -CheckVersion # Check Unity and project versions" Write-Host ".\setup-unity-environment.ps1 -OpenProject # Open Unity project" Write-Host ".\setup-unity-environment.ps1 -VerifySetup # Complete environment verification" Write-Host ".\setup-unity-environment.ps1 # Run default checks"