Apply approved knight models and natural scenery to all thirty stages

This commit is contained in:
NINI
2026-10-08 23:36:55 +09:00
parent 7c786c5435
commit 43b22d6788
171 changed files with 12947 additions and 382 deletions
@@ -0,0 +1,59 @@
using System.Linq;
using MagnetismHeroes.UnityRuntime.Presentation;
using MagnetismHeroes.UnityRuntime.StageAssets;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;
namespace MagnetismHeroes.Tests
{
public sealed class VisualUpgradeAssetTests
{
private const string Root = "Assets/MagnetismHeroes/UnityRuntime/Presentation/";
[Test] public void ApprovedBodyAndOneEquipmentAssemblyAreConnectedWithoutChangingSelectionSphere()
{
var ball = AssetDatabase.LoadAssetAtPath<GameObject>(Root + "Prefabs/MagnetFriend.prefab");
var body = ball.transform.Find("ApprovedHeroBody");
Assert.That(body, Is.Not.Null, "Approved FBX body must replace the primitive rendering.");
Assert.That(ball.transform.localScale, Is.EqualTo(Vector3.one));
Assert.That(ball.GetComponentsInChildren<Collider>(true).Length, Is.EqualTo(1));
Assert.That(ball.GetComponent<SphereCollider>().radius, Is.EqualTo(.5f));
var renderer = body.GetComponentInChildren<MeshRenderer>();
Assert.That(renderer.sharedMaterial.name, Is.EqualTo("Hero_CyanSatin"));
Assert.That(renderer.sharedMaterial.color.r, Is.EqualTo(.17f).Within(.0001f));
Assert.That(renderer.sharedMaterial.color.g, Is.EqualTo(.72f).Within(.0001f));
Assert.That(renderer.sharedMaterial.color.b, Is.EqualTo(.83f).Within(.0001f));
var mesh = body.GetComponentInChildren<MeshFilter>().sharedMesh;
Assert.That(mesh.bounds.size.x, Is.EqualTo(1).Within(.002f));
var badge = AssetDatabase.LoadAssetAtPath<GameObject>(Root + "Prefabs/GroupBadge.prefab");
Assert.That(badge.transform.Cast<Transform>().Count(child => child.name == "KnightEquipment"), Is.EqualTo(1));
Assert.That(badge.GetComponentsInChildren<Collider>(true), Is.Empty);
Assert.That(badge.GetComponentsInChildren<Animator>(true), Is.Empty);
Assert.That(badge.GetComponentsInChildren<SkinnedMeshRenderer>(true), Is.Empty);
Assert.That(badge.GetComponentsInChildren<SpriteRenderer>(true).Length, Is.EqualTo(1));
foreach (var material in badge.transform.Find("KnightEquipment").GetComponentsInChildren<MeshRenderer>(true).SelectMany(item => item.sharedMaterials))
Assert.That(AssetDatabase.GetAssetPath(material), Does.StartWith(Root + "Materials/VisualUpgrade/"));
foreach (string name in new[] { "HeroBody", "KnightEquipment" })
{
var importer = (ModelImporter)AssetImporter.GetAtPath(Root + "Models/Heroes/" + name + ".fbx");
Assert.That(importer.globalScale, Is.EqualTo(1));
Assert.That(importer.bakeAxisConversion, Is.True); Assert.That(importer.importAnimation, Is.False);
}
}
[Test] public void AllThirtyStagesConnectNaturalThemesWithOpenNearMeshCollidersAndColliderFreeDistantDecor()
{
foreach (int id in Enumerable.Range(1, 30))
{
var stage = AssetDatabase.LoadAssetAtPath<StageAsset>($"Assets/MagnetismHeroes/UnityRuntime/StageAssets/Stage{id:D2}.asset");
Assert.That(stage.Theme, Is.EqualTo(id <= 10 ? "Garden" : id <= 20 ? "Cloud" : "Workshop"));
Assert.That(stage.Decorations.Any(item => item.prefab.name == "MeadowClearing"), Is.True);
var arch = stage.Decorations.Single(item => item.prefab.name == "OpenStoneArch").prefab;
Assert.That(arch.GetComponentsInChildren<BoxCollider>(true), Is.Empty);
Assert.That(arch.GetComponentsInChildren<MeshCollider>(true).All(item => !item.convex && item.sharedMesh != null), Is.True);
Assert.That(arch.GetComponentsInChildren<MeshCollider>(true), Is.Not.Empty);
foreach (var decoration in stage.Decorations.Where(item => item.prefab.name != "OpenStoneArch" && item.prefab.name != "MossStoneSteps"))
Assert.That(decoration.prefab.GetComponentsInChildren<Collider>(true), Is.Empty, decoration.prefab.name);
}
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 61d4021e6d4aace41964197d9377009b