Skip to content

Commit 2e6d6ea

Browse files
committed
feat: asset packs for New Game as dotnet new item templates
New Stride.Templates.AssetPacks package (nuget.org only, fetched on demand) ships Building blocks / Animated models / Materials / Particles. GameStudio offers them as checkboxes when creating a game; dotnet new and the stride CLI instantiate them into an existing game.
1 parent 9ccb2de commit 2e6d6ea

25 files changed

Lines changed: 499 additions & 33 deletions

File tree

.github/workflows/release-deploy.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ jobs:
137137
}
138138
139139
$packages = Get-ChildItem -Path bin/packages -Filter "*.nupkg"
140-
$contentVersionedIds = @('Stride.Templates.Samples', 'Stride.Templates.Games.Starters')
141-
$contentVersioned = $packages | Where-Object { $_.Name -match 'Stride\.Templates\.(Samples|Games\.Starters)\.' }
140+
$contentVersionedIds = @('Stride.Templates.Samples', 'Stride.Templates.Games.Starters', 'Stride.Templates.AssetPacks')
141+
$contentVersioned = $packages | Where-Object { $_.Name -match 'Stride\.Templates\.(Samples|Games\.Starters|AssetPacks)\.' }
142142
$gameStudio = $packages | Where-Object { $_.Name -match 'GameStudio' }
143-
$main = $packages | Where-Object { $_.Name -notmatch 'GameStudio' -and $_.Name -notmatch 'Stride\.Templates\.(Samples|Games\.Starters)\.' }
143+
$main = $packages | Where-Object { $_.Name -notmatch 'GameStudio' -and $_.Name -notmatch 'Stride\.Templates\.(Samples|Games\.Starters|AssetPacks)\.' }
144144
145145
echo "::group::Pushing main packages ($($main.Count))"
146146
foreach ($pkg in $main) {
@@ -150,7 +150,7 @@ jobs:
150150
echo "::endgroup::"
151151
152152
if ($contentVersioned) {
153-
echo "::group::Pushing content-versioned template packages (Samples, Starters)"
153+
echo "::group::Pushing content-versioned template packages (Samples, Starters, AssetPacks)"
154154
foreach ($pkg in $contentVersioned) {
155155
$id = $contentVersionedIds | Where-Object { $pkg.Name.StartsWith($_ + '.') } | Select-Object -First 1
156156
if ($id -and (Test-NuGetPublished $id $pkg.BaseName.Substring($id.Length + 1))) {

build/Stride.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@
189189
</Folder>
190190
<Folder Name="/72-StrideSamples.Templates/">
191191
<Project Path="../sources/engine/Stride.Games.AutoTesting/Stride.Games.AutoTesting.csproj" />
192+
<Project Path="../sources/templates/Stride.Templates.AssetPacks/Stride.Templates.AssetPacks.csproj" />
192193
<Project Path="../sources/templates/Stride.Templates.Games.Starters/Stride.Templates.Games.Starters.csproj" />
193194
<Project Path="../sources/templates/Stride.Templates.Games/Stride.Templates.Games.csproj" />
194195
<Project Path="../sources/templates/Stride.Templates.Samples/Stride.Templates.Samples.csproj" />

docs/build/versioning.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,6 @@ dotnet msbuild build/Stride.Samples.build -t:SamplesToReleaseVersion # finaliz
8282
**Template package versions** ([`Stride.Templates.Common.targets`](../../sources/templates/Stride.Templates.Common.targets)):
8383

8484
- `Stride.Templates.Games` (NewGame + Library) → **engine-versioned** (`$(StrideNuGetVersion)`), always rebuilt and pushed (small).
85-
- `Stride.Templates.Samples` + `Stride.Templates.Games.Starters`**content-versioned** at the committed `StrideSamplesVersion` ([`StrideSamplesVersion.props`](../../sources/templates/StrideSamplesVersion.props)); they only change (and re-publish) when the samples are actually bumped. The GameStudio bridge resolves the highest published version `<=` the engine version for these.
85+
- `Stride.Templates.Samples` + `Stride.Templates.Games.Starters` + `Stride.Templates.AssetPacks` **content-versioned** at the committed `StrideSamplesVersion` ([`StrideSamplesVersion.props`](../../sources/templates/StrideSamplesVersion.props)); they only change (and re-publish) when the samples are actually bumped. The GameStudio bridge resolves the highest published version `<=` the engine version for these.
8686

8787
A user instantiating any template gets their installed engine version stamped in (the package upgrader rewrites `Stride.*` references on instantiation), so a lagging template package still produces a project on the user's current Stride.

samples/NewGame/NewGame/NewGame.sdtpl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ Parameters:
1212
- HDR
1313
- graphicsProfile
1414
- orientation
15+
- assetPacks
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
!TemplateAssetPack
2+
Id: 02eb39ec-2ec1-4bbb-a3fd-d1541f3a8727
3+
Name: "Materials pack"
4+
Description: A collection of ready-made materials.
5+
Group: AssetPacks
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
!TemplateAssetPack
2+
Id: dcaecb85-b5e8-4001-a394-a7039fe95d4d
3+
Name: "Building blocks"
4+
Description: Simple block models and prefabs to quickly prototype levels.
5+
Group: AssetPacks
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
!TemplateAssetPack
2+
Id: 63911545-be4b-40d9-b851-e0861fcee961
3+
Name: "Particles pack"
4+
Description: Ready-made particle effects such as fire, smoke and explosions.
5+
Group: AssetPacks
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
!TemplateAssetPack
2+
Id: faf82c1e-579e-49a3-a6aa-73548d01be04
3+
Name: "Animated models"
4+
Description: Mannequin model with a set of ready-to-use animations.
5+
Group: AssetPacks

sources/assets/Stride.Core.Assets/PackageStore.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,17 @@ public async Task<IEnumerable<PackageMeta>> GetPackages()
117117
return package is null ? null : (UDirectory)store.GetRealPath(package);
118118
}
119119

120+
/// <summary>
121+
/// Fetches (if needed) and installs <paramref name="packageName"/> at <paramref name="version"/>
122+
/// into the local package store, from the configured NuGet sources. Returns the installed
123+
/// package, or null when it could not be resolved (e.g. offline and not cached).
124+
/// </summary>
125+
public Task<NugetLocalPackage?> InstallPackage(string packageName, PackageVersion version, ProgressReport? progress = null)
126+
{
127+
ArgumentNullException.ThrowIfNull(packageName);
128+
return store.InstallPackage(packageName, version, [], progress);
129+
}
130+
120131
/// <summary>
121132
/// Gets the default package manager.
122133
/// </summary>

sources/assets/Stride.Core.Packages/NugetStore.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ public static string GetPackageVersionVariable(string packageId, string packageV
482482
/// <remarks>It is safe to call it concurrently be cause we operations are done using the FileLock.</remarks>
483483
/// <param name="packageId">Name of package to install.</param>
484484
/// <param name="version">Version of package to install.</param>
485-
public async Task<NugetLocalPackage?> InstallPackage(string packageId, PackageVersion version, IEnumerable<string> targetFrameworks, ProgressReport progress)
485+
public async Task<NugetLocalPackage?> InstallPackage(string packageId, PackageVersion version, IEnumerable<string> targetFrameworks, ProgressReport? progress)
486486
{
487487
using (GetLocalRepositoryLock())
488488
{

0 commit comments

Comments
 (0)