Merge remote-tracking branch 'origin/savya' into work_branch

# Conflicts:
#	Assets/Darkmatter/Content/Fonts/static/Fredoka-SemiBold SDF.asset
This commit is contained in:
Mausham
2026-06-01 18:04:29 +05:45
386 changed files with 36744 additions and 6992 deletions

View File

@@ -11,4 +11,11 @@ public interface IDrawingCatalogController
event Action ListChanged;
UniTask InitializeAsync(CancellationToken ct);
void OnTemplateSelected(string id);
/// <summary>
/// Signalled by the view layer once the catalog has finished populating after a
/// <see cref="ListChanged"/> refresh. Lets <see cref="InitializeAsync"/> keep the loading
/// screen up until items are on screen, instead of revealing an empty catalog that fills in later.
/// </summary>
void NotifyPopulated();
}

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 89ff3ec1d970c4031b6e9f765b93c4e7
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,12 @@
using System.Collections.Generic;
namespace Darkmatter.Core.Contracts.Services.Analytics
{
public interface IAnalyticsService
{
void LogEvent(string name);
void LogEvent(string name, string paramName, string paramValue);
void LogEvent(string name, IReadOnlyDictionary<string, object> parameters);
void SetUserProperty(string name, string value);
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: a36684ef8a2124c469c6ac2c8c4fef2e

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: a60852842d4a74363904d1aa6e2c8fb5
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,4 @@
namespace Darkmatter.Core.Data.Signals.Features.GameplayFlow
{
public record struct DrawingCompletedSignal(string TemplateId, int CompletionCount);
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 4e2a47489fe7c4886993338327772aac

View File

@@ -151,7 +151,7 @@ namespace Darkmatter.Features.Artbook
{
if (!entry.HasValue || entry.Value.Thumbnail == null) return;
var ct = _cts?.Token ?? CancellationToken.None;
await _gallery.SaveImageAsync(entry.Value.Thumbnail, entry.Value.Id, ct);
await _gallery.SaveImageAsync(entry.Value.Thumbnail, entry.Value.Name, ct);
}
private void HandleLeftEditClicked() => OpenForEdit(GetLeftEntry());

View File

@@ -1,8 +1,9 @@
using System;
using System.Threading;
using Cysharp.Threading.Tasks;
using Darkmatter.Core.Contracts.Features.Capture;
using Darkmatter.Core.Contracts.Features.DrawingCatalog;
using Darkmatter.Core.Contracts.Features.GameplayFlow;
using Darkmatter.Core.Contracts.Features.Progression;
using Darkmatter.Core.Contracts.Services.Capture;
using Darkmatter.Core.Contracts.Services.Gallery;
using Darkmatter.Core.Data.Signals.Features.Capture;
@@ -18,19 +19,25 @@ namespace Darkmatter.Features.Capture
private readonly IGameplaySceneRefs _refs;
private readonly IEventBus _bus;
private readonly CaptureConfig _config;
private readonly IProgressionSystem _progression;
private readonly IDrawingTemplateCatalog _catalog;
public CaptureSystem(
ICaptureService captureService,
IGalleryService galleryService,
IGameplaySceneRefs refs,
IEventBus bus,
CaptureConfig config)
CaptureConfig config,
IProgressionSystem progression,
IDrawingTemplateCatalog catalog)
{
_captureService = captureService;
_galleryService = galleryService;
_refs = refs;
_bus = bus;
_config = config;
_progression = progression;
_catalog = catalog;
}
public async UniTask<byte[]> CapturePngAsync(bool saveToGallery = false, CancellationToken ct = default)
@@ -44,9 +51,9 @@ namespace Darkmatter.Features.Capture
{
if (tex.LoadImage(png))
{
var fileName = await BuildFileNameAsync();
_bus.Publish(new GallerySaveStartedSignal());
await _galleryService.SaveImageAsync(tex,
$"colorbook_{DateTime.UtcNow:yyyyMMdd_HHmmss}.png", ct);
await _galleryService.SaveImageAsync(tex, fileName, ct);
success = true;
}
}
@@ -57,5 +64,20 @@ namespace Darkmatter.Features.Capture
}
return png;
}
private async UniTask<string> BuildFileNameAsync()
{
var id = _progression.LastOpenedTemplateId;
if (string.IsNullOrEmpty(id)) return null;
try
{
var template = await _catalog.LoadAsync(id);
return template?.DisplayName;
}
catch
{
return null;
}
}
}
}

View File

@@ -55,20 +55,20 @@ public class ColorbookFlowController : IAsyncStartable, IDisposable
await _drawingCatalog.InitializeAsync(cancellation);
if (!_navigatingToGameplay) _loadingScreen.Hide();
PrewarmRewardedAdAsync(_scopeCts.Token).Forget();
PrewarmInterstitialAdAsync(_scopeCts.Token).Forget();
}
private async UniTaskVoid PrewarmRewardedAdAsync(CancellationToken ct)
private async UniTaskVoid PrewarmInterstitialAdAsync(CancellationToken ct)
{
try
{
if (!_ads.IsInitialized) await _ads.InitializeAsync(ct);
if (!_ads.IsReady(AdFormat.Rewarded)) await _ads.LoadAsync(AdFormat.Rewarded, ct);
if (!_ads.IsReady(AdFormat.Interstitial)) await _ads.LoadAsync(AdFormat.Interstitial, ct);
}
catch (OperationCanceledException) { }
catch (Exception ex)
{
UnityEngine.Debug.LogWarning($"[ColorbookFlow] Rewarded prewarm failed: {ex.Message}");
UnityEngine.Debug.LogWarning($"[ColorbookFlow] Interstitial prewarm failed: {ex.Message}");
}
}
@@ -101,36 +101,51 @@ public class ColorbookFlowController : IAsyncStartable, IDisposable
_loadingScreen.Show();
_loadingScreen.SetProgress(0f);
await ShowRewardedAdAsync(ct);
// Fire the interstitial but never await it: the ad overlays the transition while the level
// loads underneath, so a missed/dropped ad callback can't stall the flow at 0% anymore.
ShowInterstitialAdAsync(ct).Forget();
var progress = new Progress<float>(p => _loadingScreen.SetProgress(p * 0.5f));
var mappedProgress = new Progress<float>(p => _loadingScreen.SetProgress(0.5f + p * 0.25f));
await _progression.SetLastOpenedAsync(templateId);
await _scenes.LoadSceneAsync(nameof(GameScene.Gameplay), progress: progress, cancellationToken: default);
await _scenes.UnloadSceneAsync(nameof(GameScene.Colorbook), progress: mappedProgress,
cancellationToken: default);
}
private async UniTask ShowRewardedAdAsync(CancellationToken ct)
{
const int InitTimeoutMs = 4000;
try
{
if (!_ads.IsInitialized)
var progress = new Progress<float>(p => _loadingScreen.SetProgress(p * 0.5f));
var mappedProgress = new Progress<float>(p => _loadingScreen.SetProgress(0.5f + p * 0.25f));
await _progression.SetLastOpenedAsync(templateId);
await _scenes.LoadSceneAsync(nameof(GameScene.Gameplay), progress: progress, cancellationToken: default);
await _scenes.UnloadSceneAsync(nameof(GameScene.Colorbook), progress: mappedProgress,
cancellationToken: default);
}
catch (OperationCanceledException) { /* scope disposed */ }
catch (Exception ex)
{
// Navigation failed mid-flight: release the latch and drop the loading screen so the
// user can retry instead of being stuck on a loader frozen at 0%.
UnityEngine.Debug.LogException(ex);
_navigatingToGameplay = false;
_loadingScreen.Hide();
}
}
// Fire-and-forget interstitial. Shows only if one is already prewarmed; otherwise it kicks a
// load for next time and returns immediately. Never blocks the level load — by design the
// scene swap below does not depend on the ad's close callback, so the ad can never stall it.
private async UniTaskVoid ShowInterstitialAdAsync(CancellationToken ct)
{
try
{
if (!_ads.IsInitialized) return;
if (!_ads.IsReady(AdFormat.Interstitial))
{
using var timeoutCts = CancellationTokenSource.CreateLinkedTokenSource(ct);
timeoutCts.CancelAfter(InitTimeoutMs);
await _ads.InitializeAsync(timeoutCts.Token);
_ads.LoadAsync(AdFormat.Interstitial, ct).Forget();
return;
}
if (!_ads.IsReady(AdFormat.Rewarded)) return;
await _ads.ShowAsync(AdFormat.Rewarded, ct);
await _ads.ShowAsync(AdFormat.Interstitial, ct);
}
catch (OperationCanceledException) { }
catch (Exception ex)
{
UnityEngine.Debug.LogWarning($"[ColorbookFlow] Rewarded ad skipped: {ex.Message}");
UnityEngine.Debug.LogWarning($"[ColorbookFlow] Interstitial skipped: {ex.Message}");
}
}

View File

@@ -48,7 +48,7 @@ namespace Darkmatter.Features.Coloring.UI
_canvasGroup.interactable = true;
_canvasGroup.blocksRaycasts = true;
_activeSequence = Sequence.Create()
_activeSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.UIAnchoredPosition(animatedRoot, _shownAnchoredPos, showDuration, Ease.OutBack))
.Group(Tween.Alpha(_canvasGroup, 1f, showDuration, Ease.OutQuad));
return _activeSequence;
@@ -62,7 +62,7 @@ namespace Darkmatter.Features.Coloring.UI
_canvasGroup.blocksRaycasts = false;
var hiddenPos = _shownAnchoredPos + hiddenOffset;
_activeSequence = Sequence.Create()
_activeSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.UIAnchoredPosition(animatedRoot, hiddenPos, hideDuration, Ease.InQuad))
.Group(Tween.Alpha(_canvasGroup, 0f, hideDuration, Ease.InQuad))
.ChainCallback(() => gameObject.SetActive(false));

View File

@@ -2,12 +2,9 @@ using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using Darkmatter.Core;
using Darkmatter.Core.Contracts.Features.DrawingCatalog;
using Darkmatter.Core.Contracts.Features.Progression;
using Darkmatter.Core.Data.Signals.Features.Drawing;
using Darkmatter.Libs.Observer;
using ZLinq;
namespace Darkmatter.Features.DrawingCatalog.Systems;
@@ -15,28 +12,43 @@ public sealed class DrawingCatalogController : IDrawingCatalogController
{
private readonly IDrawingTemplateCatalog _catalog;
private readonly IEventBus _bus;
private readonly IProgressionSystem _progression;
private readonly List<string> _visible = new();
public IReadOnlyList<string> VisibleIds => _visible;
public event Action ListChanged;
private UniTaskCompletionSource _firstPopulate;
public DrawingCatalogController(
IDrawingTemplateCatalog catalog,
IProgressionSystem progression,
IEventBus bus)
{
_catalog = catalog;
_progression = progression;
_bus = bus;
}
public async UniTask InitializeAsync(CancellationToken ct)
{
await _catalog.FetchAsync();
// No view listening (e.g. catalog view unassigned) — nothing will populate, so don't wait.
if (ListChanged == null)
{
Refresh();
return;
}
// Hold here until the presenter reports the catalog is on screen, so the caller can keep
// the loading screen up across the (async) thumbnail load + button spawn instead of
// revealing an empty catalog that fills in a few frames later.
_firstPopulate = new UniTaskCompletionSource();
Refresh();
using (ct.Register(() => _firstPopulate.TrySetResult()))
await _firstPopulate.Task;
}
public void NotifyPopulated() => _firstPopulate?.TrySetResult();
public void OnTemplateSelected(string id)
{
_bus.Publish(new DrawingSelectedSignal(id));
@@ -45,13 +57,8 @@ public sealed class DrawingCatalogController : IDrawingCatalogController
private void Refresh()
{
_visible.Clear();
var all = _catalog.AllTemplateIds;
foreach (var id in all)
if (!_progression.CompletedTemplateIds.AsValueEnumerable().Contains(id))
_visible.Add(id);
foreach (var id in all)
if (_progression.CompletedTemplateIds.AsValueEnumerable().Contains(id))
_visible.Add(id);
_visible.AddRange(_catalog.AllTemplateIds);
_visible.Sort(StringComparer.OrdinalIgnoreCase);
ListChanged?.Invoke();
}
}

View File

@@ -120,6 +120,8 @@ namespace Darkmatter.Features.DrawingCatalog
_view.SetItems(vms);
_view.SetPagination(_currentPage, _totalPages);
// Unblock InitializeAsync: items are now on screen, so the loading screen can hide.
_controller.NotifyPopulated();
}
public void Dispose()

