Complete cartoon presentation, Korean voice adoption and responsive art framing

This commit is contained in:
NINI
2026-10-05 15:24:23 +09:00
parent a383bc9d13
commit bcc5c9a7b9
69 changed files with 7519 additions and 663 deletions
@@ -31,6 +31,7 @@ namespace MagnetismHeroes.Tests
[TestCase("count_01","13A882CE1620140D447635E14F2D4758045D5E348960C17386DF1C720050C100")]
[TestCase("guide_collect","62E15C9E38C36F4094A6C7E9C5148510141290B5F41DB5AAD9DC1D8F1A158594")]
[TestCase("guide_count","DEBE29B89F3E2856F2BF4C5E01707A5F0A0657E5768C03BE385EC88FA2328B40")]
[TestCase("count_08","FA8034948F6AC3E289E8E7E9FB447943760D4ED5AC577C8AB0C961C608FE49C2")]
public void UserApprovedVoiceBytesRemainExact(string id,string hash)
{
using (var sha=SHA256.Create()) Assert.That(System.BitConverter.ToString(sha.ComputeHash(File.ReadAllBytes($"Assets/MagnetismHeroes/UnityRuntime/Presentation/Audio/Voice/{id}.wav"))).Replace("-",""), Is.EqualTo(hash));
@@ -0,0 +1,47 @@
using System.IO;
using System.Linq;
using MagnetismHeroes.UnityRuntime.Presentation;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;
namespace MagnetismHeroes.Tests
{
public sealed class PresentationAssetTests
{
private const string Root = "Assets/MagnetismHeroes/UnityRuntime/Presentation/";
[Test] public void FaceAtlasHasSixDistinctOfflineExpressionsAndDecorationsCannotReceiveInput()
{
var badge = AssetDatabase.LoadAssetAtPath<GameObject>(Root + "Prefabs/GroupBadge.prefab");
var data = new SerializedObject(badge.GetComponent<GroupBadge>()); var frames = data.FindProperty("_expressions");
Assert.That(frames.arraySize, Is.EqualTo(6));
var sprites = Enumerable.Range(0, 6).Select(i => (Sprite)frames.GetArrayElementAtIndex(i).objectReferenceValue).ToArray();
Assert.That(sprites.All(sprite => sprite != null && sprite.texture != null), Is.True);
Assert.That(sprites.Select(sprite => sprite.rect).Distinct().Count(), Is.EqualTo(6));
Assert.That(sprites.Select(sprite => sprite.texture).Distinct().Count(), Is.EqualTo(1));
Assert.That(badge.GetComponentsInChildren<Collider>(true), Is.Empty);
Assert.That(badge.GetComponentsInChildren<SpriteRenderer>(true).Length, Is.EqualTo(1));
Assert.That(badge.GetComponentsInChildren<TMPro.TextMeshPro>(true).Length, Is.EqualTo(1));
Assert.That(badge.transform.Find("RibbonCape"), Is.Not.Null);
var ball = AssetDatabase.LoadAssetAtPath<GameObject>(Root + "Prefabs/MagnetFriend.prefab");
Assert.That(ball.GetComponentsInChildren<Collider>(true).Length, Is.EqualTo(1));
Assert.That(ball.GetComponent<SphereCollider>().radius, Is.EqualTo(.5f));
Assert.That(ball.transform.localScale, Is.EqualTo(Vector3.one));
}
[Test] public void AudioRoutesToExistingMixerAndRequiredNoticesAreStagedForBuild()
{
var app = AssetDatabase.LoadAssetAtPath<GameObject>(Root + "Prefabs/GameApp.prefab");
Assert.That(AssetDatabase.AssetPathToGUID(Root + "Prefabs/GameApp.prefab"), Is.EqualTo("73c3215bc432df740b907a1edefa9ea1"));
Assert.That(app.GetComponent<GameSound>(), Is.Not.Null);
foreach (string group in new[] { "SFX", "Music" })
{
var source = app.transform.Find(group).GetComponent<AudioSource>();
Assert.That(source.outputAudioMixerGroup.name, Is.EqualTo(group));
Assert.That(source.playOnAwake, Is.False); Assert.That(source.spatialBlend, Is.Zero);
Assert.That(source.clip, Is.Null, "User has deferred supplying music/SFX; no substitute is selected.");
}
foreach (string path in new[] { "NotoSansCJK-OFL.txt", "Qwen3-TTS-Apache-2.0.txt", "Qwen3-TTS-model-card.txt" })
Assert.That(File.ReadAllText("Assets/StreamingAssets/Notices/" + path).Length, Is.GreaterThan(100));
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 415c49a50d8d790469cd272156da0448