diff --git a/scripts/build-unity-package.ps1 b/scripts/build-unity-package.ps1 new file mode 100644 index 00000000..e5cc82aa --- /dev/null +++ b/scripts/build-unity-package.ps1 @@ -0,0 +1,84 @@ +param( + [string] $Configuration = "Release", + [string] $OutputDirectory = "artifacts\unity\org.gamecult.cultlib" +) + +$ErrorActionPreference = "Stop" + +$repoRoot = Split-Path -Parent $PSScriptRoot +$projectPath = Join-Path $repoRoot "src\GameCult.Mesh\GameCult.Mesh.csproj" +$templateRoot = Join-Path $repoRoot "unity\org.gamecult.cultlib" +$publishRoot = Join-Path $repoRoot "artifacts\unity-publish" +$outputRoot = if ([System.IO.Path]::IsPathRooted($OutputDirectory)) { + $OutputDirectory +} else { + Join-Path $repoRoot $OutputDirectory +} +$pluginRoot = Join-Path $outputRoot "Runtime\Plugins" + +if (Test-Path -LiteralPath $publishRoot) { + Remove-Item -LiteralPath $publishRoot -Recurse -Force +} +if (Test-Path -LiteralPath $outputRoot) { + Remove-Item -LiteralPath $outputRoot -Recurse -Force +} + +dotnet publish $projectPath -c $Configuration -o $publishRoot +if ($LASTEXITCODE -ne 0) { + throw "CultLib publish failed with exit code $LASTEXITCODE" +} + +New-Item -ItemType Directory -Force -Path $pluginRoot | Out-Null +Copy-Item -LiteralPath (Join-Path $templateRoot "package.json") -Destination $outputRoot +Copy-Item -LiteralPath (Join-Path $templateRoot "README.md") -Destination $outputRoot + +$expectedAssemblies = @( + "ConcurrentCollections.dll", + "GameCult.Caching.dll", + "GameCult.Caching.MessagePack.dll", + "GameCult.Logging.dll", + "GameCult.Mesh.dll", + "GameCult.Networking.dll", + "Isopoh.Cryptography.Argon2.dll", + "Isopoh.Cryptography.Blake2b.dll", + "Isopoh.Cryptography.SecureArray.dll", + "LiteNetLib.dll", + "MessagePack.Annotations.dll", + "MessagePack.dll", + "Microsoft.Bcl.AsyncInterfaces.dll", + "Microsoft.Bcl.TimeProvider.dll", + "Microsoft.NET.StringTools.dll", + "R3.dll", + "System.Collections.Immutable.dll", + "System.ComponentModel.Annotations.dll", + "System.IO.Pipelines.dll", + "System.Runtime.CompilerServices.Unsafe.dll", + "System.Text.Encodings.Web.dll", + "System.Text.Json.dll", + "System.Threading.Channels.dll" +) +$publishedByName = @{} +foreach ($assembly in Get-ChildItem -LiteralPath $publishRoot -Filter "*.dll") { + $publishedByName[$assembly.Name] = $assembly +} +foreach ($assemblyName in $expectedAssemblies) { + if (-not $publishedByName.ContainsKey($assemblyName)) { + throw "CultLib Unity package is missing expected assembly: $assemblyName" + } +} + +Copy-Item -LiteralPath (Join-Path $templateRoot "Runtime\GameCult.CultLib.asmdef") ` + -Destination (Join-Path $outputRoot "Runtime") +foreach ($assemblyName in $expectedAssemblies) { + $assembly = $publishedByName[$assemblyName] + Copy-Item -LiteralPath $assembly.FullName -Destination $pluginRoot + $pdb = [System.IO.Path]::ChangeExtension($assembly.FullName, ".pdb") + if (Test-Path -LiteralPath $pdb) { + Copy-Item -LiteralPath $pdb -Destination $pluginRoot + } +} + +$manifest = Get-Content -LiteralPath (Join-Path $outputRoot "package.json") -Raw | ConvertFrom-Json +Write-Host "CultLib Unity package: $outputRoot" +Write-Host "Package: $($manifest.name)@$($manifest.version)" +Write-Host "Managed assemblies: $($expectedAssemblies.Count)" diff --git a/unity/org.gamecult.cultlib/README.md b/unity/org.gamecult.cultlib/README.md new file mode 100644 index 00000000..20fd4597 --- /dev/null +++ b/unity/org.gamecult.cultlib/README.md @@ -0,0 +1,8 @@ +# CultLib for Unity + +This package is generated from the CultLib .NET projects. It carries the same +CultCache, CultNet, and CultMesh assemblies consumed through NuGet by normal +.NET applications, staged as Unity-compatible managed plugins. + +Build it with `scripts/build-unity-package.ps1`. Do not edit generated plugin +assemblies in the package output. diff --git a/unity/org.gamecult.cultlib/Runtime/GameCult.CultLib.asmdef b/unity/org.gamecult.cultlib/Runtime/GameCult.CultLib.asmdef new file mode 100644 index 00000000..6a2d7707 --- /dev/null +++ b/unity/org.gamecult.cultlib/Runtime/GameCult.CultLib.asmdef @@ -0,0 +1,38 @@ +{ + "name": "GameCult.CultLib", + "rootNamespace": "GameCult", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": true, + "precompiledReferences": [ + "ConcurrentCollections.dll", + "GameCult.Caching.dll", + "GameCult.Caching.MessagePack.dll", + "GameCult.Logging.dll", + "GameCult.Mesh.dll", + "GameCult.Networking.dll", + "Isopoh.Cryptography.Argon2.dll", + "Isopoh.Cryptography.Blake2b.dll", + "Isopoh.Cryptography.SecureArray.dll", + "LiteNetLib.dll", + "MessagePack.Annotations.dll", + "MessagePack.dll", + "Microsoft.Bcl.AsyncInterfaces.dll", + "Microsoft.Bcl.TimeProvider.dll", + "Microsoft.NET.StringTools.dll", + "R3.dll", + "System.Collections.Immutable.dll", + "System.ComponentModel.Annotations.dll", + "System.IO.Pipelines.dll", + "System.Runtime.CompilerServices.Unsafe.dll", + "System.Text.Encodings.Web.dll", + "System.Text.Json.dll", + "System.Threading.Channels.dll" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": true +} diff --git a/unity/org.gamecult.cultlib/package.json b/unity/org.gamecult.cultlib/package.json new file mode 100644 index 00000000..12e13589 --- /dev/null +++ b/unity/org.gamecult.cultlib/package.json @@ -0,0 +1,11 @@ +{ + "name": "org.gamecult.cultlib", + "displayName": "CultLib", + "version": "1.0.3", + "unity": "2021.3", + "description": "CultCache, CultNet, and CultMesh managed runtime assemblies for Unity.", + "license": "MIT", + "author": { + "name": "GameCult" + } +}