View File

@@ -14,6 +14,7 @@ using Darkmatter.Core.Contracts.Services.Scenes;
using Darkmatter.Core.Data.Dynamic.Features.Progression;
using Darkmatter.Core.Data.Signals.Features.Coloring;
using Darkmatter.Core.Data.Signals.Features.Drawing;
using Darkmatter.Core.Data.Signals.Features.GameplayFlow;
using Darkmatter.Core.Data.Signals.Features.ShapeBuilder;
using Darkmatter.Core.Enums.Features.Progression;
using Darkmatter.Core.Enums.Services.Audio;
@@ -78,6 +79,13 @@ namespace Darkmatter.Features.GameplayFlow.Systems
_scopeCts = CancellationTokenSource.CreateLinkedTokenSource(cancellation);
var ct = _scopeCts.Token;
// The in-editor AdMob placeholder interstitial pauses via Time.timeScale = 0 and is
// shown fire-and-forget during the Colorbook->Gameplay swap; the Colorbook scene unload
// destroys the placeholder before it can resume, stranding timeScale at 0 (gameplay and
// scaled tweens frozen). Gameplay must never start frozen, so restore it on entry.
// No-op on device, where the real ad clients don't touch timeScale.
Time.timeScale = 1f;
_templateId = _progression.LastOpenedTemplateId;
if (string.IsNullOrEmpty(_templateId))
throw new Exception(
@@ -134,6 +142,8 @@ namespace Darkmatter.Features.GameplayFlow.Systems
_sfx.Play(SfxId.LevelComplete);
await _coloring.PlayCompletionAnimationAsync(ct);
_progression.MarkCompleted(_templateId);
var progressAfter = _progression.GetProgress(_templateId);
_bus.Publish(new DrawingCompletedSignal(_templateId, progressAfter?.completionCount ?? 1));
var nextId = _catalog.GetNextTemplate(_templateId);
if (string.IsNullOrEmpty(nextId))

View File

@@ -29,6 +29,7 @@ namespace Darkmatter.Features.ShapeBuilder.Systems
private GameObject _piecePrefab;
private IDisposable _snappedSub;
private IDisposable _unsnappedSub;
private readonly CancellationTokenSource _lifetimeCts = new();
private readonly List<string> _snappedPieceIds = new();
private readonly List<ShapePiece> _pieces = new();
@@ -174,7 +175,32 @@ namespace Darkmatter.Features.ShapeBuilder.Systems
private void CheckIfShapeAssembled()
{
if (_expected > 0 && _snapped == _expected)
_bus.Publish(new ShapeAssembledSignal(_currentTemplateId));
PublishAssembledWhenSettledAsync().Forget();
}
private async UniTaskVoid PublishAssembledWhenSettledAsync()
{
var templateId = _currentTemplateId;
try
{
// Hold the handoff to coloring until the final piece's snap
// animation has finished playing.
await UniTask.WaitWhile(AnyPieceSettling, cancellationToken: _lifetimeCts.Token);
}
catch (OperationCanceledException)
{
return;
}
if (templateId == _currentTemplateId)
_bus.Publish(new ShapeAssembledSignal(templateId));
}
private bool AnyPieceSettling()
{
foreach (var piece in _pieces)
if (piece != null && piece.IsSnapSettling) return true;
return false;
}
private async UniTask TryLoadPiecePrefabAsync(CancellationToken ct)
@@ -241,6 +267,8 @@ namespace Darkmatter.Features.ShapeBuilder.Systems
{
_snappedSub?.Dispose();
_unsnappedSub?.Dispose();
_lifetimeCts.Cancel();
_lifetimeCts.Dispose();
}
}
}

View File

