Complete cartoon presentation, Korean voice adoption and responsive art framing
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using MagnetismHeroes.UnityRuntime.Bootstrap;
|
||||
using MagnetismHeroes.UnityRuntime.Presentation;
|
||||
using TMPro;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Audio;
|
||||
|
||||
namespace MagnetismHeroes.Editor
|
||||
{
|
||||
public static class PresentationAssets
|
||||
{
|
||||
private const string Root = "Assets/MagnetismHeroes/UnityRuntime/Presentation/";
|
||||
public static void Build()
|
||||
{
|
||||
AssetDatabase.Refresh();
|
||||
string atlasPath = Root + "Textures/FaceExpressions.png";
|
||||
var importer = (TextureImporter)AssetImporter.GetAtPath(atlasPath);
|
||||
importer.textureType = TextureImporterType.Default;
|
||||
importer.alphaSource = TextureImporterAlphaSource.FromInput; importer.alphaIsTransparency = true;
|
||||
importer.mipmapEnabled = false; importer.maxTextureSize = 2048;
|
||||
importer.textureCompression = TextureImporterCompression.Uncompressed; importer.SaveAndReimport();
|
||||
var atlas = AssetDatabase.LoadAssetAtPath<Texture2D>(atlasPath);
|
||||
Directory.CreateDirectory(Root + "Sprites"); AssetDatabase.Refresh();
|
||||
var expressions = new Sprite[6];
|
||||
for (int i = 0; i < 6; i++)
|
||||
{
|
||||
string path = Root + $"Sprites/Face{i}.asset";
|
||||
expressions[i] = AssetDatabase.LoadAssetAtPath<Sprite>(path);
|
||||
var pivot = new Vector2(.5f, i < 3 ? .5f : .68f);
|
||||
var sprite = Sprite.Create(atlas, new Rect(i % 3 * atlas.width / 3, (1 - i / 3) * atlas.height / 2, atlas.width / 3, atlas.height / 2), pivot, 640, 0, SpriteMeshType.FullRect);
|
||||
sprite.name = new[] { "Neutral", "Interested", "Focused", "Laughing", "Encouraging", "Celebrating" }[i];
|
||||
if (expressions[i] == null)
|
||||
{
|
||||
expressions[i] = sprite;
|
||||
AssetDatabase.CreateAsset(expressions[i], path);
|
||||
}
|
||||
else { EditorUtility.CopySerialized(sprite, expressions[i]); EditorUtility.SetDirty(expressions[i]); UnityEngine.Object.DestroyImmediate(sprite); }
|
||||
}
|
||||
var ribbonMaterial = AssetDatabase.LoadAssetAtPath<Material>(Root + "Materials/LightRibbon.mat");
|
||||
if (ribbonMaterial == null)
|
||||
{
|
||||
ribbonMaterial = new Material(Shader.Find("Sprites/Default")); ribbonMaterial.color = new Color(.3f, .75f, 1, .6f);
|
||||
AssetDatabase.CreateAsset(ribbonMaterial, Root + "Materials/LightRibbon.mat");
|
||||
}
|
||||
ribbonMaterial.color = Color.white; EditorUtility.SetDirty(ribbonMaterial);
|
||||
var badge = PrefabUtility.LoadPrefabContents(Root + "Prefabs/GroupBadge.prefab");
|
||||
try
|
||||
{
|
||||
var face = badge.transform.Find("RepresentativeFace");
|
||||
foreach (Transform child in face.Cast<Transform>().ToArray()) UnityEngine.Object.DestroyImmediate(child.gameObject);
|
||||
var renderer = face.GetComponent<SpriteRenderer>(); if (renderer == null) renderer = face.gameObject.AddComponent<SpriteRenderer>();
|
||||
renderer.sprite = expressions[0]; renderer.sortingOrder = 1;
|
||||
face.localScale = new Vector3(.9f, .9f, 1);
|
||||
var data = new SerializedObject(badge.GetComponent<GroupBadge>());
|
||||
data.FindProperty("_expression").objectReferenceValue = renderer;
|
||||
var stem = badge.transform.Find("NumberStem");
|
||||
if (stem != null) UnityEngine.Object.DestroyImmediate(stem.gameObject);
|
||||
var frames = data.FindProperty("_expressions"); frames.arraySize = 6;
|
||||
for (int i = 0; i < 6; i++) frames.GetArrayElementAtIndex(i).objectReferenceValue = expressions[i];
|
||||
var cape = badge.transform.Find("RibbonCape");
|
||||
var line = cape.GetComponent<LineRenderer>(); line.sharedMaterial = ribbonMaterial;
|
||||
line.useWorldSpace = false; line.positionCount = 10; line.widthMultiplier = .065f;
|
||||
line.startColor = new Color(.1f, .35f, .8f, .9f); line.endColor = new Color(.9f, .15f, .12f, .45f);
|
||||
data.ApplyModifiedPropertiesWithoutUndo();
|
||||
var number = badge.GetComponentInChildren<TextMeshPro>(); number.fontSize = 3.5f; number.rectTransform.sizeDelta = new Vector2(1, .6f);
|
||||
var numberMaterial = AssetDatabase.LoadAssetAtPath<Material>(Root + "Materials/NumberOutline.mat");
|
||||
if (numberMaterial == null)
|
||||
{
|
||||
numberMaterial = new Material(number.font.material);
|
||||
numberMaterial.SetFloat("_OutlineWidth", .12f); numberMaterial.SetColor("_OutlineColor", Color.white);
|
||||
AssetDatabase.CreateAsset(numberMaterial, Root + "Materials/NumberOutline.mat");
|
||||
}
|
||||
number.fontSharedMaterial = numberMaterial;
|
||||
PrefabUtility.SaveAsPrefabAsset(badge, Root + "Prefabs/GroupBadge.prefab");
|
||||
}
|
||||
finally { PrefabUtility.UnloadPrefabContents(badge); }
|
||||
var ball = PrefabUtility.LoadPrefabContents(Root + "Prefabs/MagnetFriend.prefab");
|
||||
try
|
||||
{
|
||||
var rim = ball.transform.Find("LightOutline");
|
||||
if (rim == null) { rim = new GameObject("LightOutline", typeof(LineRenderer)).transform; rim.SetParent(ball.transform, false); }
|
||||
var line = rim.GetComponent<LineRenderer>(); line.sharedMaterial = ribbonMaterial;
|
||||
line.useWorldSpace = false; line.loop = true; line.positionCount = 40; line.widthMultiplier = .035f; line.enabled = false;
|
||||
for (int i = 0; i < 40; i++) { float angle = i * Mathf.PI * 2 / 40; line.SetPosition(i, new Vector3(Mathf.Cos(angle) * .51f, Mathf.Sin(angle) * .51f, -.08f)); }
|
||||
Set(ball.GetComponent<BallView>(), "_outline", line);
|
||||
var contact = ball.transform.Find("ContactLight");
|
||||
if (contact == null) { contact = new GameObject("ContactLight", typeof(LineRenderer)).transform; contact.SetParent(ball.transform, false); }
|
||||
var ring = contact.GetComponent<LineRenderer>(); ring.sharedMaterial = ribbonMaterial;
|
||||
ring.useWorldSpace = false; ring.loop = true; ring.positionCount = 32; ring.widthMultiplier = .035f; ring.enabled = false;
|
||||
for (int i = 0; i < 32; i++) { float angle = i * Mathf.PI * 2 / 32; ring.SetPosition(i, new Vector3(Mathf.Cos(angle) * .19f, Mathf.Sin(angle) * .19f, 0)); }
|
||||
Set(ball.GetComponent<BallView>(), "_contactRing", ring);
|
||||
PrefabUtility.SaveAsPrefabAsset(ball, Root + "Prefabs/MagnetFriend.prefab");
|
||||
}
|
||||
finally { PrefabUtility.UnloadPrefabContents(ball); }
|
||||
var app = PrefabUtility.LoadPrefabContents(FirstSliceAssets.AppPrefabPath);
|
||||
try
|
||||
{
|
||||
var voice = app.GetComponent<VoicePlayer>(); Set(app.GetComponentInChildren<BoardPresenter>(true), "_voice", voice);
|
||||
app.transform.Find("GameCamera").GetComponent<Camera>().fieldOfView = 62;
|
||||
var sound = app.GetComponent<GameSound>(); if (sound == null) sound = app.AddComponent<GameSound>();
|
||||
var mixer = AssetDatabase.LoadAssetAtPath<AudioMixer>(Root + "Audio/GameAudio.mixer");
|
||||
Set(sound, "_voice", voice);
|
||||
foreach (var spec in new[] { ("SFX", "_sfx", false), ("Music", "_music", true) })
|
||||
{
|
||||
var child = app.transform.Find(spec.Item1);
|
||||
if (child == null) { child = new GameObject(spec.Item1, typeof(AudioSource)).transform; child.SetParent(app.transform, false); }
|
||||
var source = child.GetComponent<AudioSource>(); source.playOnAwake = false; source.loop = spec.Item3; source.spatialBlend = 0;
|
||||
source.outputAudioMixerGroup = mixer.FindMatchingGroups(spec.Item1).Single(); Set(sound, spec.Item2, source);
|
||||
}
|
||||
Set(app.GetComponent<GameApp>(), "_sound", sound);
|
||||
var play = app.transform.Find("Interface/SafeArea/Play");
|
||||
var spoken = play.Find("SpokenNumber");
|
||||
if (spoken == null) { spoken = new GameObject("SpokenNumber", typeof(RectTransform), typeof(TextMeshProUGUI)).transform; spoken.SetParent(play, false); }
|
||||
var spokenText = spoken.GetComponent<TMP_Text>(); spokenText.font = play.Find("Counter").GetComponent<TMP_Text>().font;
|
||||
spokenText.fontSize = 23; spokenText.color = new Color(.12f, .2f, .31f); spokenText.alignment = TextAlignmentOptions.Center;
|
||||
spokenText.raycastTarget = false; spokenText.enableAutoSizing = false; spokenText.text = "";
|
||||
Rect(spoken, new Vector2(.76f, .83f), new Vector2(.98f, .83f), new Vector2(-8, 36)); Set(voice, "_spokenNumber", spokenText);
|
||||
Rect(play.Find("HomeButton"), new Vector2(.02f, .9f), new Vector2(.18f, .9f), new Vector2(-8, 62));
|
||||
Rect(play.Find("StageTitle"), new Vector2(.21f, .92f), new Vector2(.73f, .92f), new Vector2(-8, 60));
|
||||
Rect(play.Find("Counter"), new Vector2(.76f, .9f), new Vector2(.98f, .9f), new Vector2(-8, 62));
|
||||
foreach (var text in play.GetComponentsInChildren<TMP_Text>(true))
|
||||
{ text.enableAutoSizing = false; if (text.transform.name == "Counter" || text.transform.name == "StageTitle") text.fontSize = 27; }
|
||||
foreach (var button in app.GetComponentsInChildren<UnityEngine.UI.Button>(true))
|
||||
{
|
||||
var image = button.GetComponent<UnityEngine.UI.Image>();
|
||||
image.sprite = AssetDatabase.GetBuiltinExtraResource<Sprite>("UI/Skin/UISprite.psd"); image.type = UnityEngine.UI.Image.Type.Sliced;
|
||||
}
|
||||
var selection = app.transform.Find("Interface/SafeArea/StageSelection");
|
||||
for (int i = 0; i < 30; i++)
|
||||
Rect(selection.Find($"Stage{i + 1:D2}Button"), new Vector2(.045f + i % 6 * .153f, .76f - i / 6 * .123f),
|
||||
new Vector2(.18f + i % 6 * .153f, .76f - i / 6 * .123f), new Vector2(0, 62));
|
||||
PrefabUtility.SaveAsPrefabAsset(app, FirstSliceAssets.AppPrefabPath);
|
||||
}
|
||||
finally { PrefabUtility.UnloadPrefabContents(app); }
|
||||
AssetDatabase.SaveAssets(); Debug.Log("[Presentation] Six face decals, light ribbons/outlines, responsive controls and existing mixer routing built without scene edits.");
|
||||
}
|
||||
private static void Rect(Transform target, Vector2 min, Vector2 max, Vector2 size)
|
||||
{
|
||||
var rect = (RectTransform)target; rect.anchorMin = min; rect.anchorMax = max; rect.anchoredPosition = Vector2.zero; rect.sizeDelta = size;
|
||||
foreach (var text in target.GetComponentsInChildren<TMP_Text>())
|
||||
if (text.transform != target) { text.rectTransform.anchorMin = Vector2.zero; text.rectTransform.anchorMax = Vector2.one; text.rectTransform.offsetMin = text.rectTransform.offsetMax = Vector2.zero; }
|
||||
}
|
||||
private static void Set(UnityEngine.Object target, string field, UnityEngine.Object value)
|
||||
{ var data = new SerializedObject(target); data.FindProperty(field).objectReferenceValue = value; data.ApplyModifiedPropertiesWithoutUndo(); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e4a866a5fd5323444b0aa424910818ad
|
||||
@@ -0,0 +1,120 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using MagnetismHeroes.Core;
|
||||
using MagnetismHeroes.UnityRuntime.Bootstrap;
|
||||
using MagnetismHeroes.UnityRuntime.Presentation;
|
||||
using TMPro;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Profiling;
|
||||
|
||||
namespace MagnetismHeroes.Editor
|
||||
{
|
||||
public static class PresentationProof
|
||||
{
|
||||
private sealed class ProofStore : IProgressStore
|
||||
{
|
||||
public bool TryLoad(out ProgressSave save, out string error)
|
||||
{ save = new ProgressSave { completedStageIds = Enumerable.Range(1, 30).ToArray(), seenTutorialIds = new[] { "merge", "split" } }; error = null; return true; }
|
||||
public bool TrySave(ProgressSave save, out string error) { error = null; return true; }
|
||||
}
|
||||
public static GameApp App => UnityEngine.Object.FindFirstObjectByType<GameApp>();
|
||||
public static void Initialize() { App.Initialize(new ProofStore()); App.StartStage(20); App.Voice.Clear(); }
|
||||
public static void Supply(int stage)
|
||||
{
|
||||
Stage(stage);
|
||||
for (int step = 0; App.Session.Screen == SessionScreen.Puzzle && step < 40; step++)
|
||||
{
|
||||
var hint = App.Session.Hint;
|
||||
if (hint.Kind == HintKind.Collect) App.CommitMove(hint.FirstGroupId, new Position3(.1f, 0, 0));
|
||||
else if (hint.Kind == HintKind.Merge) App.CommitMove(hint.FirstGroupId, new Position3(.1f, 0, 0), hint.SecondGroupId);
|
||||
else if (hint.Kind == HintKind.Count) App.CountBall(hint.BallIds[0]);
|
||||
else App.CommitSplit(hint.FirstGroupId, hint.BallIds, new Position3(1, 0, 0));
|
||||
}
|
||||
if (App.Session.Screen != SessionScreen.FreePlay) throw new InvalidOperationException("Proof stage did not solve.");
|
||||
foreach (var group in App.Session.Board.Groups) App.Session.ReturnGroup(group.id);
|
||||
App.ContinueFreePlay();
|
||||
App.Orbit.Apply(new CameraState { target = new Position3(0, .6f, 0), distance = 11, rotation = new Rotation4(0, 0, 0, 1) });
|
||||
for (int i = 0; i < 10; i++) App.SpawnFriend();
|
||||
if (App.Session.Board.BallCount != 10) throw new InvalidOperationException("Ten initial supply friends are not reachable.");
|
||||
App.Voice.Clear();
|
||||
}
|
||||
public static void Fixture(string layout, int count = 10)
|
||||
{
|
||||
App.StartStage(layout == "Garden" ? 9 : layout == "Cloud" ? 20 : 28); App.Voice.Clear();
|
||||
var balls = Enumerable.Range(0, count).Select(i => new BallState { id = "proof-" + i,
|
||||
position = layout == "Line" ? new Position3(i - (count - 1) * .5f, .8f, 0)
|
||||
: layout == "Volume" ? new Position3(i % 2 - .5f, .8f + i / 4, (i / 2) % 2 - .5f)
|
||||
: new Position3(i % 5 - 2, .8f + i / 5 * (layout == "Garden" || layout == "Cloud" || layout == "Workshop" ? 1.8f : 1), 0) }).ToArray();
|
||||
var groups = layout == "FivePairs" ? new[] { new GroupState { id = "first", ballIds = balls.Take(5).Select(ball => ball.id).ToArray() },
|
||||
new GroupState { id = "second", ballIds = balls.Skip(5).Select(ball => ball.id).ToArray() } }
|
||||
: new[] { new GroupState { id = "proof", ballIds = balls.Select(ball => ball.id).ToArray() } };
|
||||
if (layout == "Garden" || layout == "Cloud" || layout == "Workshop")
|
||||
groups = balls.Select(ball => new GroupState { id = ball.id, ballIds = new[] { ball.id } }).ToArray();
|
||||
BoundBoard = BoardRules.CreateFreePlay(new FreePlayState { sourceStageId = 28, balls = balls, groups = groups });
|
||||
App.Presenter.Render(BoundBoard);
|
||||
}
|
||||
private static BoardRules BoundBoard;
|
||||
[Serializable] private sealed class CaptureRecord
|
||||
{
|
||||
public string sourceCommit, name, mode, utc, board;
|
||||
public bool sourceDirty;
|
||||
public int width, height, groups, balls, faces, numbers, capes, liveGameViewDrawCalls, expressionOverride;
|
||||
public long allocatedMemory, textureMemory, voiceMemory;
|
||||
public float cameraRenderMilliseconds;
|
||||
public Vector3 cameraPosition, fixedVisualPivot = Vector3.up * .65f; public Quaternion cameraRotation; public float fieldOfView;
|
||||
public CameraState rawCameraState;
|
||||
public Rect safeArea;
|
||||
public Rect actualCameraPixelRect;
|
||||
public Vector2 liveScreenSize, canvasRectSize;
|
||||
}
|
||||
public static void Capture(string name, int width = 1280, int height = 720, float inset = 0, int expression = -1)
|
||||
{
|
||||
string folder = "artifacts/verification/T7/Implementation/editor-play"; Directory.CreateDirectory(folder);
|
||||
var app = App; var camera = app.Presenter.Camera; var canvas = app.GetComponentInChildren<Canvas>(true);
|
||||
var safe = app.GetComponentInChildren<SafeAreaPanel>(true); var safeRect = (RectTransform)safe.transform;
|
||||
var oldMin = safeRect.anchorMin; var oldMax = safeRect.anchorMax; bool oldEnabled = safe.enabled;
|
||||
var oldMode = canvas.renderMode; var oldCamera = canvas.worldCamera; float oldPlane = canvas.planeDistance;
|
||||
var oldTarget = camera.targetTexture; var oldActive = RenderTexture.active; float oldAspect = camera.aspect;
|
||||
var target = new RenderTexture(width, height, 24); var image = new Texture2D(width, height, TextureFormat.RGB24, false);
|
||||
try
|
||||
{
|
||||
camera.targetTexture = target; camera.aspect = (float)width / height;
|
||||
canvas.renderMode = RenderMode.ScreenSpaceCamera; canvas.worldCamera = camera; canvas.planeDistance = .5f;
|
||||
safe.enabled = false; safeRect.anchorMin = new Vector2(inset / width, 0); safeRect.anchorMax = new Vector2(1 - inset / width, 1);
|
||||
app.Presenter.SendMessage("LateUpdate"); Canvas.ForceUpdateCanvases();
|
||||
if (expression >= 0)
|
||||
foreach (var face in app.GetComponentsInChildren<SpriteRenderer>()) face.sprite = AssetDatabase.LoadAssetAtPath<Sprite>($"Assets/MagnetismHeroes/UnityRuntime/Presentation/Sprites/Face{expression}.asset");
|
||||
var timer = System.Diagnostics.Stopwatch.StartNew(); camera.Render(); timer.Stop();
|
||||
RenderTexture.active = target; image.ReadPixels(new Rect(0, 0, width, height), 0, 0); image.Apply();
|
||||
File.WriteAllBytes(folder + "/" + name + ".png", image.EncodeToPNG());
|
||||
var board = BoundBoard ?? app.Session.Board;
|
||||
var record = new CaptureRecord { name = name, sourceCommit = Environment.GetEnvironmentVariable("MAGNETISM_PROOF_COMMIT"), mode = "Editor Camera.Render RT with temporary ScreenSpaceCamera canvas; simulated viewport/safe area, not Android device capture",
|
||||
sourceDirty = Environment.GetEnvironmentVariable("MAGNETISM_PROOF_DIRTY") == "true",
|
||||
utc = DateTime.UtcNow.ToString("o"), width = width, height = height, expressionOverride = expression, safeArea = new Rect(inset, 0, width - inset * 2, height),
|
||||
balls = app.Presenter.Balls.Count, groups = app.GetComponentsInChildren<GroupBadge>().Length,
|
||||
faces = app.GetComponentsInChildren<SpriteRenderer>().Length, numbers = app.GetComponentsInChildren<TextMeshPro>().Length,
|
||||
capes = app.GetComponentsInChildren<GroupBadge>().Count(badge => badge.transform.Find("RibbonCape") != null),
|
||||
cameraPosition = camera.transform.position, cameraRotation = camera.transform.rotation, fieldOfView = camera.fieldOfView,
|
||||
rawCameraState = app.Orbit.Snapshot(),
|
||||
liveScreenSize = new Vector2(Screen.width, Screen.height), actualCameraPixelRect = camera.pixelRect,
|
||||
canvasRectSize = ((RectTransform)canvas.transform).rect.size,
|
||||
board = JsonUtility.ToJson(board.Mode == BoardMode.FreePlay ? (object)board.ToFreePlayState(app.Orbit.Snapshot()) : board.ToPuzzleState(app.Orbit.Snapshot())),
|
||||
allocatedMemory = Profiler.GetTotalAllocatedMemoryLong(), textureMemory = UnityEngine.Object.FindObjectsByType<Texture>(FindObjectsSortMode.None).Sum(texture => Profiler.GetRuntimeMemorySizeLong(texture)),
|
||||
voiceMemory = Resources.FindObjectsOfTypeAll<AudioClip>().Sum(clip => Profiler.GetRuntimeMemorySizeLong(clip)),
|
||||
liveGameViewDrawCalls = UnityEditor.UnityStats.drawCalls, cameraRenderMilliseconds = (float)timer.Elapsed.TotalMilliseconds };
|
||||
File.WriteAllText(folder + "/" + name + ".json", JsonUtility.ToJson(record, true));
|
||||
}
|
||||
finally
|
||||
{
|
||||
camera.targetTexture = oldTarget; camera.aspect = oldAspect; RenderTexture.active = oldActive;
|
||||
canvas.renderMode = oldMode; canvas.worldCamera = oldCamera; canvas.planeDistance = oldPlane;
|
||||
safeRect.anchorMin = oldMin; safeRect.anchorMax = oldMax; safe.enabled = oldEnabled;
|
||||
UnityEngine.Object.DestroyImmediate(image); target.Release(); UnityEngine.Object.DestroyImmediate(target);
|
||||
app.Presenter.SendMessage("LateUpdate"); Canvas.ForceUpdateCanvases();
|
||||
}
|
||||
}
|
||||
public static void Stage(int id) { BoundBoard = null; App.StartStage(id); App.Voice.Clear(); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4ab6b61155a1d5a41b63cf3bdc580b0b
|
||||
@@ -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
|
||||
@@ -49,6 +49,92 @@ namespace MagnetismHeroes.Tests
|
||||
_app.StartStage(10); Physics.SyncTransforms(); var id = _app.Session.Board.Balls[0].id;
|
||||
Tap(id); _app.Input.BeginSplit(); Tap(id); Assert.That(_app.Input.SelectedCount, Is.EqualTo(1)); return id;
|
||||
}
|
||||
[UnityTest] public IEnumerator FacePreviewCancelAndNavigationFollowOnlyCommittedGroups()
|
||||
{
|
||||
_app.StartStage(6); _app.Voice.Clear(); yield return null;
|
||||
var board = JsonUtility.ToJson(_app.Session.Board.ToPuzzleState(_app.Session.Camera));
|
||||
var badges = _app.GetComponentsInChildren<GroupBadge>();
|
||||
var face = badges[0].GetComponentInChildren<SpriteRenderer>();
|
||||
Assert.That(face, Is.Not.Null, "The representative face must support expressions.");
|
||||
var neutral = face.sprite;
|
||||
var states = _app.Session.Board.Balls;
|
||||
var delta = BoardPresenter.ToVector(states[1].position) - BoardPresenter.ToVector(states[0].position) - Vector3.right;
|
||||
_app.Presenter.PreviewGroup(_app.Session.Board.Groups[0].id, delta); yield return null;
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().Length, Is.EqualTo(2));
|
||||
Assert.That(face.sprite, Is.Not.EqualTo(neutral));
|
||||
Assert.That(JsonUtility.ToJson(_app.Session.Board.ToPuzzleState(_app.Session.Camera)), Is.EqualTo(board));
|
||||
_app.Presenter.CancelPreview(); yield return null;
|
||||
Assert.That(face.sprite, Is.EqualTo(neutral));
|
||||
_app.Voice.Guide("guide_merge"); yield return null;
|
||||
var speaking = face.sprite; Assert.That(speaking, Is.Not.EqualTo(neutral));
|
||||
_app.Presenter.CancelPreview(); yield return null;
|
||||
Assert.That(face.sprite, Is.EqualTo(speaking), "Canceling visual drag does not cancel an active guide.");
|
||||
_app.ShowHome(); yield return null;
|
||||
Assert.That(_app.Voice.IsSpeaking, Is.False); Assert.That(_app.Voice.CurrentClipId, Is.Null);
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().Length, Is.Zero);
|
||||
_app.StartStage(6); yield return null;
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().Length, Is.EqualTo(2));
|
||||
Assert.That(_app.Voice.IsSpeaking, Is.False, "Restoring an unfinished board is silent.");
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().All(badge => badge.GetComponentInChildren<SpriteRenderer>().sprite == neutral), Is.True);
|
||||
_app.Voice.Guide("guide_merge"); yield return null;
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().All(badge => badge.GetComponentInChildren<SpriteRenderer>().sprite == speaking), Is.True);
|
||||
yield return new WaitForSecondsRealtime(_app.GetComponent<AudioSource>().clip.length + .1f);
|
||||
Assert.That(_app.Voice.IsSpeaking, Is.False);
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().All(badge => badge.GetComponentInChildren<SpriteRenderer>().sprite == neutral), Is.True);
|
||||
}
|
||||
[UnityTest] public IEnumerator OneThroughTenKeepExactSphereCountSizeAndCommittedLayoutWithOneDecorationSetPerGroup()
|
||||
{
|
||||
_app.StartStage(6); _app.Voice.Clear();
|
||||
for (int count = 1; count <= 10; count++)
|
||||
{
|
||||
var states = Enumerable.Range(0, count).Select(i => new BallState { id = "art-" + i, position = new Position3(i % 5 - 2, .8f + i / 5, 0) }).ToArray();
|
||||
var board = BoardRules.CreateFreePlay(new FreePlayState { sourceStageId = 6, balls = states,
|
||||
groups = new[] { new GroupState { id = "art", ballIds = states.Select(ball => ball.id).ToArray() } } });
|
||||
_app.Presenter.Render(board); yield return null;
|
||||
Assert.That(_app.Presenter.Balls.Count, Is.EqualTo(count));
|
||||
Assert.That(_app.Presenter.Balls.Values.All(ball => ball.transform.localScale == Vector3.one), Is.True);
|
||||
foreach (var state in states) Assert.That(_app.Presenter.Balls[state.id].transform.position, Is.EqualTo(BoardPresenter.ToVector(state.position)));
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().Length, Is.EqualTo(1));
|
||||
Assert.That(_app.GetComponentsInChildren<SpriteRenderer>().Length, Is.EqualTo(1));
|
||||
Assert.That(_app.GetComponentsInChildren<TMPro.TextMeshPro>().Single().text, Is.EqualTo(count.ToString()));
|
||||
_app.Presenter.ShowSelection(new[] { states[0].id }); _app.Orbit.Orbit(new Vector2(45, 20)); yield return null;
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().Length, Is.EqualTo(1));
|
||||
foreach (var state in states) Assert.That(_app.Presenter.Balls[state.id].transform.position, Is.EqualTo(BoardPresenter.ToVector(state.position)));
|
||||
_app.Presenter.CancelPreview(); _app.Presenter.ShowSelection(System.Array.Empty<string>());
|
||||
}
|
||||
}
|
||||
[UnityTest] public IEnumerator SpokenNumberAndDuckingFollowSpeechQueueAndClearImmediatelyOnNavigation()
|
||||
{
|
||||
_app.StartStage(6); _app.Voice.Clear();
|
||||
var cue = _app.transform.Find("Interface/SafeArea/Play/SpokenNumber").GetComponent<TMPro.TMP_Text>();
|
||||
_app.Voice.EnqueueCount(1); _app.Voice.EnqueueCount(2); yield return null;
|
||||
Assert.That(cue.text, Is.EqualTo("숫자 1"));
|
||||
Assert.That(_app.transform.Find("SFX").GetComponent<AudioSource>().volume, Is.EqualTo(.12f).Within(.001));
|
||||
Assert.That(_app.transform.Find("Music").GetComponent<AudioSource>().volume, Is.EqualTo(.06f).Within(.001));
|
||||
float deadline = Time.realtimeSinceStartup + 5;
|
||||
while (_app.Voice.CurrentClipId != "count_02" && Time.realtimeSinceStartup < deadline) yield return null;
|
||||
Assert.That(cue.text, Is.EqualTo("숫자 2"));
|
||||
_app.ShowHome(); Assert.That(cue.text, Is.Empty); Assert.That(_app.Voice.IsSpeaking, Is.False);
|
||||
yield return null;
|
||||
Assert.That(_app.transform.Find("SFX").GetComponent<AudioSource>().volume, Is.EqualTo(.5f));
|
||||
Assert.That(_app.transform.Find("Music").GetComponent<AudioSource>().volume, Is.EqualTo(.25f));
|
||||
}
|
||||
[UnityTest] public IEnumerator MusicResumesCurrentThemeAfterPauseWithoutReplayingSfx()
|
||||
{
|
||||
var clip = AudioClip.Create("test-only-loop", 44100, 1, 44100, false);
|
||||
var settings = new SerializedObject(_app.Sound);
|
||||
settings.FindProperty("_garden").objectReferenceValue = clip; settings.ApplyModifiedPropertiesWithoutUndo();
|
||||
_app.Sound.Theme("Garden"); yield return null;
|
||||
var music = _app.transform.Find("Music").GetComponent<AudioSource>();
|
||||
var sfx = _app.transform.Find("SFX").GetComponent<AudioSource>();
|
||||
sfx.PlayOneShot(clip); Assert.That(music.isPlaying, Is.True);
|
||||
_app.Sound.SendMessage("OnApplicationPause", true); yield return null;
|
||||
Assert.That(music.isPlaying, Is.False); Assert.That(sfx.isPlaying, Is.False);
|
||||
_app.Sound.SendMessage("OnApplicationPause", false); yield return null;
|
||||
Assert.That(music.clip, Is.SameAs(clip)); Assert.That(music.isPlaying, Is.True);
|
||||
Assert.That(sfx.isPlaying, Is.False);
|
||||
_app.Sound.Clear(); Object.Destroy(clip);
|
||||
}
|
||||
[UnityTest] public IEnumerator NativeCanceledSplitRestoresCommittedBoardAndClearsUnconfirmedSelection()
|
||||
{
|
||||
var id = PrepareSplit(); yield return null; var point = Point(id); var saved = JsonUtility.ToJson(_store.Save); var writes = _store.Writes;
|
||||
@@ -90,9 +176,12 @@ namespace MagnetismHeroes.Tests
|
||||
Assert.That(_app.Session.Board.Balls.Select(ball => ball.id), Is.EquivalentTo(states.Select(ball => ball.id)));
|
||||
Assert.That(Vector3.Distance(_app.Presenter.Balls[states[0].id].transform.position, _app.Presenter.Balls[states[1].id].transform.position), Is.EqualTo(1).Within(.001f));
|
||||
Assert.That(_app.Presenter.Balls.Values.All(ball => !ball.ContactCandidate), Is.True);
|
||||
Assert.That(_app.Presenter.Balls.Values.All(ball => ball.transform.Find("ContactLight").GetComponent<LineRenderer>().enabled), Is.True);
|
||||
Assert.That(_app.GetComponentsInChildren<GroupBadge>().Length, Is.EqualTo(1));
|
||||
Tap(states[0].id); _app.Input.BeginSplit(); Tap(states[0].id); _app.Input.CancelSplit();
|
||||
Assert.That(_app.Instruction, Is.EqualTo("해냈어! 친구와 자유롭게 놀아 보자."));
|
||||
yield return new WaitForSecondsRealtime(.4f);
|
||||
Assert.That(_app.Presenter.Balls.Values.All(ball => !ball.transform.Find("ContactLight").GetComponent<LineRenderer>().enabled), Is.True);
|
||||
}
|
||||
[UnityTest] public IEnumerator FourteenDisconnectedSelectionThenMergeIsAcceptedByFinalNumbers()
|
||||
{
|
||||
|
||||
@@ -37,6 +37,7 @@ namespace MagnetismHeroes.UnityRuntime.Bootstrap
|
||||
[SerializeField] private OrbitCamera _orbit;
|
||||
[SerializeField] private BoardInput _input;
|
||||
[SerializeField] private VoicePlayer _voice;
|
||||
[SerializeField] private GameSound _sound;
|
||||
[SerializeField] private UnityEngine.UI.Button[] _stageButtons = Array.Empty<UnityEngine.UI.Button>();
|
||||
[SerializeField] private UnityEngine.UI.Button _helpButton;
|
||||
[SerializeField] private UnityEngine.UI.Button _nextButton;
|
||||
@@ -47,6 +48,7 @@ namespace MagnetismHeroes.UnityRuntime.Bootstrap
|
||||
public BoardInput Input => _input;
|
||||
public OrbitCamera Orbit => _orbit;
|
||||
public VoicePlayer Voice => _voice;
|
||||
public GameSound Sound => _sound;
|
||||
public BoardEnvironment Environment => _environment;
|
||||
public GhostDemonstration Demonstration => _demonstration;
|
||||
public string Instruction => _instruction.text;
|
||||
@@ -73,6 +75,7 @@ namespace MagnetismHeroes.UnityRuntime.Bootstrap
|
||||
{ int stageId = _stages.Where(stage => stage.ToDefinition().Kind == StageKind.Composition).ElementAt(index).StageId; _compositionButtons[index].onClick.AddListener(() => StartStage(stageId)); }
|
||||
if (_splitButton != null) _splitButton.onClick.AddListener(() => { _input.BeginSplit(); if (_input.IsSplitting) _voice.Guide("guide_split"); });
|
||||
if (_cancelSplitButton != null) _cancelSplitButton.onClick.AddListener(() => { _input.CancelSplit(); _voice.CancelGuide(); });
|
||||
if (_sound != null) foreach (var button in GetComponentsInChildren<UnityEngine.UI.Button>(true)) button.onClick.AddListener(_sound.UI);
|
||||
}
|
||||
private void Start()
|
||||
{
|
||||
@@ -98,13 +101,13 @@ namespace MagnetismHeroes.UnityRuntime.Bootstrap
|
||||
if (Session.Screen != SessionScreen.FreePlay || Session.Board.BallCount >= 10) return;
|
||||
_input.CancelSplit();
|
||||
if (!_presenter.TryFindSpawnPosition(out var position)) { _instruction.text = "빈 곳이 보이도록 화면을 움직여 볼까?"; return; }
|
||||
if (Session.Spawn(position).Accepted) Refresh(false);
|
||||
if (Session.Spawn(position).Accepted) { Refresh(false); _sound?.Supply(); }
|
||||
}
|
||||
public void ReturnSelectedFriend()
|
||||
{
|
||||
if (Session.Screen != SessionScreen.FreePlay || _input.SelectedGroup == null) return;
|
||||
string groupId = _input.SelectedGroup; _input.CancelSplit();
|
||||
if (Session.ReturnGroup(groupId).Accepted) Refresh(false);
|
||||
if (Session.ReturnGroup(groupId).Accepted) { Refresh(false); _sound?.Supply(); }
|
||||
}
|
||||
public void ShowSelection()
|
||||
{ _input.CancelSplit(); _voice.Clear(); _demonstration?.Hide(); Session.ShowSelection(); Refresh(true); }
|
||||
@@ -134,33 +137,41 @@ namespace MagnetismHeroes.UnityRuntime.Bootstrap
|
||||
: hint.Kind == HintKind.Count ? "아직 세지 않은 이 구를 눌러 볼까?"
|
||||
: hint.Kind == HintKind.Merge ? "빛나는 두 친구를 가까이 끌어와 붙여 볼까?"
|
||||
: $"빛나는 {hint.GroupSize} 친구에서 나누기를 누르고 {hint.SelectionCount}개를 골라 끌어내 보자.";
|
||||
_presenter.ShowHint(hint.BallIds); _voice.Guide(hint.VoiceId);
|
||||
_presenter.ShowHint(hint.BallIds); _voice.Guide(hint.VoiceId); _sound?.Hint();
|
||||
}
|
||||
public void CommitMove(string groupId, Position3 delta, string mergeTarget = null)
|
||||
{
|
||||
bool wasPuzzle = Session.Screen == SessionScreen.Puzzle;
|
||||
var result = mergeTarget == null ? Session.MoveGroup(groupId, delta) : Session.MoveAndMerge(groupId, delta, mergeTarget);
|
||||
if (result.Accepted) _voice.CancelGuide();
|
||||
Refresh(false);
|
||||
if (result.Accepted && mergeTarget != null) _sound?.Merge();
|
||||
if (result.Accepted && wasPuzzle && Session.Screen == SessionScreen.FreePlay) _sound?.Success();
|
||||
if (result.Accepted && Session.Screen == SessionScreen.Puzzle && Session.Board.CanCount) _voice.Guide("guide_count");
|
||||
}
|
||||
public bool CommitSplit(string groupId, string[] selected, Position3 delta)
|
||||
{
|
||||
bool wasPuzzle = Session.Screen == SessionScreen.Puzzle;
|
||||
string newId = groupId + "-split";
|
||||
while (Session.Board.Groups.Any(group => group.id == newId)) newId += "-split";
|
||||
var result = Session.SplitAndMove(groupId, selected, newId, delta);
|
||||
if (result.Accepted) { _voice.CancelGuide(); Refresh(false); }
|
||||
if (result.Accepted) { _voice.CancelGuide(); Refresh(false); _sound?.Split(); }
|
||||
if (result.Accepted && wasPuzzle && Session.Screen == SessionScreen.FreePlay) _sound?.Success();
|
||||
return result.Accepted;
|
||||
}
|
||||
public void CountBall(string ballId)
|
||||
{
|
||||
if (Session.Board.Mode != BoardMode.Counting) return;
|
||||
bool wasPuzzle = Session.Screen == SessionScreen.Puzzle;
|
||||
var result = Session.Count(ballId);
|
||||
if (result.Accepted) _voice.EnqueueCount(result.Count);
|
||||
if (result.Accepted) Refresh(false);
|
||||
if (result.Accepted) { Refresh(false); _sound?.Count(); }
|
||||
if (result.Accepted && wasPuzzle && Session.Screen == SessionScreen.FreePlay) _sound?.Success();
|
||||
if (!result.Accepted && result.Reason == RejectionReason.NotCollected)
|
||||
{
|
||||
_instruction.text = "친구를 먼저 끌어와 볼까?";
|
||||
if (_presenter.Balls.TryGetValue(ballId, out var friend)) friend.Encourage();
|
||||
_sound?.Encourage();
|
||||
}
|
||||
}
|
||||
private void Refresh(bool applyCamera)
|
||||
@@ -186,8 +197,9 @@ namespace MagnetismHeroes.UnityRuntime.Bootstrap
|
||||
if (_nextButton != null) _nextButton.gameObject.SetActive(Session.HasNextStage);
|
||||
if (applyCamera) _orbit.Apply(Session.Camera);
|
||||
_presenter.Render(Session.Board);
|
||||
if (!playing) return;
|
||||
if (!playing) { _sound?.Clear(); _sound?.Theme("Menu"); return; }
|
||||
_environment?.Apply(_stages.First(stage => stage.StageId == Session.Board.StageId));
|
||||
_sound?.Theme(_stages.First(stage => stage.StageId == Session.Board.StageId).Theme);
|
||||
_stageTitle.text = screen == SessionScreen.FreePlay ? "자유 놀이터" : $"숫자 {Session.Board.BallCount} 친구 찾기";
|
||||
_counter.text = screen == SessionScreen.FreePlay ? $"친구 {Session.Board.BallCount}" : $"센 친구 {Session.Board.CountedCount} / {Session.Board.BallCount}";
|
||||
_instruction.text = screen == SessionScreen.FreePlay ? "해냈어! 친구와 자유롭게 놀아 보자."
|
||||
|
||||
@@ -61,6 +61,7 @@ namespace MagnetismHeroes.UnityRuntime.Interaction
|
||||
{
|
||||
Cancel();
|
||||
if (!AcceptInput) return;
|
||||
_presenter.CancelPreview();
|
||||
_start = _last = point;
|
||||
if (uiBlocked) { _gesture = Gesture.Blocked; return; }
|
||||
Physics.SyncTransforms();
|
||||
@@ -68,6 +69,7 @@ namespace MagnetismHeroes.UnityRuntime.Interaction
|
||||
if (Physics.Raycast(ray, out var hit, 100) && hit.collider.TryGetComponent<BallView>(out var ball))
|
||||
{
|
||||
_gesture = Gesture.Friend; _ballId = ball.BallId; _groupId = ball.GroupId;
|
||||
_app.Sound?.Pickup();
|
||||
if (_splitting && _selectedGroup != _groupId) { _selected.Clear(); _selectedGroup = _groupId; _app.RefreshSelection(); }
|
||||
_splitDrag = _splitting && _selected.Contains(_ballId);
|
||||
_dragPlane = new Plane(_orbit.Camera.transform.forward, hit.point);
|
||||
@@ -114,6 +116,7 @@ namespace MagnetismHeroes.UnityRuntime.Interaction
|
||||
else if (_splitting)
|
||||
{
|
||||
if (!_selected.Add(_ballId)) _selected.Remove(_ballId);
|
||||
_app.Sound?.Selection();
|
||||
_app.RefreshSelection();
|
||||
}
|
||||
else { _selectedGroup = _groupId; _app.CountBall(_ballId); _app.RefreshSelection(); }
|
||||
|
||||
@@ -31,6 +31,6 @@ namespace MagnetismHeroes.UnityRuntime.Interaction
|
||||
public CameraState Snapshot() => new CameraState { target = new Position3(_target.x, _target.y, _target.z),
|
||||
rotation = new Rotation4(_rotation.x, _rotation.y, _rotation.z, _rotation.w), distance = _distance };
|
||||
private void UpdateCamera()
|
||||
{ _camera.transform.SetPositionAndRotation(_target + _rotation * new Vector3(0, 0, -_distance), _rotation); }
|
||||
{ _camera.transform.SetPositionAndRotation(_target + Vector3.up * .65f + _rotation * new Vector3(0, 0, -_distance), _rotation); }
|
||||
}
|
||||
}
|
||||
|
||||
Binary file not shown.
@@ -6,9 +6,18 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
{
|
||||
[SerializeField] private Renderer _body;
|
||||
[SerializeField] private GameObject _countMarker;
|
||||
[SerializeField] private LineRenderer _outline;
|
||||
[SerializeField] private LineRenderer _contactRing;
|
||||
private MaterialPropertyBlock _colors;
|
||||
private Color _normalColor;
|
||||
private float _encourageUntil;
|
||||
private float _pulseAt = -1;
|
||||
private Vector3 _contactDirection;
|
||||
private float _contactUntil;
|
||||
public void ShowContact(Vector3 otherPosition, bool confirmed = false)
|
||||
{ ContactCandidate = !confirmed; _contactDirection = (otherPosition - transform.position).normalized; _contactUntil = confirmed ? Time.unscaledTime + .3f : 0; }
|
||||
public void Pulse(float delay) => _pulseAt = Time.unscaledTime + delay;
|
||||
public void ClearPulse() { _pulseAt = -1; _encourageUntil = 0; _contactUntil = 0; }
|
||||
public bool Selected { get; set; }
|
||||
public bool ContactCandidate { get; set; }
|
||||
public bool Hinted { get; set; }
|
||||
@@ -21,8 +30,24 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
private void Update()
|
||||
{
|
||||
float glow = Mathf.Clamp01((_encourageUntil - Time.unscaledTime) / 0.35f);
|
||||
float pulse = _pulseAt < 0 ? 0 : Mathf.Clamp01(1 - (Time.unscaledTime - _pulseAt) / .3f);
|
||||
if (Time.unscaledTime < _pulseAt) pulse = 0;
|
||||
var color = Selected ? new Color(1, 0.78f, 0.2f) : ContactCandidate ? new Color(0.5f, 1, 0.7f) : Hinted ? Color.Lerp(_normalColor, Color.white, .5f + .3f * Mathf.Sin(Time.unscaledTime * 4)) : _normalColor;
|
||||
_colors.SetColor("_BaseColor", Color.Lerp(color, Color.white, glow * 0.7f)); _body.SetPropertyBlock(_colors);
|
||||
_colors.SetColor("_BaseColor", Color.Lerp(color, Color.white, Mathf.Max(glow, pulse) * 0.7f)); _body.SetPropertyBlock(_colors);
|
||||
if (_outline != null)
|
||||
{
|
||||
_outline.enabled = Selected;
|
||||
_outline.startColor = _outline.endColor = new Color(1, .8f, .15f);
|
||||
var camera = Camera.main;
|
||||
if (camera != null) _outline.transform.rotation = camera.transform.rotation;
|
||||
}
|
||||
if (_contactRing != null)
|
||||
{
|
||||
_contactRing.enabled = ContactCandidate || Time.unscaledTime < _contactUntil;
|
||||
_contactRing.transform.localPosition = _contactDirection * .48f;
|
||||
if (_contactDirection.sqrMagnitude > 0) _contactRing.transform.rotation = Quaternion.LookRotation(_contactDirection);
|
||||
_contactRing.startColor = _contactRing.endColor = new Color(.65f, 1, .85f, ContactCandidate ? .8f : Mathf.Clamp01((_contactUntil - Time.unscaledTime) / .3f));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
[SerializeField] private BallView _ballPrefab;
|
||||
[SerializeField] private GroupBadge _badgePrefab;
|
||||
[SerializeField] private Camera _camera;
|
||||
[SerializeField] private VoicePlayer _voice;
|
||||
private readonly Dictionary<string, BallView> _balls = new Dictionary<string, BallView>();
|
||||
private readonly List<GroupBadge> _badges = new List<GroupBadge>();
|
||||
private BoardRules _board;
|
||||
@@ -20,6 +21,10 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
|
||||
public void Render(BoardRules board)
|
||||
{
|
||||
bool transformed = board != null && _balls.Count == board.BallCount && _badges.Count != board.Groups.Length
|
||||
&& board.Balls.All(ball => _balls.ContainsKey(ball.id));
|
||||
var previous = _balls.Values.GroupBy(ball => ball.GroupId).ToDictionary(group => group.Key, group => group.Select(ball => ball.BallId).OrderBy(id => id).ToArray());
|
||||
var contacts = _balls.Values.Where(ball => ball.ContactCandidate).Select(ball => ball.BallId).ToArray();
|
||||
_board = board;
|
||||
foreach (var view in _balls.Values) { view.gameObject.SetActive(false); Destroy(view.gameObject); }
|
||||
foreach (var badge in _badges) { badge.gameObject.SetActive(false); Destroy(badge.gameObject); }
|
||||
@@ -34,7 +39,19 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
var ball = Instantiate(_ballPrefab, ToVector(state.position), Quaternion.identity, transform);
|
||||
ball.Bind(ballId, group.id, board.CountedBallIds.Contains(ballId)); _balls.Add(ballId, ball);
|
||||
}
|
||||
_badges.Add(Instantiate(_badgePrefab, transform));
|
||||
var badge = Instantiate(_badgePrefab, transform); _badges.Add(badge);
|
||||
if (transformed && (!previous.TryGetValue(group.id, out var oldIds) || !oldIds.SequenceEqual(group.ballIds.OrderBy(id => id))))
|
||||
{
|
||||
badge.React();
|
||||
var start = group.ballIds.FirstOrDefault(id => contacts.Contains(id)) ?? group.ballIds[0];
|
||||
var origin = _balls[start].transform.position;
|
||||
foreach (var id in group.ballIds) _balls[id].Pulse(Mathf.Min(.2f, Vector3.Distance(origin, _balls[id].transform.position) * .035f));
|
||||
}
|
||||
}
|
||||
if (transformed && contacts.Length == 2)
|
||||
{
|
||||
_balls[contacts[0]].ShowContact(_balls[contacts[1]].transform.position, true);
|
||||
_balls[contacts[1]].ShowContact(_balls[contacts[0]].transform.position, true);
|
||||
}
|
||||
PositionBadges();
|
||||
}
|
||||
@@ -72,7 +89,7 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
if (distance < closest) { closest = distance; source = ball; target = other; }
|
||||
}
|
||||
MergeCandidate = target.GroupId;
|
||||
source.ContactCandidate = target.ContactCandidate = true;
|
||||
source.ShowContact(target.transform.position); target.ShowContact(source.transform.position);
|
||||
}
|
||||
PositionBadges();
|
||||
}
|
||||
@@ -95,7 +112,8 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
{
|
||||
if (_board == null) return;
|
||||
MergeCandidate = null; DropDelta = Vector3.zero;
|
||||
foreach (var state in _board.Balls) { _balls[state.id].transform.position = ToVector(state.position); _balls[state.id].ContactCandidate = false; }
|
||||
foreach (var state in _board.Balls) { _balls[state.id].transform.position = ToVector(state.position); _balls[state.id].ContactCandidate = false; _balls[state.id].ClearPulse(); }
|
||||
foreach (var badge in _badges) badge.ClearReaction();
|
||||
PositionBadges();
|
||||
}
|
||||
|
||||
@@ -126,7 +144,7 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
for (int row = 0; row < 5; row++)
|
||||
for (int column = 0; column < 7; column++)
|
||||
{
|
||||
var point = new Vector3((column - 3) * 1.2f, .8f + row * 1.2f, 0);
|
||||
var point = new Vector3((column - 3) * 1.2f, .8f + row * 1.8f, 0);
|
||||
var viewport = _camera.WorldToViewportPoint(point);
|
||||
if (viewport.z <= 0 || viewport.x < .08f || viewport.x > .92f || viewport.y < .3f || viewport.y > .78f) continue;
|
||||
if (_board.Balls.Any(ball => Vector3.Distance(ToVector(ball.position), point) < 1.1f)) continue;
|
||||
@@ -140,6 +158,13 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
{
|
||||
if (_board == null) return;
|
||||
var groups = _board.Groups;
|
||||
var labels = new List<Rect>();
|
||||
var sphereRects = _balls.Values.Select(ball =>
|
||||
{
|
||||
var point = _camera.WorldToViewportPoint(ball.transform.position);
|
||||
var radius = _camera.WorldToViewportPoint(ball.transform.position + _camera.transform.up * .55f) - point;
|
||||
return new Rect(point.x - Mathf.Abs(radius.y) / _camera.aspect, point.y - Mathf.Abs(radius.y), Mathf.Abs(radius.y) * 2 / _camera.aspect, Mathf.Abs(radius.y) * 2);
|
||||
}).ToArray();
|
||||
for (int index = 0; index < groups.Length; index++)
|
||||
{
|
||||
var group = groups[index];
|
||||
@@ -148,7 +173,46 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
.OrderBy(point => Vector3.Dot(point - _camera.transform.position, _camera.transform.forward)).First();
|
||||
// Place the number above the entire group's projected sphere bounds, including tilted views.
|
||||
float highest = group.ballIds.Max(id => Vector3.Dot(_balls[id].transform.position - center, _camera.transform.up));
|
||||
_badges[index].Bind(group.ballIds.Length, center + _camera.transform.up * (highest + 0.95f),
|
||||
var number = _camera.WorldToViewportPoint(center + _camera.transform.up * (highest + .95f));
|
||||
var extent = _camera.WorldToViewportPoint(center + _camera.transform.up * (highest + .95f) + _camera.transform.right * .45f + _camera.transform.up * .3f) - number;
|
||||
float width = Mathf.Abs(extent.x), height = Mathf.Abs(extent.y);
|
||||
number.x = Mathf.Clamp(number.x, width + .02f, .98f - width);
|
||||
number.y = Mathf.Clamp(number.y, height + .25f, .84f - height);
|
||||
var original = number;
|
||||
for (int attempt = 0; attempt < 25; attempt++)
|
||||
{
|
||||
if (attempt > 0)
|
||||
{
|
||||
int column = (attempt - 1) % 5;
|
||||
float side = column == 0 ? 0 : column % 2 == 0 ? -column / 2 : (column + 1) / 2;
|
||||
number.x = Mathf.Clamp(original.x + side * width * 2.1f, width + .02f, .98f - width);
|
||||
number.y = Mathf.Clamp(original.y + (attempt - 1) / 5 * height * 2.1f, height + .25f, .84f - height);
|
||||
}
|
||||
var rect = new Rect(number.x - width, number.y - height, width * 2, height * 2);
|
||||
bool occupied = labels.Any(label => label.Overlaps(rect)) || sphereRects.Any(sphere => sphere.Overlaps(rect));
|
||||
if (!occupied || attempt == 24) { labels.Add(rect); break; }
|
||||
}
|
||||
var members = group.ballIds.Select(id => _balls[id]).ToArray();
|
||||
int mood = members.Any(ball => ball.ContactCandidate) ? 1 : members.Any(ball => ball.Selected) ? 2
|
||||
: members.Any(ball => ball.Hinted) ? 4 : _voice != null && _voice.IsSpeaking ? (_voice.CurrentClipId?.StartsWith("count_") == true ? 3 : 4) : 0;
|
||||
float look = 0;
|
||||
if (mood == 1)
|
||||
{
|
||||
var friend = _balls.Values.FirstOrDefault(ball => ball.ContactCandidate && ball.GroupId != group.id);
|
||||
if (friend != null) look = Mathf.Sign(Vector3.Dot(friend.transform.position - center, _camera.transform.right));
|
||||
}
|
||||
else if (mood == 2)
|
||||
{
|
||||
var selectedCenter = members.Where(ball => ball.Selected).Select(ball => ball.transform.position).Aggregate(Vector3.zero, (sum, position) => sum + position) / members.Count(ball => ball.Selected);
|
||||
look = Mathf.Sign(Vector3.Dot(selectedCenter - center, _camera.transform.right));
|
||||
}
|
||||
else if (_badges[index].IsReacting && groups.Length > 1)
|
||||
{
|
||||
var friend = _balls.Values.Where(ball => ball.GroupId != group.id).OrderBy(ball => (ball.transform.position - center).sqrMagnitude).First();
|
||||
look = Mathf.Sign(Vector3.Dot(friend.transform.position - center, _camera.transform.right));
|
||||
}
|
||||
_badges[index].Mood(mood, look);
|
||||
_badges[index].Bind(group.ballIds.Length, _camera.ViewportToWorldPoint(number),
|
||||
representative - _camera.transform.forward * 0.49f);
|
||||
_badges[index].FaceCamera(_camera);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
using UnityEngine;
|
||||
|
||||
namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
{
|
||||
public sealed class GameSound : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private VoicePlayer _voice;
|
||||
[SerializeField] private AudioSource _sfx;
|
||||
[SerializeField] private AudioSource _music;
|
||||
[SerializeField] private AudioClip _merge, _split, _count, _success;
|
||||
[SerializeField] private AudioClip _pickup, _ui, _selection, _encourage, _supply, _hint;
|
||||
[SerializeField] private AudioClip _garden, _cloud, _workshop, _menu;
|
||||
private string _theme;
|
||||
public void Merge() => Play(_merge);
|
||||
public void Split() => Play(_split);
|
||||
public void Count() => Play(_count);
|
||||
public void Success() => Play(_success);
|
||||
public void Pickup() => Play(_pickup);
|
||||
public void UI() => Play(_ui);
|
||||
public void Selection() => Play(_selection);
|
||||
public void Encourage() => Play(_encourage);
|
||||
public void Supply() => Play(_supply);
|
||||
public void Hint() => Play(_hint);
|
||||
private void Play(AudioClip clip) { if (clip != null) { Update(); _sfx.PlayOneShot(clip); } }
|
||||
public void Theme(string theme)
|
||||
{
|
||||
_theme = theme;
|
||||
var clip = theme == "Garden" ? _garden : theme == "Cloud" ? _cloud : theme == "Workshop" ? _workshop : theme == "Menu" ? _menu : null;
|
||||
if (_music.clip == clip) return;
|
||||
_music.Stop(); _music.clip = clip;
|
||||
if (clip != null) _music.Play();
|
||||
}
|
||||
public void Clear() { _sfx.Stop(); _music.Stop(); _music.clip = null; }
|
||||
private void Update()
|
||||
{
|
||||
bool speech = _voice.IsSpeaking;
|
||||
_sfx.volume = speech ? .12f : .5f;
|
||||
_music.volume = speech ? .06f : .25f;
|
||||
}
|
||||
private void OnApplicationPause(bool paused) { if (paused) Clear(); else Theme(_theme); }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bc5542de376f7a049a6f7d95a963cbe3
|
||||
@@ -8,9 +8,35 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
[SerializeField] private TMP_Text _number;
|
||||
[SerializeField] private Transform _face;
|
||||
[SerializeField] private Transform _cape;
|
||||
[SerializeField] private SpriteRenderer _expression;
|
||||
[SerializeField] private Sprite[] _expressions;
|
||||
private float _celebrateUntil;
|
||||
private Vector3 _facePosition;
|
||||
private int _mood;
|
||||
private float _look;
|
||||
public bool IsReacting => _celebrateUntil > Time.unscaledTime;
|
||||
public void React() => _celebrateUntil = Time.unscaledTime + .45f;
|
||||
public void Mood(int expression, float look = 0) { _mood = expression; _look = look; }
|
||||
public void ClearReaction() { _celebrateUntil = 0; _mood = 0; _look = 0; }
|
||||
public void Bind(int count, Vector3 numberPosition, Vector3 facePosition)
|
||||
{ _number.text = count.ToString(); _number.transform.position = numberPosition; _face.position = facePosition; if (_cape != null) _cape.position = facePosition; }
|
||||
{
|
||||
_number.text = count.ToString(); _number.transform.position = numberPosition; _facePosition = facePosition;
|
||||
}
|
||||
public void FaceCamera(Camera camera)
|
||||
{ _number.transform.rotation = camera.transform.rotation; _face.rotation = camera.transform.rotation; if (_cape != null) _cape.rotation = camera.transform.rotation; }
|
||||
{
|
||||
float remaining = Mathf.Max(0, _celebrateUntil - Time.unscaledTime);
|
||||
_number.transform.rotation = camera.transform.rotation;
|
||||
_face.SetPositionAndRotation(_facePosition + camera.transform.up * (Mathf.Sin(remaining / .45f * Mathf.PI) * .025f),
|
||||
camera.transform.rotation * Quaternion.Euler(0, 0, _look * 6 + Mathf.Sin(remaining * 18) * 3));
|
||||
if (_expression != null && _expressions != null && _expressions.Length == 6)
|
||||
_expression.sprite = _expressions[remaining > 0 ? 5 : _mood];
|
||||
if (_cape != null)
|
||||
{
|
||||
_cape.SetPositionAndRotation(_facePosition + camera.transform.forward * .7f, camera.transform.rotation);
|
||||
var ribbon = _cape.GetComponent<LineRenderer>();
|
||||
if (ribbon != null) for (int i = 0; i < ribbon.positionCount; i++)
|
||||
ribbon.SetPosition(i, new Vector3((_look == 0 ? -1 : _look) * (.12f + i * .075f), .03f + i * .012f + Mathf.Sin(Time.unscaledTime * 4 - i * .4f) * .025f, .02f));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: LightRibbon
|
||||
m_Shader: {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _AlphaTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 0}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- PixelSnap: 0
|
||||
- _EnableExternalAlpha: 0
|
||||
m_Colors:
|
||||
- _Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _Flip: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _RendererColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cf133a78ad4ad554d99dcacf7773fe92
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,69 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!21 &2100000
|
||||
Material:
|
||||
serializedVersion: 8
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: NumberOutline
|
||||
m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3}
|
||||
m_Parent: {fileID: 0}
|
||||
m_ModifiedSerializedProperties: 0
|
||||
m_ValidKeywords: []
|
||||
m_InvalidKeywords: []
|
||||
m_LightmapFlags: 4
|
||||
m_EnableInstancingVariants: 0
|
||||
m_DoubleSidedGI: 0
|
||||
m_CustomRenderQueue: -1
|
||||
stringTagMap: {}
|
||||
disabledShaderPasses: []
|
||||
m_LockedProperties:
|
||||
m_SavedProperties:
|
||||
serializedVersion: 3
|
||||
m_TexEnvs:
|
||||
- _MainTex:
|
||||
m_Texture: {fileID: 5182643517425281782, guid: a5bc77ef7ce7c7e4d85ac578cfcd6646, type: 2}
|
||||
m_Scale: {x: 1, y: 1}
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Ints: []
|
||||
m_Floats:
|
||||
- _ColorMask: 15
|
||||
- _CullMode: 0
|
||||
- _FaceDilate: 0
|
||||
- _GradientScale: 6
|
||||
- _MaskSoftnessX: 0
|
||||
- _MaskSoftnessY: 0
|
||||
- _OutlineSoftness: 0
|
||||
- _OutlineWidth: 0.12
|
||||
- _PerspectiveFilter: 0.875
|
||||
- _ScaleRatioA: 0.8333333
|
||||
- _ScaleRatioB: 1
|
||||
- _ScaleRatioC: 0.6770833
|
||||
- _ScaleX: 1
|
||||
- _ScaleY: 1
|
||||
- _ShaderFlags: 0
|
||||
- _Sharpness: 0
|
||||
- _Stencil: 0
|
||||
- _StencilComp: 8
|
||||
- _StencilOp: 0
|
||||
- _StencilReadMask: 255
|
||||
- _StencilWriteMask: 255
|
||||
- _TextureHeight: 1024
|
||||
- _TextureWidth: 1024
|
||||
- _UnderlayDilate: 0
|
||||
- _UnderlayOffsetX: 0
|
||||
- _UnderlayOffsetY: 0
|
||||
- _UnderlaySoftness: 0
|
||||
- _VertexOffsetX: 0
|
||||
- _VertexOffsetY: 0
|
||||
- _WeightBold: 0.75
|
||||
- _WeightNormal: 0
|
||||
m_Colors:
|
||||
- _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
|
||||
- _FaceColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _OutlineColor: {r: 1, g: 1, b: 1, a: 1}
|
||||
- _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
|
||||
m_BuildTextureStacks: []
|
||||
m_AllowLocking: 1
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cbdd6fd98c127f64ab3fcf3aa7ea0d4d
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 2100000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -58,7 +58,7 @@ LineRenderer:
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: e6eb301d5baaa3b4dba3ce2228f17fa3, type: 2}
|
||||
- {fileID: 2100000, guid: cf133a78ad4ad554d99dcacf7773fe92, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
@@ -86,9 +86,15 @@ LineRenderer:
|
||||
- {x: -0.55, y: -0.48, z: 0.6}
|
||||
- {x: -0.28, y: -0.7, z: 0.6}
|
||||
- {x: 0.1, y: -0.45, z: 0.6}
|
||||
- {x: 0, y: 0, z: 0}
|
||||
- {x: 0, y: 0, z: 0}
|
||||
- {x: 0, y: 0, z: 0}
|
||||
- {x: 0, y: 0, z: 0}
|
||||
- {x: 0, y: 0, z: 0}
|
||||
- {x: 0, y: 0, z: 0}
|
||||
m_Parameters:
|
||||
serializedVersion: 3
|
||||
widthMultiplier: 0.09
|
||||
widthMultiplier: 0.065
|
||||
widthCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
@@ -106,247 +112,8 @@ LineRenderer:
|
||||
m_RotationOrder: 4
|
||||
colorGradient:
|
||||
serializedVersion: 2
|
||||
key0: {r: 1, g: 1, b: 1, a: 1}
|
||||
key1: {r: 1, g: 1, b: 1, a: 1}
|
||||
key2: {r: 0, g: 0, b: 0, a: 0}
|
||||
key3: {r: 0, g: 0, b: 0, a: 0}
|
||||
key4: {r: 0, g: 0, b: 0, a: 0}
|
||||
key5: {r: 0, g: 0, b: 0, a: 0}
|
||||
key6: {r: 0, g: 0, b: 0, a: 0}
|
||||
key7: {r: 0, g: 0, b: 0, a: 0}
|
||||
ctime0: 0
|
||||
ctime1: 65535
|
||||
ctime2: 0
|
||||
ctime3: 0
|
||||
ctime4: 0
|
||||
ctime5: 0
|
||||
ctime6: 0
|
||||
ctime7: 0
|
||||
atime0: 0
|
||||
atime1: 65535
|
||||
atime2: 0
|
||||
atime3: 0
|
||||
atime4: 0
|
||||
atime5: 0
|
||||
atime6: 0
|
||||
atime7: 0
|
||||
m_Mode: 0
|
||||
m_ColorSpace: -1
|
||||
m_NumColorKeys: 2
|
||||
m_NumAlphaKeys: 2
|
||||
numCornerVertices: 0
|
||||
numCapVertices: 0
|
||||
alignment: 0
|
||||
textureMode: 0
|
||||
textureScale: {x: 1, y: 1}
|
||||
shadowBias: 0.5
|
||||
generateLightingData: 0
|
||||
m_UseWorldSpace: 0
|
||||
m_Loop: 0
|
||||
m_ApplyActiveColorSpace: 1
|
||||
--- !u!1 &249671451578993778
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 782296095116550680}
|
||||
- component: {fileID: 7044309821208163747}
|
||||
- component: {fileID: 1500535848956285383}
|
||||
m_Layer: 0
|
||||
m_Name: LeftEye
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &782296095116550680
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 249671451578993778}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: -0.15, y: 0.05, z: 0}
|
||||
m_LocalScale: {x: 0.08, y: 0.11, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1885524188671059666}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &7044309821208163747
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 249671451578993778}
|
||||
m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!23 &1500535848956285383
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 249671451578993778}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_StaticShadowCaster: 0
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_RayTracingMode: 2
|
||||
m_RayTraceProcedural: 0
|
||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||
m_RayTracingAccelStructBuildFlags: 1
|
||||
m_SmallMeshCulling: 1
|
||||
m_ForceMeshLod: -1
|
||||
m_MeshLodSelectionBias: 0
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: f625349e1f7edf249bc2f0006bde7ccf, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_ReceiveGI: 1
|
||||
m_PreserveUVs: 1
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 1
|
||||
m_SelectedEditorRenderState: 3
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_GlobalIlluminationMeshLod: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingLayer: 0
|
||||
m_SortingOrder: 0
|
||||
m_MaskInteraction: 0
|
||||
m_AdditionalVertexStreams: {fileID: 0}
|
||||
--- !u!1 &3900389932875835401
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 8665407476105022746}
|
||||
- component: {fileID: 2229194056938340699}
|
||||
m_Layer: 0
|
||||
m_Name: Smile
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &8665407476105022746
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3900389932875835401}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1885524188671059666}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!120 &2229194056938340699
|
||||
LineRenderer:
|
||||
serializedVersion: 3
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3900389932875835401}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_StaticShadowCaster: 0
|
||||
m_MotionVectors: 0
|
||||
m_LightProbeUsage: 0
|
||||
m_ReflectionProbeUsage: 0
|
||||
m_RayTracingMode: 0
|
||||
m_RayTraceProcedural: 0
|
||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||
m_RayTracingAccelStructBuildFlags: 1
|
||||
m_SmallMeshCulling: 1
|
||||
m_ForceMeshLod: -1
|
||||
m_MeshLodSelectionBias: 0
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: f625349e1f7edf249bc2f0006bde7ccf, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_ReceiveGI: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 1
|
||||
m_SelectedEditorRenderState: 3
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_GlobalIlluminationMeshLod: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingLayer: 0
|
||||
m_SortingOrder: 0
|
||||
m_MaskInteraction: 0
|
||||
m_Positions:
|
||||
- {x: -0.14, y: -0.0812, z: 0}
|
||||
- {x: -0.105000004, y: -0.106924996, z: 0}
|
||||
- {x: -0.07, y: -0.1253, z: 0}
|
||||
- {x: -0.035, y: -0.136325, z: 0}
|
||||
- {x: 0, y: -0.14, z: 0}
|
||||
- {x: 0.035, y: -0.136325, z: 0}
|
||||
- {x: 0.07, y: -0.1253, z: 0}
|
||||
- {x: 0.105000004, y: -0.106924996, z: 0}
|
||||
- {x: 0.14, y: -0.0812, z: 0}
|
||||
m_Parameters:
|
||||
serializedVersion: 3
|
||||
widthMultiplier: 0.035
|
||||
widthCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
colorGradient:
|
||||
serializedVersion: 2
|
||||
key0: {r: 1, g: 1, b: 1, a: 1}
|
||||
key1: {r: 1, g: 1, b: 1, a: 1}
|
||||
key0: {r: 0.101960786, g: 0.34901962, b: 0.8, a: 0.9019608}
|
||||
key1: {r: 0.9019608, g: 0.14901961, b: 0.12156863, a: 0.4509804}
|
||||
key2: {r: 0, g: 0, b: 0, a: 0}
|
||||
key3: {r: 0, g: 0, b: 0, a: 0}
|
||||
key4: {r: 0, g: 0, b: 0, a: 0}
|
||||
@@ -392,6 +159,7 @@ GameObject:
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 1885524188671059666}
|
||||
- component: {fileID: 1925119214726397857}
|
||||
m_Layer: 0
|
||||
m_Name: RepresentativeFace
|
||||
m_TagString: Untagged
|
||||
@@ -409,14 +177,71 @@ Transform:
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_LocalScale: {x: 0.9, y: 0.9, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 782296095116550680}
|
||||
- {fileID: 9186485450251357337}
|
||||
- {fileID: 8665407476105022746}
|
||||
m_Children: []
|
||||
m_Father: {fileID: 3444733339480260935}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!212 &1925119214726397857
|
||||
SpriteRenderer:
|
||||
serializedVersion: 3
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 6122023196935183107}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 0
|
||||
m_ReceiveShadows: 0
|
||||
m_DynamicOccludee: 1
|
||||
m_StaticShadowCaster: 0
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_RayTracingMode: 0
|
||||
m_RayTraceProcedural: 0
|
||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||
m_RayTracingAccelStructBuildFlags: 1
|
||||
m_SmallMeshCulling: 1
|
||||
m_ForceMeshLod: -1
|
||||
m_MeshLodSelectionBias: 0
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: 9dfc825aed78fcd4ba02077103263b40, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_ReceiveGI: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 1
|
||||
m_SelectedEditorRenderState: 0
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_GlobalIlluminationMeshLod: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingLayer: 0
|
||||
m_SortingOrder: 1
|
||||
m_MaskInteraction: 0
|
||||
m_Sprite: {fileID: 21300000, guid: 21f93be0d1b291341a50b8c34ab20ee6, type: 2}
|
||||
m_Color: {r: 1, g: 1, b: 1, a: 1}
|
||||
m_FlipX: 0
|
||||
m_FlipY: 0
|
||||
m_DrawMode: 0
|
||||
m_Size: {x: 1.065625, y: 0.8}
|
||||
m_AdaptiveModeThreshold: 0.5
|
||||
m_SpriteTileMode: 0
|
||||
m_WasSpriteAssigned: 1
|
||||
m_SpriteSortPoint: 0
|
||||
m_BlendShapeWeights: []
|
||||
--- !u!1 &7707652147950496847
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -467,6 +292,14 @@ MonoBehaviour:
|
||||
_number: {fileID: 7156837666543227830}
|
||||
_face: {fileID: 1885524188671059666}
|
||||
_cape: {fileID: 1940951101562305691}
|
||||
_expression: {fileID: 1925119214726397857}
|
||||
_expressions:
|
||||
- {fileID: 21300000, guid: 21f93be0d1b291341a50b8c34ab20ee6, type: 2}
|
||||
- {fileID: 21300000, guid: ed65f91c2b84d1b48af3b9b649be534b, type: 2}
|
||||
- {fileID: 21300000, guid: 5d99a76c6c506bf47865ebbdd7ec4aec, type: 2}
|
||||
- {fileID: 21300000, guid: 2f112b9fcdf5bbd459f0294c30ed4d7a, type: 2}
|
||||
- {fileID: 21300000, guid: 3f90d96df36808c469e4a8c1b321e69d, type: 2}
|
||||
- {fileID: 21300000, guid: b0c9d6c614b149a4598c2de453784ae9, type: 2}
|
||||
--- !u!1 &7995294815621610086
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -502,7 +335,7 @@ RectTransform:
|
||||
m_AnchorMin: {x: 0.5, y: 0.5}
|
||||
m_AnchorMax: {x: 0.5, y: 0.5}
|
||||
m_AnchoredPosition: {x: 0, y: 0}
|
||||
m_SizeDelta: {x: 2, y: 0.7}
|
||||
m_SizeDelta: {x: 1, y: 0.6}
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
--- !u!23 &5962027146007004898
|
||||
MeshRenderer:
|
||||
@@ -529,7 +362,7 @@ MeshRenderer:
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 8207275579423446409, guid: a5bc77ef7ce7c7e4d85ac578cfcd6646, type: 2}
|
||||
- {fileID: 2100000, guid: cbdd6fd98c127f64ab3fcf3aa7ea0d4d, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
@@ -576,7 +409,7 @@ MonoBehaviour:
|
||||
m_text: 1
|
||||
m_isRightToLeft: 0
|
||||
m_fontAsset: {fileID: 11400000, guid: a5bc77ef7ce7c7e4d85ac578cfcd6646, type: 2}
|
||||
m_sharedMaterial: {fileID: 8207275579423446409, guid: a5bc77ef7ce7c7e4d85ac578cfcd6646, type: 2}
|
||||
m_sharedMaterial: {fileID: 2100000, guid: cbdd6fd98c127f64ab3fcf3aa7ea0d4d, type: 2}
|
||||
m_fontSharedMaterials: []
|
||||
m_fontMaterial: {fileID: 0}
|
||||
m_fontMaterials: []
|
||||
@@ -600,8 +433,8 @@ MonoBehaviour:
|
||||
m_faceColor:
|
||||
serializedVersion: 2
|
||||
rgba: 4294967295
|
||||
m_fontSize: 5
|
||||
m_fontSizeBase: 5
|
||||
m_fontSize: 3.5
|
||||
m_fontSizeBase: 3.5
|
||||
m_fontWeight: 400
|
||||
m_enableAutoSizing: 0
|
||||
m_fontSizeMin: 18
|
||||
@@ -648,93 +481,3 @@ MonoBehaviour:
|
||||
m_hasFontAssetChanged: 0
|
||||
m_renderer: {fileID: 5962027146007004898}
|
||||
m_maskType: 0
|
||||
--- !u!1 &8873238367880750306
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 9186485450251357337}
|
||||
- component: {fileID: 1721263544024944440}
|
||||
- component: {fileID: 4797747157284027217}
|
||||
m_Layer: 0
|
||||
m_Name: RightEye
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &9186485450251357337
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8873238367880750306}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
|
||||
m_LocalPosition: {x: 0.15, y: 0.05, z: 0}
|
||||
m_LocalScale: {x: 0.08, y: 0.11, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 1885524188671059666}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &1721263544024944440
|
||||
MeshFilter:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8873238367880750306}
|
||||
m_Mesh: {fileID: 10210, guid: 0000000000000000e000000000000000, type: 0}
|
||||
--- !u!23 &4797747157284027217
|
||||
MeshRenderer:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 8873238367880750306}
|
||||
m_Enabled: 1
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_StaticShadowCaster: 0
|
||||
m_MotionVectors: 1
|
||||
m_LightProbeUsage: 1
|
||||
m_ReflectionProbeUsage: 1
|
||||
m_RayTracingMode: 2
|
||||
m_RayTraceProcedural: 0
|
||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||
m_RayTracingAccelStructBuildFlags: 1
|
||||
m_SmallMeshCulling: 1
|
||||
m_ForceMeshLod: -1
|
||||
m_MeshLodSelectionBias: 0
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: f625349e1f7edf249bc2f0006bde7ccf, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_ReceiveGI: 1
|
||||
m_PreserveUVs: 1
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 1
|
||||
m_SelectedEditorRenderState: 3
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_GlobalIlluminationMeshLod: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingLayer: 0
|
||||
m_SortingOrder: 0
|
||||
m_MaskInteraction: 0
|
||||
m_AdditionalVertexStreams: {fileID: 0}
|
||||
|
||||
@@ -1,5 +1,357 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!1 &1093702104222138991
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 3606440252080871530}
|
||||
- component: {fileID: 6007570510072384754}
|
||||
m_Layer: 0
|
||||
m_Name: LightOutline
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &3606440252080871530
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1093702104222138991}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 3913606793712318518}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!120 &6007570510072384754
|
||||
LineRenderer:
|
||||
serializedVersion: 3
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 1093702104222138991}
|
||||
m_Enabled: 0
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_StaticShadowCaster: 0
|
||||
m_MotionVectors: 0
|
||||
m_LightProbeUsage: 0
|
||||
m_ReflectionProbeUsage: 0
|
||||
m_RayTracingMode: 0
|
||||
m_RayTraceProcedural: 0
|
||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||
m_RayTracingAccelStructBuildFlags: 1
|
||||
m_SmallMeshCulling: 1
|
||||
m_ForceMeshLod: -1
|
||||
m_MeshLodSelectionBias: 0
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: cf133a78ad4ad554d99dcacf7773fe92, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_ReceiveGI: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 1
|
||||
m_SelectedEditorRenderState: 3
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_GlobalIlluminationMeshLod: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingLayer: 0
|
||||
m_SortingOrder: 0
|
||||
m_MaskInteraction: 0
|
||||
m_Positions:
|
||||
- {x: 0.51, y: 0, z: -0.08}
|
||||
- {x: 0.50372106, y: 0.079781584, z: -0.08}
|
||||
- {x: 0.48503882, y: 0.15759867, z: -0.08}
|
||||
- {x: 0.45441332, y: 0.23153517, z: -0.08}
|
||||
- {x: 0.41259867, y: 0.29977047, z: -0.08}
|
||||
- {x: 0.36062443, y: 0.36062443, z: -0.08}
|
||||
- {x: 0.29977047, y: 0.41259867, z: -0.08}
|
||||
- {x: 0.23153517, y: 0.45441332, z: -0.08}
|
||||
- {x: 0.15759866, y: 0.48503882, z: -0.08}
|
||||
- {x: 0.079781525, y: 0.50372106, z: -0.08}
|
||||
- {x: -0.000000022292808, y: 0.51, z: -0.08}
|
||||
- {x: -0.07978157, y: 0.50372106, z: -0.08}
|
||||
- {x: -0.15759869, y: 0.4850388, z: -0.08}
|
||||
- {x: -0.23153521, y: 0.4544133, z: -0.08}
|
||||
- {x: -0.29977044, y: 0.41259867, z: -0.08}
|
||||
- {x: -0.36062443, y: 0.36062443, z: -0.08}
|
||||
- {x: -0.4125987, y: 0.29977044, z: -0.08}
|
||||
- {x: -0.45441335, y: 0.23153508, z: -0.08}
|
||||
- {x: -0.48503885, y: 0.15759856, z: -0.08}
|
||||
- {x: -0.50372106, y: 0.07978157, z: -0.08}
|
||||
- {x: -0.51, y: -0.000000044585615, z: -0.08}
|
||||
- {x: -0.503721, y: -0.07978165, z: -0.08}
|
||||
- {x: -0.48503882, y: -0.15759866, z: -0.08}
|
||||
- {x: -0.45441332, y: -0.23153518, z: -0.08}
|
||||
- {x: -0.41259864, y: -0.29977053, z: -0.08}
|
||||
- {x: -0.36062437, y: -0.3606245, z: -0.08}
|
||||
- {x: -0.29977039, y: -0.41259873, z: -0.08}
|
||||
- {x: -0.231535, y: -0.45441338, z: -0.08}
|
||||
- {x: -0.15759872, y: -0.4850388, z: -0.08}
|
||||
- {x: -0.07978161, y: -0.503721, z: -0.08}
|
||||
- {x: 0.000000006081689, y: -0.51, z: -0.08}
|
||||
- {x: 0.079781614, y: -0.503721, z: -0.08}
|
||||
- {x: 0.15759873, y: -0.4850388, z: -0.08}
|
||||
- {x: 0.23153524, y: -0.45441326, z: -0.08}
|
||||
- {x: 0.2997706, y: -0.41259858, z: -0.08}
|
||||
- {x: 0.36062458, y: -0.3606243, z: -0.08}
|
||||
- {x: 0.4125988, y: -0.29977033, z: -0.08}
|
||||
- {x: 0.45441332, y: -0.23153517, z: -0.08}
|
||||
- {x: 0.48503882, y: -0.15759864, z: -0.08}
|
||||
- {x: 0.50372106, y: -0.07978152, z: -0.08}
|
||||
m_Parameters:
|
||||
serializedVersion: 3
|
||||
widthMultiplier: 0.035
|
||||
widthCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
colorGradient:
|
||||
serializedVersion: 2
|
||||
key0: {r: 1, g: 1, b: 1, a: 1}
|
||||
key1: {r: 1, g: 1, b: 1, a: 1}
|
||||
key2: {r: 0, g: 0, b: 0, a: 0}
|
||||
key3: {r: 0, g: 0, b: 0, a: 0}
|
||||
key4: {r: 0, g: 0, b: 0, a: 0}
|
||||
key5: {r: 0, g: 0, b: 0, a: 0}
|
||||
key6: {r: 0, g: 0, b: 0, a: 0}
|
||||
key7: {r: 0, g: 0, b: 0, a: 0}
|
||||
ctime0: 0
|
||||
ctime1: 65535
|
||||
ctime2: 0
|
||||
ctime3: 0
|
||||
ctime4: 0
|
||||
ctime5: 0
|
||||
ctime6: 0
|
||||
ctime7: 0
|
||||
atime0: 0
|
||||
atime1: 65535
|
||||
atime2: 0
|
||||
atime3: 0
|
||||
atime4: 0
|
||||
atime5: 0
|
||||
atime6: 0
|
||||
atime7: 0
|
||||
m_Mode: 0
|
||||
m_ColorSpace: -1
|
||||
m_NumColorKeys: 2
|
||||
m_NumAlphaKeys: 2
|
||||
numCornerVertices: 0
|
||||
numCapVertices: 0
|
||||
alignment: 0
|
||||
textureMode: 0
|
||||
textureScale: {x: 1, y: 1}
|
||||
shadowBias: 0.5
|
||||
generateLightingData: 0
|
||||
m_UseWorldSpace: 0
|
||||
m_Loop: 1
|
||||
m_ApplyActiveColorSpace: 1
|
||||
--- !u!1 &3248910372933676750
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
serializedVersion: 6
|
||||
m_Component:
|
||||
- component: {fileID: 5996117382726550629}
|
||||
- component: {fileID: 4208836385555168953}
|
||||
m_Layer: 0
|
||||
m_Name: ContactLight
|
||||
m_TagString: Untagged
|
||||
m_Icon: {fileID: 0}
|
||||
m_NavMeshLayer: 0
|
||||
m_StaticEditorFlags: 0
|
||||
m_IsActive: 1
|
||||
--- !u!4 &5996117382726550629
|
||||
Transform:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3248910372933676750}
|
||||
serializedVersion: 2
|
||||
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children: []
|
||||
m_Father: {fileID: 3913606793712318518}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!120 &4208836385555168953
|
||||
LineRenderer:
|
||||
serializedVersion: 3
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 3248910372933676750}
|
||||
m_Enabled: 0
|
||||
m_CastShadows: 1
|
||||
m_ReceiveShadows: 1
|
||||
m_DynamicOccludee: 1
|
||||
m_StaticShadowCaster: 0
|
||||
m_MotionVectors: 0
|
||||
m_LightProbeUsage: 0
|
||||
m_ReflectionProbeUsage: 0
|
||||
m_RayTracingMode: 0
|
||||
m_RayTraceProcedural: 0
|
||||
m_RayTracingAccelStructBuildFlagsOverride: 0
|
||||
m_RayTracingAccelStructBuildFlags: 1
|
||||
m_SmallMeshCulling: 1
|
||||
m_ForceMeshLod: -1
|
||||
m_MeshLodSelectionBias: 0
|
||||
m_RenderingLayerMask: 1
|
||||
m_RendererPriority: 0
|
||||
m_Materials:
|
||||
- {fileID: 2100000, guid: cf133a78ad4ad554d99dcacf7773fe92, type: 2}
|
||||
m_StaticBatchInfo:
|
||||
firstSubMesh: 0
|
||||
subMeshCount: 0
|
||||
m_StaticBatchRoot: {fileID: 0}
|
||||
m_ProbeAnchor: {fileID: 0}
|
||||
m_LightProbeVolumeOverride: {fileID: 0}
|
||||
m_ScaleInLightmap: 1
|
||||
m_ReceiveGI: 1
|
||||
m_PreserveUVs: 0
|
||||
m_IgnoreNormalsForChartDetection: 0
|
||||
m_ImportantGI: 0
|
||||
m_StitchLightmapSeams: 1
|
||||
m_SelectedEditorRenderState: 3
|
||||
m_MinimumChartSize: 4
|
||||
m_AutoUVMaxDistance: 0.5
|
||||
m_AutoUVMaxAngle: 89
|
||||
m_LightmapParameters: {fileID: 0}
|
||||
m_GlobalIlluminationMeshLod: 0
|
||||
m_SortingLayerID: 0
|
||||
m_SortingLayer: 0
|
||||
m_SortingOrder: 0
|
||||
m_MaskInteraction: 0
|
||||
m_Positions:
|
||||
- {x: 0.19, y: 0, z: 0}
|
||||
- {x: 0.1863492, y: 0.03706716, z: 0}
|
||||
- {x: 0.17553711, y: 0.07270986, z: 0}
|
||||
- {x: 0.15797922, y: 0.10555834, z: 0}
|
||||
- {x: 0.13435028, y: 0.13435028, z: 0}
|
||||
- {x: 0.105558336, y: 0.15797924, z: 0}
|
||||
- {x: 0.07270985, y: 0.17553711, z: 0}
|
||||
- {x: 0.037067145, y: 0.18634921, z: 0}
|
||||
- {x: -0.000000008305164, y: 0.19, z: 0}
|
||||
- {x: -0.03706716, y: 0.1863492, z: 0}
|
||||
- {x: -0.072709866, y: 0.17553711, z: 0}
|
||||
- {x: -0.105558366, y: 0.1579792, z: 0}
|
||||
- {x: -0.13435028, y: 0.13435028, z: 0}
|
||||
- {x: -0.15797924, y: 0.105558336, z: 0}
|
||||
- {x: -0.17553712, y: 0.07270982, z: 0}
|
||||
- {x: -0.18634921, y: 0.03706716, z: 0}
|
||||
- {x: -0.19, y: -0.000000016610327, z: 0}
|
||||
- {x: -0.1863492, y: -0.037067194, z: 0}
|
||||
- {x: -0.17553711, y: -0.07270985, z: 0}
|
||||
- {x: -0.1579792, y: -0.10555836, z: 0}
|
||||
- {x: -0.13435026, y: -0.1343503, z: 0}
|
||||
- {x: -0.1055583, y: -0.15797925, z: 0}
|
||||
- {x: -0.07270979, y: -0.17553714, z: 0}
|
||||
- {x: -0.03706717, y: -0.1863492, z: 0}
|
||||
- {x: 0.0000000022657274, y: -0.19, z: 0}
|
||||
- {x: 0.03706718, y: -0.1863492, z: 0}
|
||||
- {x: 0.07270988, y: -0.1755371, z: 0}
|
||||
- {x: 0.10555838, y: -0.1579792, z: 0}
|
||||
- {x: 0.13435033, y: -0.13435024, z: 0}
|
||||
- {x: 0.15797922, y: -0.10555836, z: 0}
|
||||
- {x: 0.17553711, y: -0.07270985, z: 0}
|
||||
- {x: 0.18634921, y: -0.037067145, z: 0}
|
||||
m_Parameters:
|
||||
serializedVersion: 3
|
||||
widthMultiplier: 0.035
|
||||
widthCurve:
|
||||
serializedVersion: 2
|
||||
m_Curve:
|
||||
- serializedVersion: 3
|
||||
time: 0
|
||||
value: 1
|
||||
inSlope: 0
|
||||
outSlope: 0
|
||||
tangentMode: 0
|
||||
weightedMode: 0
|
||||
inWeight: 0.33333334
|
||||
outWeight: 0.33333334
|
||||
m_PreInfinity: 2
|
||||
m_PostInfinity: 2
|
||||
m_RotationOrder: 4
|
||||
colorGradient:
|
||||
serializedVersion: 2
|
||||
key0: {r: 1, g: 1, b: 1, a: 1}
|
||||
key1: {r: 1, g: 1, b: 1, a: 1}
|
||||
key2: {r: 0, g: 0, b: 0, a: 0}
|
||||
key3: {r: 0, g: 0, b: 0, a: 0}
|
||||
key4: {r: 0, g: 0, b: 0, a: 0}
|
||||
key5: {r: 0, g: 0, b: 0, a: 0}
|
||||
key6: {r: 0, g: 0, b: 0, a: 0}
|
||||
key7: {r: 0, g: 0, b: 0, a: 0}
|
||||
ctime0: 0
|
||||
ctime1: 65535
|
||||
ctime2: 0
|
||||
ctime3: 0
|
||||
ctime4: 0
|
||||
ctime5: 0
|
||||
ctime6: 0
|
||||
ctime7: 0
|
||||
atime0: 0
|
||||
atime1: 65535
|
||||
atime2: 0
|
||||
atime3: 0
|
||||
atime4: 0
|
||||
atime5: 0
|
||||
atime6: 0
|
||||
atime7: 0
|
||||
m_Mode: 0
|
||||
m_ColorSpace: -1
|
||||
m_NumColorKeys: 2
|
||||
m_NumAlphaKeys: 2
|
||||
numCornerVertices: 0
|
||||
numCapVertices: 0
|
||||
alignment: 0
|
||||
textureMode: 0
|
||||
textureScale: {x: 1, y: 1}
|
||||
shadowBias: 0.5
|
||||
generateLightingData: 0
|
||||
m_UseWorldSpace: 0
|
||||
m_Loop: 1
|
||||
m_ApplyActiveColorSpace: 1
|
||||
--- !u!1 &3730473297310058759
|
||||
GameObject:
|
||||
m_ObjectHideFlags: 0
|
||||
@@ -124,6 +476,8 @@ Transform:
|
||||
m_ConstrainProportionsScale: 0
|
||||
m_Children:
|
||||
- {fileID: 4419960402240753643}
|
||||
- {fileID: 3606440252080871530}
|
||||
- {fileID: 5996117382726550629}
|
||||
m_Father: {fileID: 0}
|
||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||
--- !u!33 &3708566260475808937
|
||||
@@ -218,3 +572,5 @@ MonoBehaviour:
|
||||
m_EditorClassIdentifier: MagnetismHeroes.UnityRuntime::MagnetismHeroes.UnityRuntime.Presentation.BallView
|
||||
_body: {fileID: 4902335425252088244}
|
||||
_countMarker: {fileID: 3730473297310058759}
|
||||
_outline: {fileID: 6007570510072384754}
|
||||
_contactRing: {fileID: 4208836385555168953}
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 288740df6e234394ca99df00d8ce899b
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,222 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!213 &21300000
|
||||
Sprite:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Neutral
|
||||
m_Rect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Border: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_PixelsToUnits: 640
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
m_Extrude: 0
|
||||
m_PackingTag:
|
||||
m_RenderDataKey:
|
||||
21f93be0d1b291341a50b8c34ab20ee6: 21300000
|
||||
m_AtlasTags: []
|
||||
m_SpriteAtlas: {fileID: 0}
|
||||
m_RD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bfcdcccc3e000000006666083fcdcccc3e00000000666608bfcdccccbe000000006666083fcdccccbe000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 341, z: 640, w: 768}
|
||||
downscaleMultiplier: 1
|
||||
m_AtlasRD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bfcdcccc3e000000006666083fcdcccc3e00000000666608bfcdccccbe000000006666083fcdccccbe000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 341, z: 640, w: 768}
|
||||
downscaleMultiplier: 1
|
||||
m_PhysicsShape: []
|
||||
m_Bones: []
|
||||
m_ScriptableObjects: []
|
||||
m_SpriteID:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 21f93be0d1b291341a50b8c34ab20ee6
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 21300000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,222 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!213 &21300000
|
||||
Sprite:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Interested
|
||||
m_Rect:
|
||||
serializedVersion: 2
|
||||
x: 682
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Border: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_PixelsToUnits: 640
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
m_Extrude: 0
|
||||
m_PackingTag:
|
||||
m_RenderDataKey:
|
||||
ed65f91c2b84d1b48af3b9b649be534b: 21300000
|
||||
m_AtlasTags: []
|
||||
m_SpriteAtlas: {fileID: 0}
|
||||
m_RD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bfcdcccc3e000000006666083fcdcccc3e00000000666608bfcdccccbe000000006666083fcdccccbe000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 682
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1023, z: 640, w: 768}
|
||||
downscaleMultiplier: 1
|
||||
m_AtlasRD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bfcdcccc3e000000006666083fcdcccc3e00000000666608bfcdccccbe000000006666083fcdccccbe000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 682
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1023, z: 640, w: 768}
|
||||
downscaleMultiplier: 1
|
||||
m_PhysicsShape: []
|
||||
m_Bones: []
|
||||
m_ScriptableObjects: []
|
||||
m_SpriteID:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ed65f91c2b84d1b48af3b9b649be534b
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 21300000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,222 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!213 &21300000
|
||||
Sprite:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Focused
|
||||
m_Rect:
|
||||
serializedVersion: 2
|
||||
x: 1365
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
m_Offset: {x: 0, y: 0}
|
||||
m_Border: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_PixelsToUnits: 640
|
||||
m_Pivot: {x: 0.5, y: 0.5}
|
||||
m_Extrude: 0
|
||||
m_PackingTag:
|
||||
m_RenderDataKey:
|
||||
5d99a76c6c506bf47865ebbdd7ec4aec: 21300000
|
||||
m_AtlasTags: []
|
||||
m_SpriteAtlas: {fileID: 0}
|
||||
m_RD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bfcdcccc3e000000006666083fcdcccc3e00000000666608bfcdccccbe000000006666083fcdccccbe000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 1365
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1706, z: 640, w: 768}
|
||||
downscaleMultiplier: 1
|
||||
m_AtlasRD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bfcdcccc3e000000006666083fcdcccc3e00000000666608bfcdccccbe000000006666083fcdccccbe000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 1365
|
||||
y: 512
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1706, z: 640, w: 768}
|
||||
downscaleMultiplier: 1
|
||||
m_PhysicsShape: []
|
||||
m_Bones: []
|
||||
m_ScriptableObjects: []
|
||||
m_SpriteID:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5d99a76c6c506bf47865ebbdd7ec4aec
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 21300000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,222 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!213 &21300000
|
||||
Sprite:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Laughing
|
||||
m_Rect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
m_Offset: {x: 0, y: 92.16}
|
||||
m_Border: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_PixelsToUnits: 640
|
||||
m_Pivot: {x: 0.5, y: 0.68}
|
||||
m_Extrude: 0
|
||||
m_PackingTag:
|
||||
m_RenderDataKey:
|
||||
2f112b9fcdf5bbd459f0294c30ed4d7a: 21300000
|
||||
m_AtlasTags: []
|
||||
m_SpriteAtlas: {fileID: 0}
|
||||
m_RD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bf6e12833e000000006666083f6e12833e00000000666608bf96430bbf000000006666083f96430bbf000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 341, z: 640, w: 348.16}
|
||||
downscaleMultiplier: 1
|
||||
m_AtlasRD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bf6e12833e000000006666083f6e12833e00000000666608bf96430bbf000000006666083f96430bbf000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 0
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 341, z: 640, w: 348.16}
|
||||
downscaleMultiplier: 1
|
||||
m_PhysicsShape: []
|
||||
m_Bones: []
|
||||
m_ScriptableObjects: []
|
||||
m_SpriteID:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2f112b9fcdf5bbd459f0294c30ed4d7a
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 21300000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,222 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!213 &21300000
|
||||
Sprite:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Encouraging
|
||||
m_Rect:
|
||||
serializedVersion: 2
|
||||
x: 682
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
m_Offset: {x: 0, y: 92.16}
|
||||
m_Border: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_PixelsToUnits: 640
|
||||
m_Pivot: {x: 0.5, y: 0.68}
|
||||
m_Extrude: 0
|
||||
m_PackingTag:
|
||||
m_RenderDataKey:
|
||||
3f90d96df36808c469e4a8c1b321e69d: 21300000
|
||||
m_AtlasTags: []
|
||||
m_SpriteAtlas: {fileID: 0}
|
||||
m_RD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bf6e12833e000000006666083f6e12833e00000000666608bf96430bbf000000006666083f96430bbf000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 682
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1023, z: 640, w: 348.16}
|
||||
downscaleMultiplier: 1
|
||||
m_AtlasRD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bf6e12833e000000006666083f6e12833e00000000666608bf96430bbf000000006666083f96430bbf000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 682
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1023, z: 640, w: 348.16}
|
||||
downscaleMultiplier: 1
|
||||
m_PhysicsShape: []
|
||||
m_Bones: []
|
||||
m_ScriptableObjects: []
|
||||
m_SpriteID:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f90d96df36808c469e4a8c1b321e69d
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 21300000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,222 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!213 &21300000
|
||||
Sprite:
|
||||
serializedVersion: 2
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_Name: Celebrating
|
||||
m_Rect:
|
||||
serializedVersion: 2
|
||||
x: 1365
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
m_Offset: {x: 0, y: 92.16}
|
||||
m_Border: {x: 0, y: 0, z: 0, w: 0}
|
||||
m_PixelsToUnits: 640
|
||||
m_Pivot: {x: 0.5, y: 0.68}
|
||||
m_Extrude: 0
|
||||
m_PackingTag:
|
||||
m_RenderDataKey:
|
||||
b0c9d6c614b149a4598c2de453784ae9: 21300000
|
||||
m_AtlasTags: []
|
||||
m_SpriteAtlas: {fileID: 0}
|
||||
m_RD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bf6e12833e000000006666083f6e12833e00000000666608bf96430bbf000000006666083f96430bbf000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 1365
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1706, z: 640, w: 348.16}
|
||||
downscaleMultiplier: 1
|
||||
m_AtlasRD:
|
||||
serializedVersion: 4
|
||||
texture: {fileID: 2800000, guid: a591055d8ec53524980d17d8ae176d14, type: 3}
|
||||
alphaTexture: {fileID: 0}
|
||||
secondaryTextures: []
|
||||
m_SubMeshes:
|
||||
- serializedVersion: 2
|
||||
firstByte: 0
|
||||
indexCount: 6
|
||||
topology: 0
|
||||
baseVertex: 0
|
||||
firstVertex: 0
|
||||
vertexCount: 4
|
||||
localAABB:
|
||||
m_Center: {x: 0, y: 0, z: 0}
|
||||
m_Extent: {x: 0, y: 0, z: 0}
|
||||
m_IndexBuffer: 000001000200020001000300y
|
||||
m_VertexData:
|
||||
serializedVersion: 3
|
||||
m_VertexCount: 4
|
||||
m_Channels:
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 3
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 1
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 2
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
- stream: 0
|
||||
offset: 0
|
||||
format: 0
|
||||
dimension: 0
|
||||
m_DataSize: 80
|
||||
_typelessdata: 666608bf6e12833e000000006666083f6e12833e00000000666608bf96430bbf000000006666083f96430bbf000000000000000000000000000000000000000000000000000000000000000000000000
|
||||
m_Bindpose: []
|
||||
m_BlendShapes:
|
||||
vertices: []
|
||||
shapes: []
|
||||
channels: []
|
||||
fullWeights: []
|
||||
textureRect:
|
||||
serializedVersion: 2
|
||||
x: 1365
|
||||
y: 0
|
||||
width: 682
|
||||
height: 512
|
||||
textureRectOffset: {x: 0, y: 0}
|
||||
atlasRectOffset: {x: -1, y: -1}
|
||||
settingsRaw: 3072
|
||||
uvTransform: {x: 640, y: 1706, z: 640, w: 348.16}
|
||||
downscaleMultiplier: 1
|
||||
m_PhysicsShape: []
|
||||
m_Bones: []
|
||||
m_ScriptableObjects: []
|
||||
m_SpriteID:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b0c9d6c614b149a4598c2de453784ae9
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 21300000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6ac65616eddf5cb4f8a701297e6ba336
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 1.5 MiB |
@@ -0,0 +1,158 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a591055d8ec53524980d17d8ae176d14
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 0
|
||||
wrapV: 0
|
||||
wrapW: 0
|
||||
nPOTScale: 1
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 0
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 100
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationMethod: 0
|
||||
spriteTessellationDetail: -1
|
||||
spriteGeometrySubdivision: -1
|
||||
textureType: 0
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 0
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: iOS
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID:
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -9,11 +9,13 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
public sealed class VoicePlayer : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private AudioSource _source;
|
||||
[SerializeField] private TMPro.TMP_Text _spokenNumber;
|
||||
[SerializeField] private VoiceClip[] _clips = Array.Empty<VoiceClip>();
|
||||
private readonly Queue<AudioClip> _counts = new Queue<AudioClip>();
|
||||
private AudioClip _guide;
|
||||
private bool _playingCount;
|
||||
public int PendingCount => _counts.Count + (_playingCount ? 1 : 0);
|
||||
public bool IsSpeaking => _source.isPlaying || PendingCount > 0;
|
||||
public string CurrentClipId => _source.clip == null ? null : _source.clip.name;
|
||||
|
||||
public void EnqueueCount(int count)
|
||||
@@ -28,16 +30,23 @@ namespace MagnetismHeroes.UnityRuntime.Presentation
|
||||
public void Guide(string id)
|
||||
{ _guide = Find(id); if (!_playingCount) { _source.Stop(); Advance(); } }
|
||||
public void Clear()
|
||||
{ _counts.Clear(); _guide = null; _playingCount = false; _source.Stop(); _source.clip = null; }
|
||||
{ _counts.Clear(); _guide = null; _playingCount = false; _source.Stop(); _source.clip = null; SyncSpokenNumber(); }
|
||||
public void CancelGuide()
|
||||
{ _guide = null; if (!_playingCount) { _source.Stop(); _source.clip = null; } }
|
||||
{ _guide = null; if (!_playingCount) { _source.Stop(); _source.clip = null; } SyncSpokenNumber(); }
|
||||
private AudioClip Find(string id) { foreach (var voice in _clips) if (voice.id == id) return voice.clip; return null; }
|
||||
private void Advance()
|
||||
{
|
||||
if (_source.isPlaying) return;
|
||||
if (_source.isPlaying) { SyncSpokenNumber(); return; }
|
||||
_playingCount = false;
|
||||
if (_counts.Count > 0) { _source.clip = _counts.Dequeue(); _playingCount = true; _source.Play(); }
|
||||
else if (_guide != null) { _source.clip = _guide; _guide = null; _source.Play(); }
|
||||
SyncSpokenNumber();
|
||||
}
|
||||
private void SyncSpokenNumber()
|
||||
{
|
||||
if (_spokenNumber == null) return;
|
||||
_spokenNumber.text = _source.isPlaying && _source.clip != null && _source.clip.name.StartsWith("count_")
|
||||
&& int.TryParse(_source.clip.name.Substring(6), out int number) ? $"숫자 {number}" : "";
|
||||
}
|
||||
private void Update() => Advance();
|
||||
private void OnApplicationPause(bool paused) { if (paused) Clear(); }
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 564f7607c47f6c04584b74ec47cccf68
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cfcaaa7df335af345a2184888788ecf7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,92 @@
|
||||
This Font Software is licensed under the SIL Open Font License,
|
||||
Version 1.1.
|
||||
|
||||
This license is copied below, and is also available with a FAQ at:
|
||||
http://scripts.sil.org/OFL
|
||||
|
||||
-----------------------------------------------------------
|
||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
||||
-----------------------------------------------------------
|
||||
|
||||
PREAMBLE
|
||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
||||
development of collaborative font projects, to support the font
|
||||
creation efforts of academic and linguistic communities, and to
|
||||
provide a free and open framework in which fonts may be shared and
|
||||
improved in partnership with others.
|
||||
|
||||
The OFL allows the licensed fonts to be used, studied, modified and
|
||||
redistributed freely as long as they are not sold by themselves. The
|
||||
fonts, including any derivative works, can be bundled, embedded,
|
||||
redistributed and/or sold with any software provided that any reserved
|
||||
names are not used by derivative works. The fonts and derivatives,
|
||||
however, cannot be released under any other type of license. The
|
||||
requirement for fonts to remain under this license does not apply to
|
||||
any document created using the fonts or their derivatives.
|
||||
|
||||
DEFINITIONS
|
||||
"Font Software" refers to the set of files released by the Copyright
|
||||
Holder(s) under this license and clearly marked as such. This may
|
||||
include source files, build scripts and documentation.
|
||||
|
||||
"Reserved Font Name" refers to any names specified as such after the
|
||||
copyright statement(s).
|
||||
|
||||
"Original Version" refers to the collection of Font Software
|
||||
components as distributed by the Copyright Holder(s).
|
||||
|
||||
"Modified Version" refers to any derivative made by adding to,
|
||||
deleting, or substituting -- in part or in whole -- any of the
|
||||
components of the Original Version, by changing formats or by porting
|
||||
the Font Software to a new environment.
|
||||
|
||||
"Author" refers to any designer, engineer, programmer, technical
|
||||
writer or other person who contributed to the Font Software.
|
||||
|
||||
PERMISSION & CONDITIONS
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of the Font Software, to use, study, copy, merge, embed,
|
||||
modify, redistribute, and sell modified and unmodified copies of the
|
||||
Font Software, subject to the following conditions:
|
||||
|
||||
1) Neither the Font Software nor any of its individual components, in
|
||||
Original or Modified Versions, may be sold by itself.
|
||||
|
||||
2) Original or Modified Versions of the Font Software may be bundled,
|
||||
redistributed and/or sold with any software, provided that each copy
|
||||
contains the above copyright notice and this license. These can be
|
||||
included either as stand-alone text files, human-readable headers or
|
||||
in the appropriate machine-readable metadata fields within text or
|
||||
binary files as long as those fields can be easily viewed by the user.
|
||||
|
||||
3) No Modified Version of the Font Software may use the Reserved Font
|
||||
Name(s) unless explicit written permission is granted by the
|
||||
corresponding Copyright Holder. This restriction only applies to the
|
||||
primary font name as presented to the users.
|
||||
|
||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
||||
Software shall not be used to promote, endorse or advertise any
|
||||
Modified Version, except to acknowledge the contribution(s) of the
|
||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
||||
permission.
|
||||
|
||||
5) The Font Software, modified or unmodified, in part or in whole,
|
||||
must be distributed entirely under this license, and must not be
|
||||
distributed under any other license. The requirement for fonts to
|
||||
remain under this license does not apply to any document created using
|
||||
the Font Software.
|
||||
|
||||
TERMINATION
|
||||
This license becomes null and void if any of the above conditions are
|
||||
not met.
|
||||
|
||||
DISCLAIMER
|
||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ff6708bd19804a740950631caa66d9d4
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright 2026 Alibaba Cloud
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: dc79d129840db2341a685cc4bc179cf4
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,7 @@
|
||||
fileFormatVersion: 2
|
||||
guid: aa8f5c034dc02644ab2897558d6e569c
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user