@@ -19,6 +19,7 @@ namespace Darkmatter.Features.ShapeBuilder.UI
private CanvasGroup _canvasGroup;
private Vector2 _shownAnchoredPos;
private Sequence _activeSequence;
private bool _initialized;
public event Action OnArtbookClicked;
public RectTransform SpawnRoot => spawnRoot;
@@ -26,10 +27,17 @@ namespace Darkmatter.Features.ShapeBuilder.UI
private void Awake()
{
EnsureInitialized();
}
private void EnsureInitialized()
{
if (_initialized) return;
_canvasGroup = GetComponent<CanvasGroup>();
if (animatedRoot == null) animatedRoot = (RectTransform)transform;
_shownAnchoredPos = animatedRoot.anchoredPosition;
artbookButton.onClick.AddListener(HandleArtbookClicked);
_initialized = true;
}
private void HandleArtbookClicked()
@@ -39,12 +47,13 @@ namespace Darkmatter.Features.ShapeBuilder.UI
public Sequence Show()
{
EnsureInitialized();
KillActive();
gameObject.SetActive(true);
_canvasGroup.interactable = true;
_canvasGroup.blocksRaycasts = true;
_activeSequence = Sequence.Create()
_activeSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.UIAnchoredPosition(animatedRoot, _shownAnchoredPos, showDuration, Ease.OutBack))
.Group(Tween.Alpha(_canvasGroup, 1f, showDuration, Ease.OutQuad));
return _activeSequence;
@@ -52,12 +61,13 @@ namespace Darkmatter.Features.ShapeBuilder.UI
public Sequence Hide()
{
EnsureInitialized();
KillActive();
_canvasGroup.interactable = false;
_canvasGroup.blocksRaycasts = false;
var hiddenPos = _shownAnchoredPos + hiddenOffset;
_activeSequence = Sequence.Create()
_activeSequence = Sequence.Create(useUnscaledTime: true)
.Group(Tween.UIAnchoredPosition(animatedRoot, hiddenPos, hideDuration, Ease.InQuad))
.Group(Tween.Alpha(_canvasGroup, 0f, hideDuration, Ease.InQuad))
.ChainCallback(() => gameObject.SetActive(false));
@@ -66,6 +76,7 @@ namespace Darkmatter.Features.ShapeBuilder.UI
public void HideInstant()
{
EnsureInitialized();
KillActive();
animatedRoot.anchoredPosition = _shownAnchoredPos + hiddenOffset;
_canvasGroup.alpha = 0f;

View File

@@ -1,3 +1,4 @@
using Cysharp.Threading.Tasks;
using Darkmatter.Core.Contracts.Features.History;
using Darkmatter.Core.Contracts.Services.Audio;
using Darkmatter.Core.Data.Signals.Features.ShapeBuilder;
@@ -45,6 +46,7 @@ namespace Darkmatter.Features.ShapeBuilder.UI
private Vector2 _dragSizeDelta;
private Vector3 _dragLocalScale;
private Sequence _previewSeq;
private Sequence _snapSettle;
private bool _locked;
private bool _inPreview;
@@ -57,6 +59,7 @@ namespace Darkmatter.Features.ShapeBuilder.UI
public Vector2 TrayPosition => _trayPos;
public Vector2 TraySize => _traySize;
public SlotMarker ActiveSlot => _activeSlot;
public bool IsSnapSettling => _snapSettle.isAlive;
public void ReassignActiveSlot(SlotMarker slot) => _activeSlot = slot;
@@ -236,12 +239,43 @@ namespace Darkmatter.Features.ShapeBuilder.UI
internal void SnapInternal()
{
_locked = true;
image.raycastTarget = false;
if (_activeSlot != null) _activeSlot.SetOccupied(true);
_sfx.Play(SfxId.ShapeSnap);
// Let the in-flight settle animation play to completion before locking the
// piece into its slot, so the final piece lands smoothly instead of being
// cut short the instant it's dropped.
if (_previewSeq.isAlive)
{
_snapSettle = _previewSeq;
SettleThenFinalizeAsync().Forget();
}
else
{
FinalizeSnapPose();
}
_bus.Publish(new PieceSnappedSignal(_shape.Id));
}
private async UniTaskVoid SettleThenFinalizeAsync()
{
await _snapSettle; // completes when the settle finishes or is stopped
FinalizeSnapPose();
}
private void FinalizeSnapPose()
{
if (this == null || RectTransform == null) return;
_snapSettle = default;
// Bail if the piece was unsnapped (undo) or invalidated while settling.
if (!_locked || _activeSlot == null) return;
StopPreviewTweens();
Lock();
FillSlot();
_sfx.Play(SfxId.ShapeSnap);
_bus.Publish(new PieceSnappedSignal(_shape.Id));
}
private void FillSlot()
@@ -267,6 +301,7 @@ namespace Darkmatter.Features.ShapeBuilder.UI
_activeSlot = null;
Tween.StopAll(onTarget: RectTransform);
_snapSettle = default;
RectTransform.SetParent(parent, worldPositionStays: false);
if (siblingIndex >= 0) RectTransform.SetSiblingIndex(siblingIndex);

View File

@@ -0,0 +1,19 @@
using System.IO;
using UnityEditor;
using UnityEngine;
namespace Darkmatter.Libs.UnityUtils.Editor
{
public static class OpenEditorGalleryMenu
{
private const string MenuPath = "Tools/Colorbook/Open Editor Gallery";
[MenuItem(MenuPath)]
private static void Open()
{
var dir = Path.Combine(Application.persistentDataPath, "Colorbook-Gallery");
Directory.CreateDirectory(dir);
EditorUtility.RevealInFinder(dir);
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 55aad6d59cbf04999877c8c4b2f55836

View File

@@ -21,6 +21,10 @@ namespace Darkmatter.Services.Ads
[SerializeField] private bool autoReload = true;
[Tooltip("Seconds between auto-reload retries on failure.")]
[SerializeField, Min(1f)] private float reloadDelaySeconds = 5f;
[Tooltip("Max reload attempts before giving up.")]
[SerializeField, Min(1)] private int reloadMaxAttempts = 6;
[Tooltip("Hard fallback (seconds) to recover a full-screen show if AdMob never raises its close callback. Android focus-return recovery usually fires far sooner; this cap covers iOS/edge cases. Must exceed max plausible ad length so a real ad is never cut short.")]
[SerializeField, Min(15f)] private float showWatchdogSeconds = 60f;
public bool IsInitialized => _initialized;
public event Action<AdFormat, AdLoadState> LoadStateChanged;
@@ -30,6 +34,13 @@ namespace Darkmatter.Services.Ads
private bool _isChildDirected;
private CancellationTokenSource _lifetimeCts;
// App interruption state, fed by the Unity lifecycle messages below. A full-screen ad
// pushes the app into this state (Android raises focus-loss, iOS raises pause); the
// watchdog uses the return-to-foreground transition to recover a missed close callback.
private bool _appPaused;
private bool _appUnfocused;
private bool AppInterrupted => _appPaused || _appUnfocused;
private readonly Dictionary<AdFormat, AdLoadState> _states = new();
#if GOOGLE_MOBILE_ADS
@@ -62,6 +73,11 @@ namespace Darkmatter.Services.Ads
#endif
}
// Android raises focus-loss for full-screen ads; iOS raises pause. Track both so the show
// watchdog can detect the ad's return-to-foreground regardless of platform.
private void OnApplicationPause(bool pauseStatus) => _appPaused = pauseStatus;
private void OnApplicationFocus(bool hasFocus) => _appUnfocused = !hasFocus;
public async UniTask InitializeAsync(CancellationToken cancellationToken)
{
if (_initialized) return;
@@ -74,6 +90,13 @@ namespace Darkmatter.Services.Ads
#if GOOGLE_MOBILE_ADS
ApplyRequestConfiguration();
// AdMob raises ad callbacks (OnAdFullScreenContentClosed, etc.) on a background
// thread by default. UniTask continuations then resume off the main thread, so the
// scene load that runs after a rewarded ad closes calls SceneManager/Addressables
// from a background thread and throws — leaving the loading screen stuck at 0%.
// Force all ad events onto the Unity main thread.
MobileAds.RaiseAdEventsOnUnityMainThread = true;
var tcs = new UniTaskCompletionSource<bool>();
MobileAds.Initialize(_ => tcs.TrySetResult(true));
@@ -355,81 +378,116 @@ namespace Darkmatter.Services.Ads
}
}
private async UniTask<AdShowResult> ShowInterstitialAsync(CancellationToken cancellationToken)
{
var tcs = new UniTaskCompletionSource<AdShowResult>();
Action onClosed = () => tcs.TrySetResult(AdShowResult.Success());
Action<AdError> onFailed = err => tcs.TrySetResult(AdShowResult.Failure(err?.GetMessage()));
_interstitial.OnAdFullScreenContentClosed += onClosed;
_interstitial.OnAdFullScreenContentFailed += onFailed;
_interstitial.Show();
try
{
using (cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken)))
return await tcs.Task;
}
finally
{
if (_interstitial != null)
private UniTask<AdShowResult> ShowInterstitialAsync(CancellationToken cancellationToken) =>
ShowFullScreenAsync(
AdFormat.Interstitial,
(c, f) =>
{
_interstitial.OnAdFullScreenContentClosed -= onClosed;
_interstitial.OnAdFullScreenContentFailed -= onFailed;
}
ScheduleReload(AdFormat.Interstitial);
}
}
_interstitial.OnAdFullScreenContentClosed += c;
_interstitial.OnAdFullScreenContentFailed += f;
},
(c, f) =>
{
if (_interstitial == null) return;
_interstitial.OnAdFullScreenContentClosed -= c;
_interstitial.OnAdFullScreenContentFailed -= f;
},
() => AdShowResult.Success(),
() => _interstitial.Show(),
cancellationToken);
private async UniTask<AdShowResult> ShowRewardedAsync(CancellationToken cancellationToken)
private UniTask<AdShowResult> ShowRewardedAsync(CancellationToken cancellationToken)
{
var tcs = new UniTaskCompletionSource<AdShowResult>();
bool earned = false;
AdReward reward = default;
Action onClosed = () => tcs.TrySetResult(earned ? AdShowResult.WithReward(reward) : AdShowResult.Success());
Action<AdError> onFailed = err => tcs.TrySetResult(AdShowResult.Failure(err?.GetMessage()));
_rewarded.OnAdFullScreenContentClosed += onClosed;
_rewarded.OnAdFullScreenContentFailed += onFailed;
_rewarded.Show(r =>
{
earned = true;
reward = new AdReward(r.Type, r.Amount);
});
try
{
using (cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken)))
return await tcs.Task;
}
finally
{
if (_rewarded != null)
return ShowFullScreenAsync(
AdFormat.Rewarded,
(c, f) =>
{
_rewarded.OnAdFullScreenContentClosed -= onClosed;
_rewarded.OnAdFullScreenContentFailed -= onFailed;
}
ScheduleReload(AdFormat.Rewarded);
}
_rewarded.OnAdFullScreenContentClosed += c;
_rewarded.OnAdFullScreenContentFailed += f;
},
(c, f) =>
{
if (_rewarded == null) return;
_rewarded.OnAdFullScreenContentClosed -= c;
_rewarded.OnAdFullScreenContentFailed -= f;
},
() => earned ? AdShowResult.WithReward(reward) : AdShowResult.Success(),
() => _rewarded.Show(r =>
{
earned = true;
reward = new AdReward(r.Type, r.Amount);
}),
cancellationToken);
}
private async UniTask<AdShowResult> ShowRewardedInterstitialAsync(CancellationToken cancellationToken)
private UniTask<AdShowResult> ShowRewardedInterstitialAsync(CancellationToken cancellationToken)
{
var tcs = new UniTaskCompletionSource<AdShowResult>();
bool earned = false;
AdReward reward = default;
return ShowFullScreenAsync(
AdFormat.RewardedInterstitial,
(c, f) =>
{
_rewardedInterstitial.OnAdFullScreenContentClosed += c;
_rewardedInterstitial.OnAdFullScreenContentFailed += f;
},
(c, f) =>
{
if (_rewardedInterstitial == null) return;
_rewardedInterstitial.OnAdFullScreenContentClosed -= c;
_rewardedInterstitial.OnAdFullScreenContentFailed -= f;
},
() => earned ? AdShowResult.WithReward(reward) : AdShowResult.Success(),
() => _rewardedInterstitial.Show(r =>
{
earned = true;
reward = new AdReward(r.Type, r.Amount);
}),
cancellationToken);
}
Action onClosed = () => tcs.TrySetResult(earned ? AdShowResult.WithReward(reward) : AdShowResult.Success());
Action<AdError> onFailed = err => tcs.TrySetResult(AdShowResult.Failure(err?.GetMessage()));
private UniTask<AdShowResult> ShowAppOpenAsync(CancellationToken cancellationToken) =>
ShowFullScreenAsync(
AdFormat.AppOpen,
(c, f) =>
{
_appOpen.OnAdFullScreenContentClosed += c;
_appOpen.OnAdFullScreenContentFailed += f;
},
(c, f) =>
{
if (_appOpen == null) return;
_appOpen.OnAdFullScreenContentClosed -= c;
_appOpen.OnAdFullScreenContentFailed -= f;
},
() => AdShowResult.Success(),
() => _appOpen.Show(),
cancellationToken);
_rewardedInterstitial.OnAdFullScreenContentClosed += onClosed;
_rewardedInterstitial.OnAdFullScreenContentFailed += onFailed;
_rewardedInterstitial.Show(r =>
{
earned = true;
reward = new AdReward(r.Type, r.Amount);
});
// Shared full-screen show flow. AdMob can drop OnAdFullScreenContentClosed for a shown ad
// (focus loss/regain mid-ad, reloaded-ad reuse on a 2nd show, SDK edge cases); without a
// fallback the awaiting caller hangs forever and the post-ad scene load never runs (loading
// bar frozen at 0%). WatchShowAsync force-resolves via idempotent TrySetResult if the real
// close event never arrives. buildResult is reused so a granted reward survives recovery.
private async UniTask<AdShowResult> ShowFullScreenAsync(
AdFormat format,
Action<Action, Action<AdError>> subscribe,
Action<Action, Action<AdError>> unsubscribe,
Func<AdShowResult> buildResult,
Action show,
CancellationToken cancellationToken)
{
var tcs = new UniTaskCompletionSource<AdShowResult>();
bool resolved = false;
Action onClosed = () => { resolved = true; tcs.TrySetResult(buildResult()); };
Action<AdError> onFailed = err => { resolved = true; tcs.TrySetResult(AdShowResult.Failure(err?.GetMessage())); };
subscribe(onClosed, onFailed);
show();
WatchShowAsync(tcs, () => resolved, buildResult, cancellationToken).Forget();
try
{
@@ -438,39 +496,64 @@ namespace Darkmatter.Services.Ads
}
finally
{
if (_rewardedInterstitial != null)
{
_rewardedInterstitial.OnAdFullScreenContentClosed -= onClosed;
_rewardedInterstitial.OnAdFullScreenContentFailed -= onFailed;
}
ScheduleReload(AdFormat.RewardedInterstitial);
resolved = true; // stop the watchdog within one poll
unsubscribe(onClosed, onFailed);
// The in-editor placeholder ad pauses via Time.timeScale = 0; if its resume is
// dropped (e.g. the host scene unloads before its close fires) the game stays
// frozen. The ad layer owns that pause, so never leave it stranded. No-op on
// device, where real ad clients don't touch timeScale.
Time.timeScale = 1f;
ScheduleReload(format);
}
}
private async UniTask<AdShowResult> ShowAppOpenAsync(CancellationToken cancellationToken)
// Recovers a full-screen show when AdMob never raises its close callback. Primary signal:
// the ad interrupts the app (focus-loss on Android, pause on iOS) and then the app returns
// to the foreground — independent of OnAdFullScreenContentOpened, which can also be dropped.
// Fallback: a hard time cap for platforms/cases where neither lifecycle event fires.
// Realtime delays so a paused game (timeScale = 0) can't freeze the watchdog.
private async UniTaskVoid WatchShowAsync(
UniTaskCompletionSource<AdShowResult> tcs,
Func<bool> isResolved,
Func<AdShowResult> buildResult,
CancellationToken cancellationToken)
{
var tcs = new UniTaskCompletionSource<AdShowResult>();
Action onClosed = () => tcs.TrySetResult(AdShowResult.Success());
Action<AdError> onFailed = err => tcs.TrySetResult(AdShowResult.Failure(err?.GetMessage()));
_appOpen.OnAdFullScreenContentClosed += onClosed;
_appOpen.OnAdFullScreenContentFailed += onFailed;
_appOpen.Show();
const int PollMs = 250;
const int ForegroundGraceMs = 750;
bool sawInterrupted = false;
float elapsed = 0f;
try
{
using (cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken)))
return await tcs.Task;
}
finally
{
if (_appOpen != null)
while (!cancellationToken.IsCancellationRequested && !isResolved())
{
_appOpen.OnAdFullScreenContentClosed -= onClosed;
_appOpen.OnAdFullScreenContentFailed -= onFailed;
await UniTask.Delay(PollMs, DelayType.Realtime, PlayerLoopTiming.Update, cancellationToken);
if (isResolved()) return;
elapsed += PollMs / 1000f;
if (AppInterrupted)
{
sawInterrupted = true; // ad took the foreground
}
else if (sawInterrupted)
{
// App returned to foreground after the ad held it => ad was dismissed but
// the close callback was dropped. Brief grace for the real event, then force.
await UniTask.Delay(ForegroundGraceMs, DelayType.Realtime, PlayerLoopTiming.Update, cancellationToken);
if (!isResolved() && tcs.TrySetResult(buildResult()))
Debug.LogWarning("[AdMobAdService] Close callback missed; recovered via foreground watchdog.");
return;
}
if (elapsed >= showWatchdogSeconds)
{
if (!isResolved() && tcs.TrySetResult(buildResult()))
Debug.LogWarning($"[AdMobAdService] Close callback missed; recovered via {showWatchdogSeconds:0}s watchdog cap.");
return;
}
}
ScheduleReload(AdFormat.AppOpen);
}
catch (OperationCanceledException) { }
}
private void WireFullScreenEvents(InterstitialAd ad, AdFormat format) =>
@@ -495,8 +578,14 @@ namespace Darkmatter.Services.Ads
{
try
{
await UniTask.Delay(TimeSpan.FromSeconds(reloadDelaySeconds), cancellationToken: cancellationToken);
await LoadAsync(format, cancellationToken);
for (int attempt = 0; attempt < reloadMaxAttempts; attempt++)
{
await UniTask.Delay(TimeSpan.FromSeconds(reloadDelaySeconds), cancellationToken: cancellationToken);
if (cancellationToken.IsCancellationRequested) return;
if (IsReady(format)) return;
if (await LoadAsync(format, cancellationToken)) return;
}
Debug.LogWarning($"[AdMobAdService] {format} reload gave up after {reloadMaxAttempts} attempts.");
}
catch (OperationCanceledException) { }
}

View File

@@ -1,3 +1,4 @@
using Darkmatter.Core.Contracts.Services.Analytics;
using Darkmatter.Libs.Installers;
using UnityEngine;
using VContainer;
@@ -9,9 +10,8 @@ namespace Darkmatter.Services.Analytics
{
public void Register(IContainerBuilder builder)
{
#if FIREBASE_ANALYTICS_PRESENT
builder.RegisterEntryPoint<FirebaseAnalyticsSystem>();
#endif
builder.RegisterEntryPoint<FirebaseAnalyticsSystem>().As<IAnalyticsService>();
builder.RegisterEntryPoint<AnalyticsTracker>();
}
}
}

View File

@@ -7,7 +7,9 @@
"GUID:f51ebe6a0ceec4240a699833d6309b23",
"GUID:b0214a6008ed146ff8f122a6a9c2f6cc",
"GUID:f8c64bb88d959406689053ae3f31183d",
"GUID:a0b1547602fc44f6da0a5e755ab3a7ef"
"GUID:a0b1547602fc44f6da0a5e755ab3a7ef",
"GUID:6a0a834eb41764f12ba55c3fb04a40cb",
"GUID:b4c9f7fbf1e144933a1797dc208ece5f"
],
"includePlatforms": [],
"excludePlatforms": [],

View File

@@ -0,0 +1,63 @@
using System;
using System.Collections.Generic;
using Darkmatter.Core;
using Darkmatter.Core.Contracts.Services.Analytics;
using Darkmatter.Core.Data.Signals.Features.AppBoot;
using Darkmatter.Core.Data.Signals.Features.Capture;
using Darkmatter.Core.Data.Signals.Features.Drawing;
using Darkmatter.Core.Data.Signals.Features.GameplayFlow;
using Darkmatter.Core.Data.Signals.Features.MainMenu;
using Darkmatter.Core.Data.Signals.Features.ShapeBuilder;
using Darkmatter.Libs.Observer;
using VContainer.Unity;
namespace Darkmatter.Services.Analytics
{
public sealed class AnalyticsTracker : IStartable, IDisposable
{
private readonly IEventBus _bus;
private readonly IAnalyticsService _analytics;
private readonly List<IDisposable> _subs = new();
public AnalyticsTracker(IEventBus bus, IAnalyticsService analytics)
{
_bus = bus;
_analytics = analytics;
}
public void Start()
{
_subs.Add(_bus.Subscribe<IntroCompletedSignal>(_ => _analytics.LogEvent("intro_completed")));
_subs.Add(_bus.Subscribe<PlayBtnClickedSignal>(_ => _analytics.LogEvent("play_clicked")));
_subs.Add(_bus.Subscribe<OpenColorBookSignal>(_ => _analytics.LogEvent("colorbook_opened")));
_subs.Add(_bus.Subscribe<OpenArtBookSignal>(_ => _analytics.LogEvent("artbook_opened")));
_subs.Add(_bus.Subscribe<ReturnToMainMenuSignal>(_ => _analytics.LogEvent("main_menu_returned")));
_subs.Add(_bus.Subscribe<DrawingSelectedSignal>(s =>
_analytics.LogEvent("drawing_selected", "template_id", s.TemplateId)));
_subs.Add(_bus.Subscribe<ShapeBuilderStartedSignal>(s =>
_analytics.LogEvent("shape_builder_started", "template_id", s.TemplateId)));
_subs.Add(_bus.Subscribe<ShapeAssembledSignal>(s =>
_analytics.LogEvent("shape_assembled", "template_id", s.TemplateId)));
_subs.Add(_bus.Subscribe<DrawingCompletedSignal>(s => _analytics.LogEvent("drawing_completed",
new Dictionary<string, object>
{
["template_id"] = s.TemplateId,
["completion_count"] = s.CompletionCount,
})));
_subs.Add(_bus.Subscribe<GallerySaveStartedSignal>(_ => _analytics.LogEvent("gallery_save_started")));
_subs.Add(_bus.Subscribe<GallerySaveCompletedSignal>(s =>
_analytics.LogEvent("gallery_save_completed", "success", s.Success ? "true" : "false")));
}
public void Dispose()
{
foreach (var s in _subs) s?.Dispose();
_subs.Clear();
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 5ad16bfd960ac4a7391ffffcc6e7bd59

View File

@@ -1,46 +1,100 @@
#if FIREBASE_ANALYTICS
using System;
using System.Collections.Generic;
using System.Threading;
using Cysharp.Threading.Tasks;
using Darkmatter.Core.Contracts.Services.Analytics;
using Firebase;
using Firebase.Analytics;
using Firebase.Crashlytics;
using UnityEngine;
using VContainer.Unity;
namespace Darkmatter.Services.Analytics
{
public class FirebaseAnalyticsSystem : IAsyncStartable
public class FirebaseAnalyticsSystem : IAnalyticsService, IAsyncStartable
{
public async UniTask StartAsync(CancellationToken cancellation = new CancellationToken())
{
#if !UNITY_EDITOR
await Firebase.FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
var dependencyStatus = task.Result;
if (dependencyStatus == Firebase.DependencyStatus.Available)
{
// Create and hold a reference to your FirebaseApp,
// where app is a Firebase.FirebaseApp property of your application class.
// Crashlytics will use the DefaultInstance, as well;
// this ensures that Crashlytics is initialized.
Firebase.FirebaseApp app = Firebase.FirebaseApp.DefaultInstance;
#if DEVELOPMENT_BUILD
Firebase.Crashlytics.Crashlytics.SetCustomKey("environment", "dev");
#else
Firebase.Crashlytics.Crashlytics.SetCustomKey("environment", "prod");
#endif
// When this property is set to true, Crashlytics will report all
// uncaught exceptions as fatal events. This is the recommended behavior.
Crashlytics.ReportUncaughtExceptionsAsFatal = true;
private bool _ready;
private bool _failed;
private readonly Queue<Action> _pending = new();
// Set a flag here for indicating that your project is ready to use Firebase.
}
else
{
UnityEngine.Debug.LogError(System.String.Format(
"Could not resolve all Firebase dependencies: {0}", dependencyStatus));
// Firebase Unity SDK is not safe to use here.
}
}, cancellation);
public async UniTask StartAsync(CancellationToken cancellation = default)
{
DependencyStatus status;
try
{
status = await FirebaseApp.CheckAndFixDependenciesAsync().AsUniTask();
}
catch (Exception e)
{
Debug.LogError($"[FirebaseAnalytics] Init failed: {e}");
_failed = true;
_pending.Clear();
return;
}
if (status != DependencyStatus.Available)
{
Debug.LogError($"[FirebaseAnalytics] Deps unavailable: {status}");
_failed = true;
_pending.Clear();
return;
}
_ = FirebaseApp.DefaultInstance;
#if DEVELOPMENT_BUILD
Crashlytics.SetCustomKey("environment", "dev");
#else
Crashlytics.SetCustomKey("environment", "prod");
#endif
Crashlytics.ReportUncaughtExceptionsAsFatal = true;
_ready = true;
while (_pending.Count > 0)
{
try { _pending.Dequeue().Invoke(); }
catch (Exception e) { Debug.LogError($"[FirebaseAnalytics] Queued event failed: {e}"); }
}
}
public void LogEvent(string name) =>
Run(() => FirebaseAnalytics.LogEvent(name));
public void LogEvent(string name, string paramName, string paramValue) =>
Run(() => FirebaseAnalytics.LogEvent(name, paramName, paramValue ?? string.Empty));
public void LogEvent(string name, IReadOnlyDictionary<string, object> parameters)
{
if (parameters == null || parameters.Count == 0)
{
LogEvent(name);
return;
}
var arr = new Parameter[parameters.Count];
int i = 0;
foreach (var kv in parameters) arr[i++] = ToParameter(kv.Key, kv.Value);
Run(() => FirebaseAnalytics.LogEvent(name, arr));
}
public void SetUserProperty(string name, string value) =>
Run(() => FirebaseAnalytics.SetUserProperty(name, value ?? string.Empty));
private void Run(Action action)
{
if (_failed) return;
if (_ready) { try { action(); } catch (Exception e) { Debug.LogError($"[FirebaseAnalytics] Event failed: {e}"); } }
else _pending.Enqueue(action);
}
private static Parameter ToParameter(string key, object value) => value switch
{
null => new Parameter(key, string.Empty),
long l => new Parameter(key, l),
int i => new Parameter(key, i),
double d => new Parameter(key, d),
float f => new Parameter(key, (double)f),
bool b => new Parameter(key, b ? 1L : 0L),
_ => new Parameter(key, value.ToString())
};
}
}
#endif

View File

@@ -26,9 +26,6 @@ namespace Darkmatter.Services.Capture
int sw = Screen.width;
int sh = Screen.height;
var disabledCanvases = DisableOtherRootCanvases(paperCanvas);
var disabledGraphics = HideNonPaperGraphics(paperRT);
Rect crop = ComputeCropRect(captureObject, sw, sh);
int cropW = Mathf.Max(1, (int)crop.width);
int cropH = Mathf.Max(1, (int)crop.height);
@@ -36,22 +33,31 @@ namespace Darkmatter.Services.Capture
var prevFlags = cam.clearFlags;
var prevBg = cam.backgroundColor;
var prevTarget = cam.targetTexture;
cam.clearFlags = CameraClearFlags.SolidColor;
cam.backgroundColor = new Color(0f, 0f, 0f, 0f);
var rt = RenderTexture.GetTemporary(sw, sh, 24, RenderTextureFormat.ARGB32);
cam.targetTexture = rt;
var prevMode = paperCanvas.renderMode;
var prevWorldCam = paperCanvas.worldCamera;
var prevPlaneDist = paperCanvas.planeDistance;
paperCanvas.renderMode = RenderMode.ScreenSpaceCamera;
paperCanvas.worldCamera = cam;
paperCanvas.planeDistance = Mathf.Max(0.5f, (cam.nearClipPlane + cam.farClipPlane) * 0.5f);
List<Canvas> disabledCanvases = null;
List<UnityEngine.UI.Graphic> disabledGraphics = null;
try
{
await UniTask.WaitForEndOfFrame(cancellationToken);
disabledCanvases = DisableOtherRootCanvases(paperCanvas);
disabledGraphics = HideNonPaperGraphics(paperRT);
HideBackdropGraphics(paperRT, disabledGraphics);
cam.clearFlags = CameraClearFlags.SolidColor;
cam.backgroundColor = new Color(0f, 0f, 0f, 0f);
cam.targetTexture = rt;
paperCanvas.renderMode = RenderMode.ScreenSpaceCamera;
paperCanvas.worldCamera = cam;
paperCanvas.planeDistance = Mathf.Max(0.5f, (cam.nearClipPlane + cam.farClipPlane) * 0.5f);
Canvas.ForceUpdateCanvases();
cam.Render();
@@ -104,12 +110,14 @@ namespace Darkmatter.Services.Capture
cam.clearFlags = prevFlags;
cam.backgroundColor = prevBg;
RenderTexture.ReleaseTemporary(rt);
foreach (var g in disabledGraphics)
if (g != null)
g.enabled = true;
foreach (var c in disabledCanvases)
if (c != null)
c.enabled = true;
if (disabledGraphics != null)
foreach (var g in disabledGraphics)
if (g != null)
g.enabled = true;
if (disabledCanvases != null)
foreach (var c in disabledCanvases)
if (c != null)
c.enabled = true;
}
}
@@ -150,6 +158,29 @@ namespace Darkmatter.Services.Capture
return disabled;
}
private static void HideBackdropGraphics(Transform paper, List<UnityEngine.UI.Graphic> disabled)
{
if (paper == null) return;
// Paper root's own graphics (the paper panel itself).
foreach (var g in paper.GetComponents<UnityEngine.UI.Graphic>())
{
if (g == null || !g.enabled) continue;
g.enabled = false;
disabled.Add(g);
}
// Solid-fill backdrops baked into the drawing: Images with no sprite render as a
// plain colored box. Colorable regions always carry a sprite (alpha hit-testing),
// so a null sprite means a backdrop, never art.
foreach (var img in paper.GetComponentsInChildren<UnityEngine.UI.Image>(includeInactive: false))
{
if (img == null || !img.enabled || img.sprite != null) continue;
img.enabled = false;
disabled.Add(img);
}
}
private static Rect ComputeCropRect(GameObject target, int screenW, int screenH)
{
if (target == null || target.transform is not RectTransform rt)
@@ -166,10 +197,12 @@ namespace Darkmatter.Services.Capture
private static Texture2D Resize(Texture2D src, int width, int height)
{
var rt = RenderTexture.GetTemporary(width, height);
var rt = RenderTexture.GetTemporary(width, height, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear);
var prev = RenderTexture.active;
try
{
RenderTexture.active = rt;
GL.Clear(false, true, new Color(0f, 0f, 0f, 0f));
Graphics.Blit(src, rt);
RenderTexture.active = rt;
var dst = new Texture2D(width, height, TextureFormat.RGBA32, mipChain: false);

View File

@@ -0,0 +1,16 @@
using System;
using UnityEngine;
namespace Darkmatter.Services.Gallery
{
[Serializable]
public struct GalleryConfig
{
public Texture2D Background { get; }
public GalleryConfig(Texture2D background)
{
Background = background;
}
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: bf2070de4e452444fa248a03c10928a6

View File

@@ -1,4 +1,6 @@
using System;
using System.IO;
using System.Text;
using System.Threading;
using Cysharp.Threading.Tasks;
using Darkmatter.Core.Contracts.Services.Gallery;
@@ -8,36 +10,123 @@ namespace Darkmatter.Services.Gallery
{
public class GalleryService : IGalleryService
{
private readonly GalleryConfig _config;
public GalleryService(GalleryConfig config) => _config = config;
public async UniTask SaveImageAsync(Texture2D image, string fileName, CancellationToken cancellationToken)
{
var permission = await NativeGallery.RequestPermissionAsync(NativeGallery.PermissionType.Write,
NativeGallery.MediaType.Image);
if (permission != NativeGallery.Permission.Granted)
Texture2D composited = null;
Texture2D toSave = image;
if (_config.Background != null)
{
return;
composited = CompositeOverBackground(image, _config.Background);
toSave = composited;
}
var tcs = new UniTaskCompletionSource();
var registration = cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken));
var resolvedName = BuildUniqueFileName(fileName);
NativeGallery.SaveImageToGallery(image, "Colorbook",
filename: $"colorbook_{DateTime.UtcNow:yyyyMMdd_HHmmss}.png", callback: (success, path) =>
try
{
#if UNITY_EDITOR
var bytes = toSave.EncodeToPNG();
var dir = Path.Combine(Application.persistentDataPath, "Colorbook-Gallery");
Directory.CreateDirectory(dir);
var path = Path.Combine(dir, resolvedName);
await File.WriteAllBytesAsync(path, bytes, cancellationToken);
Debug.Log($"[GalleryService] (Editor) Image saved to: {path}");
#else
var permission = await NativeGallery.RequestPermissionAsync(NativeGallery.PermissionType.Write,
NativeGallery.MediaType.Image);
if (permission != NativeGallery.Permission.Granted)
{
registration.Dispose();
if (!success)
{
Debug.LogError("Failed to save image to gallery.");
}
else
{
Debug.Log($"Image saved to gallery at: {path}");
}
return;
}
tcs.TrySetResult();
});
var tcs = new UniTaskCompletionSource();
var registration = cancellationToken.Register(() => tcs.TrySetCanceled(cancellationToken));
await tcs.Task;
NativeGallery.SaveImageToGallery(toSave, "Colorbook",
filename: resolvedName, callback: (success, path) =>
{
registration.Dispose();
if (!success)
{
Debug.LogError("Failed to save image to gallery.");
}
else
{
Debug.Log($"Image saved to gallery at: {path}");
}
tcs.TrySetResult();
});
await tcs.Task;
#endif
}
finally
{
if (composited != null) UnityEngine.Object.Destroy(composited);
}
}
private static string BuildUniqueFileName(string baseName)
{
var prefix = Sanitize(baseName);
if (string.IsNullOrEmpty(prefix)) prefix = "drawing";
return $"{prefix}_{DateTime.UtcNow:yyyyMMdd_HHmmssfff}.png";
}
private static string Sanitize(string s)
{
if (string.IsNullOrEmpty(s)) return null;
var name = Path.GetFileNameWithoutExtension(s).Trim();
var sb = new StringBuilder(name.Length);
foreach (var c in name)
{
if (char.IsLetterOrDigit(c)) sb.Append(c);
else if (c == ' ' || c == '-' || c == '_') sb.Append('_');
}
return sb.Length == 0 ? null : sb.ToString();
}
private static Texture2D CompositeOverBackground(Texture2D captured, Texture2D background)
{
int bgW = background.width;
int bgH = background.height;
int cW = captured.width;
int cH = captured.height;
float fit = Mathf.Min(1f, Mathf.Min((float)bgW / cW, (float)bgH / cH));
int finalW = Mathf.Max(1, Mathf.RoundToInt(cW * fit));
int finalH = Mathf.Max(1, Mathf.RoundToInt(cH * fit));
int offsetX = (bgW - finalW) / 2;
int offsetY = (bgH - finalH) / 2;
var rt = RenderTexture.GetTemporary(bgW, bgH, 0, RenderTextureFormat.ARGB32);
var prev = RenderTexture.active;
try
{
Graphics.Blit(background, rt);
RenderTexture.active = rt;
GL.PushMatrix();
GL.LoadPixelMatrix(0, bgW, bgH, 0);
Graphics.DrawTexture(new Rect(offsetX, offsetY, finalW, finalH), captured);
GL.PopMatrix();
var output = new Texture2D(bgW, bgH, TextureFormat.RGBA32, mipChain: false);
output.ReadPixels(new Rect(0, 0, bgW, bgH), 0, 0);
output.Apply();
return output;
}
finally
{
RenderTexture.active = prev;
RenderTexture.ReleaseTemporary(rt);
}
}
}
}
}

View File

@@ -7,8 +7,11 @@ namespace Darkmatter.Services.Gallery
{
public class GalleryModule : MonoBehaviour,IModule
{
[SerializeField] private Texture2D saveBackground;
public void Register(IContainerBuilder builder)
{
builder.RegisterInstance(new GalleryConfig(saveBackground));
builder.Register<IGalleryService,GalleryService>(Lifetime.Singleton);
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

View File

@@ -132,6 +132,19 @@ TextureImporter:
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
spriteSheet:
serializedVersion: 2
sprites:

Binary file not shown.

View File

@@ -1,5 +1,365 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &2062124670924785838
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4283726034190383322}
- component: {fileID: 3056456366338868420}
- component: {fileID: 4472768584405535780}
- component: {fileID: 1416192098695008161}
m_Layer: 5
m_Name: Ball 1 (4)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4283726034190383322
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2062124670924785838}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2.1480439, y: 2.1480439, z: 2.1480439}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 7007843749351456914}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 120, y: -63}
m_SizeDelta: {x: 206, y: 160}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3056456366338868420
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2062124670924785838}
m_CullTransparentMesh: 1
--- !u!114 &4472768584405535780
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2062124670924785838}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 782004218, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &1416192098695008161
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2062124670924785838}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7667901d8aea645d28b5125a2ed546ce, type: 3}
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.UI.ColorRegionView
<RegionId>k__BackingField: Ball_1__4
alphaHitThreshold: 0.5
--- !u!1 &2663532141933448284
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 4210266305818195301}
- component: {fileID: 7084174367121215159}
- component: {fileID: 8358247987306301573}
- component: {fileID: 6264073236045925559}
m_Layer: 5
m_Name: Ball 1 (1)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &4210266305818195301
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2663532141933448284}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2.1323996, y: 2.1323996, z: 2.1323996}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7007843749351456914}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -3.5, y: 230.6}
m_SizeDelta: {x: 137, y: 172}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7084174367121215159
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2663532141933448284}
m_CullTransparentMesh: 1
--- !u!114 &8358247987306301573
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2663532141933448284}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 1412510325, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &6264073236045925559
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2663532141933448284}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7667901d8aea645d28b5125a2ed546ce, type: 3}
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.UI.ColorRegionView
<RegionId>k__BackingField: Ball_1__1
alphaHitThreshold: 0.5
--- !u!1 &4186490129534872750
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1742841937534081069}
- component: {fileID: 7747220707014727277}
- component: {fileID: 6407676600503113451}
- component: {fileID: 5667220506450607617}
m_Layer: 5
m_Name: Ball 1 (3)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1742841937534081069
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4186490129534872750}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1.6899254, y: 1.6899254, z: 1.6899254}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 7007843749351456914}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 132.1, y: 128.1}
m_SizeDelta: {x: 206, y: 160}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7747220707014727277
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4186490129534872750}
m_CullTransparentMesh: 1
--- !u!114 &6407676600503113451
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4186490129534872750}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 571736697, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &5667220506450607617
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 4186490129534872750}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7667901d8aea645d28b5125a2ed546ce, type: 3}
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.UI.ColorRegionView
<RegionId>k__BackingField: Ball_1__3
alphaHitThreshold: 0.5
--- !u!1 &5614629943100357722
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3374156459420035152}
- component: {fileID: 2903961533720080030}
- component: {fileID: 4568126265006522806}
- component: {fileID: 6761780684725240527}
m_Layer: 5
m_Name: Ball 1 (5)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &3374156459420035152
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5614629943100357722}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2.1748946, y: 2.1748946, z: 2.1748946}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 7007843749351456914}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 9, y: -122}
m_SizeDelta: {x: 206, y: 160}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2903961533720080030
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5614629943100357722}
m_CullTransparentMesh: 1
--- !u!114 &4568126265006522806
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5614629943100357722}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: -1754592932, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &6761780684725240527
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5614629943100357722}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7667901d8aea645d28b5125a2ed546ce, type: 3}
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.UI.ColorRegionView
<RegionId>k__BackingField: Ball_1__5
alphaHitThreshold: 0.5
--- !u!1 &5759944736263568396
GameObject:
m_ObjectHideFlags: 0
@@ -65,9 +425,9 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: c79f0374ffc23654fa0c341985d7e249, type: 3}
m_Sprite: {fileID: -1097588712, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -101,10 +461,16 @@ RectTransform:
m_GameObject: {fileID: 6799536857748686187}
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_LocalScale: {x: 2, y: 2, z: 2}
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 5748400911909999140}
- {fileID: 4210266305818195301}
- {fileID: 6461212560377117779}
- {fileID: 1742841937534081069}
- {fileID: 4283726034190383322}
- {fileID: 3374156459420035152}
- {fileID: 1499171455522489850}
- {fileID: 7953757931564007192}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -121,6 +487,186 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 6799536857748686187}
m_CullTransparentMesh: 1
--- !u!1 &7016617008046089574
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6461212560377117779}
- component: {fileID: 6210273296947215134}
- component: {fileID: 8156181875320917282}
- component: {fileID: 7344593257758016015}
m_Layer: 5
m_Name: Ball 1 (2)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6461212560377117779
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016617008046089574}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1.2475, y: 1.2475, z: 1.2475}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 7007843749351456914}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -82.1, y: 103.9}
m_SizeDelta: {x: 137, y: 172}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &6210273296947215134
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016617008046089574}
m_CullTransparentMesh: 1
--- !u!114 &8156181875320917282
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016617008046089574}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 110110860, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &7344593257758016015
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7016617008046089574}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7667901d8aea645d28b5125a2ed546ce, type: 3}
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.UI.ColorRegionView
<RegionId>k__BackingField: Ball_1__2
alphaHitThreshold: 0.5
--- !u!1 &8884255625160799694
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1499171455522489850}
- component: {fileID: 5584541620831607999}
- component: {fileID: 8261083789739009355}
- component: {fileID: 4960287606903619533}
m_Layer: 5
m_Name: Ball 1 (6)
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1499171455522489850
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8884255625160799694}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2.2325292, y: 2.2325292, z: 2.2325292}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 7007843749351456914}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -203, y: -78}
m_SizeDelta: {x: 206, y: 160}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5584541620831607999
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8884255625160799694}
m_CullTransparentMesh: 1
--- !u!114 &8261083789739009355
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8884255625160799694}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: -1699664395, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &4960287606903619533
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8884255625160799694}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7667901d8aea645d28b5125a2ed546ce, type: 3}
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.UI.ColorRegionView
<RegionId>k__BackingField: Ball_1__6
alphaHitThreshold: 0.5
--- !u!1 &9174428872297290907
GameObject:
m_ObjectHideFlags: 0
@@ -134,7 +680,7 @@ GameObject:
- component: {fileID: 5858260579706649738}
- component: {fileID: 5165066291469502868}
m_Layer: 5
m_Name: Ball
m_Name: Ball 1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
@@ -149,15 +695,15 @@ RectTransform:
m_GameObject: {fileID: 9174428872297290907}
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: 1.6829311, y: 1.6829311, z: 1.6829311}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 7007843749351456914}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
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: 655, y: 655}
m_AnchoredPosition: {x: -179, y: 157}
m_SizeDelta: {x: 137, y: 172}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2532004084275676791
CanvasRenderer:
@@ -187,9 +733,9 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: b83767bdc55064240a89bbaf542508ef, type: 3}
m_Sprite: {fileID: 809345179, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
m_Type: 0
m_PreserveAspect: 0
m_PreserveAspect: 1
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -209,5 +755,5 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 7667901d8aea645d28b5125a2ed546ce, type: 3}
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.UI.ColorRegionView
<RegionId>k__BackingField: Ball
<RegionId>k__BackingField: Ball_1
alphaHitThreshold: 0.5

View File

@@ -190,7 +190,6 @@ GameObject:
m_Component:
- component: {fileID: 8491537762459218466}
- component: {fileID: 1250119535610353713}
- component: {fileID: 3115883605324534662}
m_Layer: 5
m_Name: DogColoring
m_TagString: Untagged
@@ -229,36 +228,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5797023492298654107}
m_CullTransparentMesh: 1
--- !u!114 &3115883605324534662
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 5797023492298654107}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!1 &8346443913795904020
GameObject:
m_ObjectHideFlags: 0

View File

@@ -59,7 +59,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0.4433962, g: 0.4433962, b: 0.4433962, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
@@ -149,7 +149,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0.4433962, g: 0.4433962, b: 0.4433962, a: 1}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1

View File

@@ -567,7 +567,7 @@ RectTransform:
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_ConstrainProportionsScale: 1
m_Children:
- {fileID: 8713146880366692101}
- {fileID: 4954180409987358819}

View File

@@ -130,6 +130,18 @@ PrefabInstance:
serializedVersion: 3
m_TransformParent: {fileID: 3764323147721730535}
m_Modifications:
- target: {fileID: 1825175764228994942, guid: ed3abc5b1c6bc43938850705ab3e4d4b, type: 3}
propertyPath: m_Color.b
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1825175764228994942, guid: ed3abc5b1c6bc43938850705ab3e4d4b, type: 3}
propertyPath: m_Color.g
value: 1
objectReference: {fileID: 0}
- target: {fileID: 1825175764228994942, guid: ed3abc5b1c6bc43938850705ab3e4d4b, type: 3}
propertyPath: m_Color.r
value: 1
objectReference: {fileID: 0}
- target: {fileID: 3648889831887995107, guid: ed3abc5b1c6bc43938850705ab3e4d4b, type: 3}
propertyPath: m_Pivot.x
value: 0.5

View File

@@ -101,8 +101,8 @@ RectTransform:
m_GameObject: {fileID: 3594252390097820856}
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_LocalScale: {x: 1.5, y: 1.5, z: 1.5}
m_ConstrainProportionsScale: 1
m_Children:
- {fileID: 5980705335490319841}
- {fileID: 3827914630025194271}

View File

@@ -64,7 +64,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -149,7 +149,7 @@ RectTransform:
m_GameObject: {fileID: 586400654407708949}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2.5, y: 2.5, z: 2.5}
m_LocalScale: {x: 2, y: 2, z: 2}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 5888896414592815468}
@@ -357,18 +357,18 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1188101388448078972}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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:
- {fileID: 3594603427028553980}
- {fileID: 441124950780501771}
m_Father: {fileID: 5547118069008423765}
m_Father: {fileID: 6690079309091672109}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -410.72348, y: -19.91121}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 326.27158, y: -98.71441}
m_SizeDelta: {x: 484.27228, y: 727.8224}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &1291032226892030435
@@ -432,7 +432,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -480,9 +480,9 @@ RectTransform:
- {fileID: 6461924220467094806}
m_Father: {fileID: 2165186206990489170}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 127.906555, y: -75.7051}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 127.906555, y: -2.705101}
m_SizeDelta: {x: 255.8131, y: 141}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7312164041000236076
@@ -631,7 +631,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -750,7 +750,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -791,7 +791,7 @@ RectTransform:
m_GameObject: {fileID: 2126798923183367092}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 2.5, y: 2.5, z: 2.5}
m_LocalScale: {x: 2, y: 2, z: 2}
m_ConstrainProportionsScale: 1
m_Children: []
m_Father: {fileID: 3594603427028553980}
@@ -977,6 +977,96 @@ MonoBehaviour:
rightEditBtn: {fileID: 3592641742104231533}
leftArrowBtn: {fileID: 1926483816928593170}
rightArrowBtn: {fileID: 5102858265158070802}
--- !u!1 &3968165114877126688
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 5866376038047348955}
- component: {fileID: 7173409860318281275}
- component: {fileID: 7283950262010678386}
- component: {fileID: 6005139069806320029}
m_Layer: 5
m_Name: RIghtMask
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &5866376038047348955
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3968165114877126688}
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:
- {fileID: 7587323423160720656}
m_Father: {fileID: 5547118069008423765}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 448, y: 78.80319}
m_SizeDelta: {x: 568.41, y: 644.3936}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &7173409860318281275
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3968165114877126688}
m_CullTransparentMesh: 1
--- !u!114 &7283950262010678386
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3968165114877126688}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &6005139069806320029
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3968165114877126688}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Mask
m_ShowMaskGraphic: 0
--- !u!1 &4322975953909672353
GameObject:
m_ObjectHideFlags: 0
@@ -1009,10 +1099,10 @@ RectTransform:
m_Children: []
m_Father: {fileID: 2165186206990489170}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -3.6491203, y: 1.3948975}
m_SizeDelta: {x: 1228.7139, y: 132.63}
m_SizeDelta: {x: 1228.7139, y: 278.63}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &3047844959948664926
CanvasRenderer:
@@ -1087,9 +1177,9 @@ RectTransform:
- {fileID: 6248076984857705508}
m_Father: {fileID: 2165186206990489170}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -200, y: -70.327484}
m_AnchorMin: {x: 1, y: 0.5}
m_AnchorMax: {x: 1, y: 0.5}
m_AnchoredPosition: {x: -200, y: 2.6725159}
m_SizeDelta: {x: 541.0875, y: 146.562}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &9089040063984992825
@@ -1238,7 +1328,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -1432,7 +1522,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -1572,19 +1662,19 @@ RectTransform:
m_GameObject: {fileID: 6512652973926455734}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.89153963, y: 0.89153963, z: 0.89153963}
m_LocalScale: {x: 0.8206176, y: 0.8206176, z: 0.8206176}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 2131845220052401008}
- {fileID: 7493892606189488038}
- {fileID: 4538829696477980000}
- {fileID: 7587323423160720656}
- {fileID: 6690079309091672109}
- {fileID: 5866376038047348955}
m_Father: {fileID: 3765577967584406493}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -5.5908203, y: -56}
m_SizeDelta: {x: 75.2758, y: -101.33}
m_SizeDelta: {x: 1995.2758, y: 978.67}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4100635942208554667
CanvasRenderer:
@@ -1616,7 +1706,7 @@ MonoBehaviour:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 4d3acfc266364ec42a59f3c9431a0476, type: 3}
m_Type: 0
m_PreserveAspect: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
@@ -1822,7 +1912,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -2033,7 +2123,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -2208,7 +2298,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -2502,18 +2592,18 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 7994049389914864845}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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:
- {fileID: 5888896414592815468}
- {fileID: 1919538821576412555}
m_Father: {fileID: 5547118069008423765}
m_Father: {fileID: 5866376038047348955}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 418.505, y: -19.91121}
m_AnchoredPosition: {x: -29.494995, y: -98.71441}
m_SizeDelta: {x: 484.2721, y: 727.8224}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &8052453301727865824
@@ -2653,6 +2743,96 @@ MonoBehaviour:
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!1 &8308214188962004307
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 6690079309091672109}
- component: {fileID: 4027786157419965345}
- component: {fileID: 7748873692972350005}
- component: {fileID: 2131280192654768571}
m_Layer: 5
m_Name: LeftMask
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &6690079309091672109
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8308214188962004307}
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:
- {fileID: 4538829696477980000}
m_Father: {fileID: 5547118069008423765}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -452.79, y: 78.80319}
m_SizeDelta: {x: 568.41, y: 644.3936}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &4027786157419965345
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8308214188962004307}
m_CullTransparentMesh: 1
--- !u!114 &7748873692972350005
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8308214188962004307}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &2131280192654768571
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 8308214188962004307}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Mask
m_ShowMaskGraphic: 0
--- !u!1 &8568633259698255501
GameObject:
m_ObjectHideFlags: 0
@@ -2714,7 +2894,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -2789,7 +2969,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -2929,7 +3109,7 @@ MonoBehaviour:
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_Maskable: 0
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
@@ -3019,9 +3199,9 @@ RectTransform:
- {fileID: 1884834246100035824}
m_Father: {fileID: 4538829696477980000}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -0.000030517578, y: -324.28992}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: -0.000030517578, y: 39.621277}
m_SizeDelta: {x: 484.27228, y: 79.242615}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &9047034408538749912
@@ -3059,7 +3239,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0.5}
m_AnchorMax: {x: 0, y: 0.5}
m_AnchoredPosition: {x: 95.82214, y: 14.781809}
m_AnchoredPosition: {x: 95.822266, y: 14.781809}
m_SizeDelta: {x: 133.57019, y: 94.7358}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &5792937418016701132

Binary file not shown.

After

Width:  |  Height:  |  Size: 948 KiB

View File

@@ -37,8 +37,8 @@ TextureImporter:
filterMode: 1
aniso: 1
mipBias: 0
wrapU: 1
wrapV: 1
wrapU: 0
wrapV: 0
wrapW: 0
nPOTScale: 0
lightmap: 0
@@ -52,9 +52,9 @@ TextureImporter:
spriteBorder: {x: 869, y: 876, z: 282, w: 277}
spriteGenerateFallbackPhysicsShape: 1
alphaUsage: 1
alphaIsTransparency: 1
alphaIsTransparency: 0
spriteTessellationDetail: -1
textureType: 8
textureType: 0
textureShape: 1
singleChannelComponent: 0
flipbookRows: 1
@@ -67,7 +67,7 @@ TextureImporter:
swizzle: 50462976
cookieLightType: 0
platformSettings:
- serializedVersion: 3
- serializedVersion: 4
buildTarget: DefaultTexturePlatform
maxTextureSize: 2048
resizeAlgorithm: 0
@@ -80,7 +80,7 @@ TextureImporter:
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
- serializedVersion: 4
buildTarget: Standalone
maxTextureSize: 2048
resizeAlgorithm: 0
@@ -93,7 +93,7 @@ TextureImporter:
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
- serializedVersion: 4
buildTarget: WebGL
maxTextureSize: 2048
resizeAlgorithm: 0
@@ -106,7 +106,7 @@ TextureImporter:
ignorePlatformSupport: 0
androidETC2FallbackOverride: 0
forceMaximumCompressionQuality_BC6H_BC7: 0
- serializedVersion: 3
- serializedVersion: 4
buildTarget: Android
maxTextureSize: 2048
resizeAlgorithm: 0
@@ -119,10 +119,24 @@ TextureImporter:
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: 5e97eb03825dee720800000000000000
@@ -132,6 +146,8 @@ TextureImporter:
edges: []
weights: []
secondaryTextures: []
spriteCustomMetadata:
entries: []
nameFileIdTable: {}
mipmapLimitGroupName:
pSDRemoveMatte: 0

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 KiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -22,7 +22,7 @@ MonoBehaviour:
- {r: 1, g: 1, b: 1, a: 1}
- {r: 0.05724919, g: 1, b: 0, a: 1}
- {r: 0, g: 0, b: 0, a: 1}
- {r: 0, g: 0.6845894, b: 1, a: 1}
- {r: 0, g: 0.9229766, b: 0.9622642, a: 1}
- {r: 1, g: 0, b: 0.7162385, a: 1}
- {r: 0.3857726, g: 0, b: 1, a: 1}
- {r: 0.5188679, g: 0.38189316, b: 0.30593628, a: 1}

View File

@@ -14,13 +14,25 @@ MonoBehaviour:
m_EditorClassIdentifier: Core::Darkmatter.Core.Data.Static.Features.DrawingTemplate.DrawingTemplateSO
id: Ball
displayName: Ball
defaultThumbnail: {fileID: 21300000, guid: c79f0374ffc23654fa0c341985d7e249, type: 3}
defaultThumbnail: {fileID: -1097588712, guid: 6d69a607d0df04148bf50bc6ef2d6fcc, type: 3}
drawingPrefab: {fileID: 3523649744351506124, guid: ed2c3db5a20de9643a04dca1c61ff246, type: 3}
coloringPrefab: {fileID: 6799536857748686187, guid: e02814fe96e1cf84491b9545b5642307, type: 3}
completionAnimationPrefab: {fileID: 6152354576180930737, guid: 4ae77336fb29049ef91d839f601fca8a, type: 3}
pieces:
- {fileID: 11400000, guid: a3dc108a48b1e4f2196e8d49ae8e3edd, type: 2}
regions:
- RegionId: Ball
- RegionId: Ball_1
InitialColor: {r: 1, g: 1, b: 1, a: 1}
- RegionId: Ball_1__1
InitialColor: {r: 1, g: 1, b: 1, a: 1}
- RegionId: Ball_1__2
InitialColor: {r: 1, g: 1, b: 1, a: 1}
- RegionId: Ball_1__3
InitialColor: {r: 1, g: 1, b: 1, a: 1}
- RegionId: Ball_1__4
InitialColor: {r: 1, g: 1, b: 1, a: 1}
- RegionId: Ball_1__5
InitialColor: {r: 1, g: 1, b: 1, a: 1}
- RegionId: Ball_1__6
InitialColor: {r: 1, g: 1, b: 1, a: 1}
colorPaletteId: defaultPalette

View File

@@ -12,10 +12,11 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 52d6fdba64cc3491880636e34ed593d0, type: 3}
m_Name: ShapeBuilderConfig
m_EditorClassIdentifier: Core::Darkmatter.Core.Data.Static.Features.ShapeBuilder.ShapeBuilderConfig
snapRadius: 100
previewRadius: 200
snapRadius: 200
previewRadius: 300
snapDuration: 0.25
returnDuration: 0.25
dragScale: 1.15
previewCurve:
serializedVersion: 2
m_Curve:

View File

@@ -151,9 +151,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 1424266587}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: -31.709412, y: -501}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: -39, y: 37}
m_SizeDelta: {x: 1124.7546, y: 50}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &17632382
@@ -679,6 +679,50 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: e14e6746c7bb4b57808b4d3020dc7bbb, type: 3}
m_Name:
m_EditorClassIdentifier: Services.Capture::Darkmatter.Services.Capture.Installers.CaptureServiceModule
--- !u!1 &164240469
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 164240470}
- component: {fileID: 164240471}
m_Layer: 0
m_Name: AnalyticsServiceModule
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &164240470
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 164240469}
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: 1050564725}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &164240471
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 164240469}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e89fdd4696924b7facccda23a94a978, type: 3}
m_Name:
m_EditorClassIdentifier: Services.Analytics::Darkmatter.Services.Analytics.AnalyticsModule
--- !u!1 &196669901
GameObject:
m_ObjectHideFlags: 0
@@ -1342,6 +1386,113 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: aa578cd62ad074dbf91b5228c3ac667e, type: 3}
m_Name:
m_EditorClassIdentifier: Features.DrawingTemplates::Darkmatter.Features.DrawingTemplates.DrawingTemplateFeatureModule
--- !u!1001 &673724413
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
m_TransformParent: {fileID: 0}
m_Modifications:
- target: {fileID: 4405976200006927252, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: devKey
value: DwvwaVs4yYqfPWfWjFcAL3
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalPosition.x
value: 1021.8063
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalPosition.y
value: 101.14081
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- target: {fileID: 6207133488976360133, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
- target: {fileID: 7315102894599890749, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
propertyPath: m_Name
value: AppsFlyerObject
objectReference: {fileID: 0}
m_RemovedComponents: []
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
m_SourcePrefab: {fileID: 100100000, guid: 0bfe3b149145747cc92dc53bb4df4e9b, type: 3}
--- !u!1 &680382927
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 680382929}
- component: {fileID: 680382928}
m_Layer: 0
m_Name: Smartlook Initializer
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &680382928
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 680382927}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 8f8ef78bee04409481341d4213ba58aa, type: 3}
m_Name:
m_EditorClassIdentifier: SmartlookAnalytics::SmartlookUnity.SmartlookInitializer
ResetSession: 0
ResetUser: 0
--- !u!4 &680382929
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 680382927}
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: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &752713006
GameObject:
m_ObjectHideFlags: 0
@@ -1583,6 +1734,7 @@ Transform:
- {fileID: 978572232}
- {fileID: 361052051}
- {fileID: 1707278033}
- {fileID: 164240470}
m_Father: {fileID: 1798580248}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1156238479
@@ -1632,6 +1784,8 @@ MonoBehaviour:
catalog: {fileID: 11400000, guid: 6e2d0c78aa02e4411948adcca14299a5, type: 2}
autoReload: 1
reloadDelaySeconds: 5
reloadMaxAttempts: 6
showWatchdogSeconds: 60
--- !u!1 &1239449674
GameObject:
m_ObjectHideFlags: 0
@@ -1676,6 +1830,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: f03c84255756e497f96c3baa7f6abe16, type: 3}
m_Name:
m_EditorClassIdentifier: Services.Gallery::Darkmatter.Services.Gallery.GalleryServiceModule
saveBackground: {fileID: 2800000, guid: 0c8e208e83531f84cb2b842025cdd232, type: 3}
--- !u!1 &1315655361
GameObject:
m_ObjectHideFlags: 0
@@ -1889,12 +2044,12 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.CanvasScaler
m_UiScaleMode: 0
m_UiScaleMode: 1
m_ReferencePixelsPerUnit: 100
m_ScaleFactor: 1
m_ReferenceResolution: {x: 800, y: 600}
m_ReferenceResolution: {x: 1920, y: 1080}
m_ScreenMatchMode: 0
m_MatchWidthOrHeight: 0
m_MatchWidthOrHeight: 0.5
m_PhysicalUnit: 3
m_FallbackScreenDPI: 96
m_DefaultSpriteDPI: 96
@@ -1919,7 +2074,7 @@ Canvas:
m_SortingBucketNormalizedSize: 0
m_VertexColorAlwaysGammaSpace: 1
m_UseReflectionProbes: 0
m_AdditionalShaderChannelsFlag: 1
m_AdditionalShaderChannelsFlag: 25
m_UpdateRectTransformForStandalone: 0
m_SortingLayerID: 0
m_SortingOrder: 800
@@ -2163,6 +2318,7 @@ MonoBehaviour:
- {fileID: 978572233}
- {fileID: 361052052}
- {fileID: 1707278034}
- {fileID: 164240471}
--- !u!1 &1890425864
GameObject:
m_ObjectHideFlags: 0
@@ -2394,4 +2550,6 @@ SceneRoots:
- {fileID: 109717503}
- {fileID: 1424266587}
- {fileID: 196669903}
- {fileID: 673724413}
- {fileID: 1156238481}
- {fileID: 680382929}

View File

@@ -269,12 +269,12 @@ RectTransform:
- {fileID: 669480396}
- {fileID: 897161407}
- {fileID: 2123251731}
m_Father: {fileID: 1095289319}
m_Father: {fileID: 2009173633}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 16.531006, y: -357.9118}
m_SizeDelta: {x: -18.767784, y: 364.1703}
m_AnchoredPosition: {x: 17.662354, y: -79.90527}
m_SizeDelta: {x: -77.1025, y: -159.81653}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &526134096
MonoBehaviour:
@@ -296,8 +296,8 @@ MonoBehaviour:
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 21300000, guid: 12870d045817b6342986f3e7eff126c1, type: 3}
m_Type: 2
m_Sprite: {fileID: 21300000, guid: 72335f5fd77658d449f36a91bf2abfe2, type: 3}
m_Type: 1
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
@@ -337,19 +337,16 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 532693813}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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:
- {fileID: 1139509439}
- {fileID: 1604482366}
- {fileID: 2040975075}
m_Children: []
m_Father: {fileID: 1095289319}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: 0, y: -83.00659}
m_AnchoredPosition: {x: 1.1312256, y: -66.99341}
m_SizeDelta: {x: 1861.6653, y: 148}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &669480395
@@ -388,7 +385,7 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0.014404297, y: 0.0016479492}
m_AnchoredPosition: {x: 0.014404297, y: 0.0017089844}
m_SizeDelta: {x: 0.9000244, y: 0.19000244}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &669480397
@@ -837,13 +834,16 @@ RectTransform:
m_Children:
- {fileID: 1855107934}
- {fileID: 532693814}
- {fileID: 526134095}
- {fileID: 1139509439}
- {fileID: 1604482366}
- {fileID: 2040975075}
- {fileID: 2009173633}
m_Father: {fileID: 2069155641}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 1.1312256, y: 278.0066}
m_SizeDelta: {x: -58.334717, y: -523.9868}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1095289320
MonoBehaviour:
@@ -896,12 +896,12 @@ RectTransform:
m_LocalScale: {x: 0.51398, y: 0.51398, z: 0.51398}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 532693814}
m_Father: {fileID: 1095289319}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMin: {x: 0.5, y: 1}
m_AnchorMax: {x: 0.5, y: 1}
m_AnchoredPosition: {x: -2.0579257, y: 5.796509}
m_SizeDelta: {x: 1308.6868, y: 152.45325}
m_AnchoredPosition: {x: -0.9267001, y: -61.1969}
m_SizeDelta: {x: 1308.6868, y: 300.45325}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1139509440
MonoBehaviour:
@@ -973,13 +973,12 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1811707691}
- {fileID: 1731001029}
m_Father: {fileID: 669480396}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 149.13885, y: -75.08316}
m_SizeDelta: {x: -336.5826, y: -117.3596}
m_AnchoredPosition: {x: 149.13885, y: -50.553192}
m_SizeDelta: {x: -336.5826, y: -178.6848}
m_Pivot: {x: 0, y: 1}
--- !u!114 &1157581244
MonoBehaviour:
@@ -1511,11 +1510,11 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1540054263}
m_Father: {fileID: 532693814}
m_Father: {fileID: 1095289319}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 127.25842, y: -74}
m_AnchoredPosition: {x: 157.557, y: -66.99341}
m_SizeDelta: {x: 254.51678, y: 148}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1604482367
@@ -1658,16 +1657,16 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1731001028}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
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: 1157581243}
m_Father: {fileID: 2009173633}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 7.6782227, y: -367.36002}
m_AnchorMin: {x: 0.5, y: 0}
m_AnchorMax: {x: 0.5, y: 0}
m_AnchoredPosition: {x: 0, y: 77}
m_SizeDelta: {x: 706.7024, y: 68.289}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1731001030
@@ -1728,8 +1727,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -0.00012207031}
m_SizeDelta: {x: 0, y: 0.19000244}
m_AnchoredPosition: {x: 0, y: -0.00024414062}
m_SizeDelta: {x: 0, y: -0.0002}
m_Pivot: {x: 0, y: 1}
--- !u!114 &1811707692
MonoBehaviour:
@@ -1746,13 +1745,13 @@ MonoBehaviour:
m_Padding:
m_Left: 0
m_Right: 0
m_Top: 48
m_Top: 0
m_Bottom: 0
m_ChildAlignment: 0
m_ChildAlignment: 3
m_StartCorner: 0
m_StartAxis: 0
m_CellSize: {x: 355, y: 310}
m_Spacing: {x: 30, y: 55}
m_Spacing: {x: 30, y: 25}
m_Constraint: 2
m_ConstraintCount: 2
--- !u!114 &1811707693
@@ -1803,8 +1802,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -1.1312256, y: -278.0066}
m_SizeDelta: {x: 58.334717, y: 523.9868}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1855107935
MonoBehaviour:
@@ -1981,6 +1980,68 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1890794681}
m_CullTransparentMesh: 1
--- !u!1 &2009173632
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 2009173633}
- component: {fileID: 2009173635}
- component: {fileID: 2009173636}
m_Layer: 5
m_Name: SafeArea
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &2009173633
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2009173632}
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:
- {fileID: 526134095}
- {fileID: 1731001029}
m_Father: {fileID: 1095289319}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &2009173635
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2009173632}
m_CullTransparentMesh: 1
--- !u!114 &2009173636
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2009173632}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c97afc556caea1c44969477eb7ddec74, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Crystal.SafeArea
ConformX: 1
ConformY: 1
Logging: 0
--- !u!1 &2040975074
GameObject:
m_ObjectHideFlags: 0
@@ -2013,11 +2074,11 @@ RectTransform:
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1890794682}
m_Father: {fileID: 532693814}
m_Father: {fileID: 1095289319}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -165.81073, y: -75.53757}
m_AnchoredPosition: {x: -193.84686, y: -68.530975}
m_SizeDelta: {x: 473.74487, y: 153.69641}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2040975076

View File

@@ -164,6 +164,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Features.Capture::Darkmatter.Features.Capture.CaptureFeatureModule
captureScale: 1
galleryBackground: {fileID: 2800000, guid: 0c8e208e83531f84cb2b842025cdd232, type: 3}
captureButtonView: {fileID: 376589371}
gallerySaveView: {fileID: 0}
--- !u!1 &64614225
@@ -266,9 +267,9 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 153461768}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.44054, y: 0.44054, z: 0.44054}
m_LocalScale: {x: 0.4093894, y: 0.4093894, z: 0.4093894}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 259035378}
@@ -276,12 +277,12 @@ RectTransform:
- {fileID: 376589367}
- {fileID: 1143672390}
- {fileID: 1340226039}
m_Father: {fileID: 201822947}
m_Father: {fileID: 1950265412}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -189.1037, y: -78.00296}
m_SizeDelta: {x: 3376.3523, y: 2073.1938}
m_SizeDelta: {x: 1456.3523, y: 993.19385}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &153461770
MonoBehaviour:
@@ -312,7 +313,7 @@ MonoBehaviour:
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 0.94
m_PixelsPerUnitMultiplier: 0.81
--- !u!222 &153461771
CanvasRenderer:
m_ObjectHideFlags: 0
@@ -353,9 +354,7 @@ RectTransform:
m_Children:
- {fileID: 892653813}
- {fileID: 1130088199}
- {fileID: 1518670451}
- {fileID: 1989194441}
- {fileID: 153461769}
- {fileID: 1950265412}
m_Father: {fileID: 2069155641}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
@@ -973,6 +972,82 @@ MonoBehaviour:
m_EditorClassIdentifier: Features.GameplayFlow::Darkmatter.Features.GameplayFlow.SceneRefs.GameplaySceneRefs
paperRoot: {fileID: 1143672390}
confetti: {fileID: 1141121867}
--- !u!1 &565686254
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 565686255}
- component: {fileID: 565686257}
- component: {fileID: 565686256}
m_Layer: 5
m_Name: SavingIndicator
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 0
--- !u!224 &565686255
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 565686254}
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:
- {fileID: 993060025}
m_Father: {fileID: 2069155641}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &565686256
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 565686254}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
m_Name:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image
m_Material: {fileID: 0}
m_Color: {r: 0, g: 0, b: 0, a: 0.7607843}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_Sprite: {fileID: 0}
m_Type: 0
m_PreserveAspect: 0
m_FillCenter: 1
m_FillMethod: 4
m_FillAmount: 1
m_FillClockwise: 1
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!222 &565686257
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 565686254}
m_CullTransparentMesh: 1
--- !u!1 &600922870
GameObject:
m_ObjectHideFlags: 0
@@ -1397,6 +1472,143 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 892653812}
m_CullTransparentMesh: 1
--- !u!1 &993060024
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 993060025}
- component: {fileID: 993060027}
- component: {fileID: 993060026}
m_Layer: 5
m_Name: Saving
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &993060025
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 993060024}
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: 565686255}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
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: 897.3912, y: 143.6794}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &993060026
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 993060024}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI
m_Material: {fileID: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_RaycastTarget: 1
m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
m_Maskable: 1
m_OnCullStateChanged:
m_PersistentCalls:
m_Calls: []
m_text: Saving...
m_isRightToLeft: 0
m_fontAsset: {fileID: 11400000, guid: dde468a43b0440f4a9d121fb1d8f290e, type: 2}
m_sharedMaterial: {fileID: -1548830327015913602, guid: dde468a43b0440f4a9d121fb1d8f290e, type: 2}
m_fontSharedMaterials: []
m_fontMaterial: {fileID: 0}
m_fontMaterials: []
m_fontColor32:
serializedVersion: 2
rgba: 4294967295
m_fontColor: {r: 1, g: 1, b: 1, a: 1}
m_enableVertexGradient: 0
m_colorMode: 3
m_fontColorGradient:
topLeft: {r: 1, g: 1, b: 1, a: 1}
topRight: {r: 1, g: 1, b: 1, a: 1}
bottomLeft: {r: 1, g: 1, b: 1, a: 1}
bottomRight: {r: 1, g: 1, b: 1, a: 1}
m_fontColorGradientPreset: {fileID: 0}
m_spriteAsset: {fileID: 0}
m_tintAllSprites: 0
m_StyleSheet: {fileID: 0}
m_TextStyleHashCode: -1183493901
m_overrideHtmlColors: 0
m_faceColor:
serializedVersion: 2
rgba: 4294967295
m_fontSize: 124.7
m_fontSizeBase: 124.7
m_fontWeight: 400
m_enableAutoSizing: 0
m_fontSizeMin: 18
m_fontSizeMax: 72
m_fontStyle: 0
m_HorizontalAlignment: 2
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 0
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
m_horizontalMapping: 0
m_verticalMapping: 0
m_uvLineOffset: 0
m_geometrySortingOrder: 0
m_IsTextObjectScaleStatic: 0
m_VertexBufferAutoSizeReduction: 0
m_useMaxVisibleDescender: 1
m_pageToDisplay: 1
m_margin: {x: 0, y: 0, z: 0, w: 0}
m_isUsingLegacyAnimationComponent: 0
m_isVolumetricText: 0
m_hasFontAssetChanged: 0
m_baseMaterial: {fileID: 0}
m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
--- !u!222 &993060027
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 993060024}
m_CullTransparentMesh: 1
--- !u!1 &1046038182
GameObject:
m_ObjectHideFlags: 0
@@ -1478,10 +1690,10 @@ RectTransform:
- {fileID: 357588034}
m_Father: {fileID: 1518670451}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -58.93701}
m_SizeDelta: {x: 860.093, y: 1956.321}
m_SizeDelta: {x: -191.90698, y: -527.67896}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1129540370
MonoBehaviour:
@@ -2126,10 +2338,10 @@ RectTransform:
- {fileID: 1351490754}
m_Father: {fileID: 1989194441}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 0, y: -82.378}
m_SizeDelta: {x: 860.093, y: 1909.439}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: -82.37799}
m_SizeDelta: {x: -191.90698, y: -574.56104}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1281354569
MonoBehaviour:
@@ -2452,19 +2664,19 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1518670450}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.43461224, y: 0.43461224, z: 0.43461224}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1129540369}
- {fileID: 206970556}
m_Father: {fileID: 201822947}
m_Father: {fileID: 1950265412}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 743.4037, y: 3.8793}
m_SizeDelta: {x: 1051.7537, y: 2502.8}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -216.59631, y: 0.002746582}
m_SizeDelta: {x: 1051.7537, y: 1405}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1518670452
MonoBehaviour:
@@ -2624,6 +2836,69 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Features.Coloring::Darkmatter.Features.Coloring.ColoringFeatureModule
paletteHolderView: {fileID: 1518670454}
--- !u!1 &1950265411
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1950265412}
- component: {fileID: 1950265414}
- component: {fileID: 1950265415}
m_Layer: 5
m_Name: SafeArea
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!224 &1950265412
RectTransform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1950265411}
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:
- {fileID: 1518670451}
- {fileID: 1989194441}
- {fileID: 153461769}
m_Father: {fileID: 201822947}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 0}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!222 &1950265414
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1950265411}
m_CullTransparentMesh: 1
--- !u!114 &1950265415
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1950265411}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c97afc556caea1c44969477eb7ddec74, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::Crystal.SafeArea
ConformX: 1
ConformY: 1
Logging: 0
--- !u!1 &1965442262
GameObject:
m_ObjectHideFlags: 0
@@ -2808,19 +3083,19 @@ RectTransform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1989194440}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 0.43461224, y: 0.43461224, z: 0.43461224}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 1281354568}
- {fileID: 2065186226}
m_Father: {fileID: 201822947}
m_Father: {fileID: 1950265412}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0.5, y: 0.5}
m_AnchorMax: {x: 0.5, y: 0.5}
m_AnchoredPosition: {x: 743.4037, y: 3.8793}
m_SizeDelta: {x: 1051.7537, y: 2502.8}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: -216.59631, y: 0.002746582}
m_SizeDelta: {x: 1051.7537, y: 1405}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1989194442
MonoBehaviour:
@@ -3225,7 +3500,7 @@ RectTransform:
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 1, y: 1}
m_AnchoredPosition: {x: 0, y: 0}
m_SizeDelta: {x: 0, y: 33}
m_SizeDelta: {x: 0, y: 5}
m_Pivot: {x: 0, y: 1}
--- !u!114 &2046672213
MonoBehaviour:
@@ -3261,8 +3536,8 @@ MonoBehaviour:
m_ChildAlignment: 0
m_StartCorner: 0
m_StartAxis: 0
m_CellSize: {x: 305, y: 305}
m_Spacing: {x: 25, y: 12}
m_CellSize: {x: 300, y: 250}
m_Spacing: {x: 25, y: 40}
m_Constraint: 0
m_ConstraintCount: 2
--- !u!1 &2058063737
@@ -3604,6 +3879,7 @@ RectTransform:
m_Children:
- {fileID: 201822947}
- {fileID: 2022514148}
- {fileID: 565686255}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}

View File

@@ -5496,8 +5496,8 @@ RectTransform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 1, y: 0}
m_AnchorMax: {x: 1, y: 0}
m_AnchoredPosition: {x: -596, y: 455}
m_SizeDelta: {x: 1301.0911, y: 647.6729}
m_AnchoredPosition: {x: -623.27, y: 455}
m_SizeDelta: {x: 1246.5, y: 647.6729}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &626851217
MonoBehaviour: