From 11d88c146c7b4915ac83e8d1aca4b8c316590240 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 8 Jul 2026 15:20:53 +0800 Subject: [PATCH 01/47] =?UTF-8?q?feat(log-kit):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=97=A5=E5=BF=97=E7=B3=BB=E7=BB=9F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=BC=82=E6=AD=A5=E7=BB=93=E6=9E=84=E5=8C=96=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 使用 ConcurrentQueue + 后台线程批量写入 - 新增 LogLevel、LogCategory、LogEntry、LogFormatter - 新增 GameLog 业务日志入口 - 新增 LogSettingsProfiles 平台化配置 - 支持按 session 分文件、大小轮转与队列满时低优先级丢弃 --- Assets/Scripts/Framework/LogKit/FileLogger.cs | 309 ++++++++++---- Assets/Scripts/Framework/LogKit/LogKit.cs | 386 ++++++++++++++++-- .../Framework/LogKit/LogSettingsProfiles.cs | 143 +++++++ .../LogKit/LogSettingsProfiles.cs.meta | 11 + 4 files changed, 747 insertions(+), 102 deletions(-) create mode 100644 Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs create mode 100644 Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs.meta diff --git a/Assets/Scripts/Framework/LogKit/FileLogger.cs b/Assets/Scripts/Framework/LogKit/FileLogger.cs index 0928211e3..b47048ba9 100644 --- a/Assets/Scripts/Framework/LogKit/FileLogger.cs +++ b/Assets/Scripts/Framework/LogKit/FileLogger.cs @@ -1,107 +1,260 @@ using System; +using System.Collections.Concurrent; +using System.Collections.Generic; using System.IO; +using System.Text; +using System.Threading; namespace AibisDream.Kit { - internal class FileLogger + internal sealed class FileLogger { - private StreamWriter _fileWriter; + private readonly ConcurrentQueue _queue = new(); + private readonly AutoResetEvent _wakeEvent = new(false); + private readonly ManualResetEventSlim _drainedEvent = new(true); + private readonly List _batch = new(); + private readonly string _directory; + private readonly LogSettings _settings; + private readonly Thread _worker; + private readonly object _writerLock = new(); - private readonly string _filename; - private readonly string _filePath; - private readonly int _saveDays; + private volatile bool _isRunning = true; + private StreamWriter _writer; + private string _currentFilePath; + private long _currentFileBytes; + private int _queuedCount; + private int _droppedLowPriorityCount; - private static string CurrentDay => DateTime.Now.ToString("yyyyMMdd"); - private string _currentLogDay; - private string _preSavePath; + public string CurrentFilePath => _currentFilePath; - /// - /// 开始打印 - /// - public FileLogger(string filename, string filePath, int saveDays, string version = null) + public FileLogger(string directory, LogSettings settings) { - _filename = filename; - _filePath = filePath.TrimEnd('/') + "/"; - _saveDays = saveDays; - StartNewFile(); - DeleteOldFile(); - _currentLogDay = CurrentDay; - - // 在日志开头写入版本号信息 - if (!string.IsNullOrEmpty(version)) + _directory = directory; + _settings = settings ?? LogSettings.CreateDefault(); + Directory.CreateDirectory(_directory); + DeleteOldFiles(); + OpenNewFile(); + + _worker = new Thread(WriterLoop) { - Write($"Version: {version}\n"); - } - - Write("*********************************************************\nSystem Start at " + - DateTime.Now.ToString("HH:mm:ss") + - "\n*********************************************************\n"); - } - - /// - /// 新建文件 - /// - private void StartNewFile() - { - if (_fileWriter != null) - { - _fileWriter.Close(); - _fileWriter.Dispose(); - } - - _fileWriter = null; - - if (!Directory.Exists(_filePath)) - { - Directory.CreateDirectory(_filePath); - } - - _fileWriter = File.AppendText(_filePath + string.Format(_filename, DateTime.Now)); - _fileWriter.AutoFlush = true; // 启用自动刷新,实现流式写入 + IsBackground = true, + Name = "AIBIS File Logger" + }; + _worker.Start(); } public void Write(string content) { - System.Globalization.CultureInfo.CurrentCulture.ClearCachedData(); - if (_currentLogDay != CurrentDay) - { - StartNewFile(); - DeleteOldFile(); - _currentLogDay = CurrentDay; - } - - if (_fileWriter is { BaseStream: { CanWrite: true } }) - _fileWriter.WriteLine(content); + Write(LogEntry.System(LogLevel.Info, LogCategory.General, content)); } - void DeleteOldFile() + public void Write(LogEntry entry) { - var fileList = Directory.GetFiles(_filePath); - if (fileList.Length > _saveDays) + if (!_isRunning || !_settings.ShouldWrite(entry.Level)) + return; + + if (TryEnqueue(entry)) { - _preSavePath = _filePath + string.Format(this._filename, DateTime.Now.AddDays(-_saveDays + 1)); - foreach (var t in fileList) - { - if (string.CompareOrdinal(_preSavePath, t) == 1) - { - File.Delete(t); - } - } + if (entry.Level >= LogLevel.Error) + _wakeEvent.Set(); + return; + } + + if (entry.Level < LogLevel.Error) + Interlocked.Increment(ref _droppedLowPriorityCount); + } + + public void Flush(TimeSpan timeout) + { + _wakeEvent.Set(); + _drainedEvent.Wait(timeout); + + lock (_writerLock) + { + _writer?.Flush(); } } public void OnDestroy() { - if (_fileWriter == null) + _isRunning = false; + _wakeEvent.Set(); + + if (!_worker.Join(_settings.ShutdownDrainMilliseconds)) + Flush(TimeSpan.FromMilliseconds(_settings.ShutdownDrainMilliseconds)); + + lock (_writerLock) + { + _writer?.Flush(); + _writer?.Dispose(); + _writer = null; + } + + if (!_worker.IsAlive) + { + _wakeEvent.Dispose(); + _drainedEvent.Dispose(); + } + } + + private bool TryEnqueue(LogEntry entry) + { + while (true) + { + var current = Volatile.Read(ref _queuedCount); + if (current >= _settings.QueueCapacity && entry.Level < LogLevel.Error) + return false; + + if (Interlocked.CompareExchange(ref _queuedCount, current + 1, current) == current) + break; + } + + _drainedEvent.Reset(); + _queue.Enqueue(entry); + _wakeEvent.Set(); + return true; + } + + private void WriterLoop() + { + while (_isRunning || !_queue.IsEmpty) + { + _wakeEvent.WaitOne(_settings.FlushIntervalMilliseconds); + DrainQueue(); + } + + DrainQueue(); + } + + private void DrainQueue() + { + _batch.Clear(); + while (_batch.Count < _settings.BatchSize && _queue.TryDequeue(out var entry)) + { + Interlocked.Decrement(ref _queuedCount); + _batch.Add(entry); + } + + var dropped = Interlocked.Exchange(ref _droppedLowPriorityCount, 0); + if (dropped > 0) + { + _batch.Add(LogEntry.System( + LogLevel.Warning, + LogCategory.General, + $"Dropped {dropped} low-priority log entries because the queue was full.")); + } + + if (_batch.Count == 0) + { + if (_queue.IsEmpty) + _drainedEvent.Set(); + return; + } + + lock (_writerLock) + { + foreach (var entry in _batch) + { + WriteEntry(entry); + } + + _writer?.Flush(); + } + + if (!_queue.IsEmpty) + _wakeEvent.Set(); + + if (_queue.IsEmpty) + _drainedEvent.Set(); + } + + private void WriteEntry(LogEntry entry) + { + try + { + var line = LogFormatter.Format(entry); + var byteCount = Encoding.UTF8.GetByteCount(line) + Environment.NewLine.Length; + if (_currentFileBytes + byteCount > _settings.MaxFileBytes) + OpenNewFile(); + + _writer.WriteLine(line); + _currentFileBytes += byteCount; + } + catch + { + _isRunning = false; + } + } + + private void OpenNewFile() + { + _writer?.Flush(); + _writer?.Dispose(); + + var timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); + var platform = _settings.Platform; + var sessionId = _settings.SessionId; + var baseFileName = $"{timestamp}_{platform}_v{_settings.AppVersion}_session-{sessionId}"; + _currentFilePath = BuildUniquePath(baseFileName); + + _writer = new StreamWriter(new FileStream(_currentFilePath, FileMode.CreateNew, FileAccess.Write, FileShare.Read), Encoding.UTF8) + { + AutoFlush = false + }; + _currentFileBytes = 0; + DeleteOldFiles(); + } + + private void DeleteOldFiles() + { + var directory = new DirectoryInfo(_directory); + if (!directory.Exists) return; - Write("*********************************************************\nSystem Shutdown at " + - DateTime.Now.ToString("HH:mm:ss") + - "\n*********************************************************\n"); + var files = directory.GetFiles("*.log"); + Array.Sort(files, (a, b) => b.LastWriteTimeUtc.CompareTo(a.LastWriteTimeUtc)); - _fileWriter.Flush(); - _fileWriter.Close(); - _fileWriter = null; + long totalBytes = 0; + for (var i = 0; i < files.Length; i++) + { + totalBytes += files[i].Length; + var shouldDelete = i >= _settings.MaxSessionFiles || totalBytes > _settings.MaxTotalBytes; + if (!shouldDelete) + continue; + + try + { + files[i].Delete(); + } + catch + { + // Best-effort cleanup only. + } + } + } + + private static string SanitizeFileName(string fileName) + { + foreach (var invalid in Path.GetInvalidFileNameChars()) + { + fileName = fileName.Replace(invalid, '_'); + } + + return fileName; + } + + private string BuildUniquePath(string baseFileName) + { + var safeBase = SanitizeFileName(baseFileName); + var path = Path.Combine(_directory, safeBase + ".log"); + var index = 1; + while (File.Exists(path)) + { + path = Path.Combine(_directory, $"{safeBase}_{index}.log"); + index++; + } + + return path; } } -} \ No newline at end of file +} diff --git a/Assets/Scripts/Framework/LogKit/LogKit.cs b/Assets/Scripts/Framework/LogKit/LogKit.cs index 2d2006493..386b157f9 100644 --- a/Assets/Scripts/Framework/LogKit/LogKit.cs +++ b/Assets/Scripts/Framework/LogKit/LogKit.cs @@ -1,54 +1,88 @@ using System; -using UnityEngine; +using System.Text; +using System.Threading; using AibisDream.Utility; +using UnityEngine; +using UnityEngine.SceneManagement; namespace AibisDream.Kit { /// - /// 真机文件日志:拦截 输出并写入 。 - /// Editor 与 Android 不启用。 + /// Runtime file logging entry point. Captures Unity logs and routes them through + /// an asynchronous file writer so mobile builds do not block on every log line. /// internal static class LogKit { - /// - /// 文件名称格式 - /// 请注意,不要删除时间格式,否则会造成保存不成功 - /// - public static string LogFileName => "Log{0:_yyyy_MM_dd}.txt"; - - /// - /// 日志保存最近几天的内容 - /// public const int SaveDays = 30; - /// - /// 每一行的打印内容 - /// - private static string LogContent => Time + ": {0}\n{1}"; - private static FileLogger _fileLogger; + private static LogSettings _settings; private static bool _isInitialized; + private static bool _isForwardingToUnity; - private static string Time => DateTime.Now.ToString("[HH:mm:ss.fffd]"); + internal static bool IsInitialized => _isInitialized; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void Initialize() { -#if !UNITY_EDITOR && !UNITY_ANDROID if (_isInitialized) return; - _fileLogger = new FileLogger(LogFileName, ConstRef.LogFilePath, SaveDays); - LogMessage($"Ver.{Application.version}", "", LogType.Log); + _settings = LogSettings.CreateDefault(); + if (!_settings.Enabled) + return; + + LogEntry.SetMainThreadId(Thread.CurrentThread.ManagedThreadId); + _fileLogger = new FileLogger(ConstRef.LogFilePath, _settings); + _fileLogger.Write(LogEntry.System(LogLevel.Info, LogCategory.General, BuildStartupHeader())); + Application.logMessageReceivedThreaded += LogMessage; Application.quitting += Shutdown; + Application.focusChanged += OnFocusChanged; _isInitialized = true; -#endif + } + + internal static void Write(LogEntry entry) + { + if (!_isInitialized || _fileLogger == null) + return; + + _fileLogger.Write(entry); + } + + internal static void ForwardToUnity(Action logAction) + { + if (logAction == null) + return; + + _isForwardingToUnity = true; + try + { + logAction.Invoke(); + } + finally + { + _isForwardingToUnity = false; + } + } + + internal static bool ShouldWriteToConsole(LogLevel level) + { + return _settings == null || _settings.EchoToConsole && level >= _settings.ConsoleMinLevel; } private static void LogMessage(string condition, string stackTrace, LogType type) { - _fileLogger?.Write(string.Format(LogContent, condition, stackTrace)); + if (_isForwardingToUnity) + return; + + Write(LogEntry.FromUnity(condition, stackTrace, type, _settings.ShouldIncludeStackTrace)); + } + + private static void OnFocusChanged(bool hasFocus) + { + if (!hasFocus) + _fileLogger?.Flush(TimeSpan.FromMilliseconds(_settings?.ShutdownDrainMilliseconds ?? 500)); } private static void Shutdown() @@ -58,9 +92,313 @@ namespace AibisDream.Kit Application.logMessageReceivedThreaded -= LogMessage; Application.quitting -= Shutdown; + Application.focusChanged -= OnFocusChanged; + + _fileLogger?.Write(LogEntry.System(LogLevel.Info, LogCategory.General, "System shutdown.")); _fileLogger?.OnDestroy(); _fileLogger = null; _isInitialized = false; } + + private static string BuildStartupHeader() + { + return string.Join( + " | ", + "System start", + $"version={Application.version}", + $"platform={Application.platform}", + $"unity={Application.unityVersion}", + $"device={SystemInfo.deviceModel}", + $"os={SystemInfo.operatingSystem}", + $"graphics={SystemInfo.graphicsDeviceName}", + $"maxTexture={SystemInfo.maxTextureSize}", + $"memory={SystemInfo.systemMemorySize}MB"); + } } -} \ No newline at end of file + + public enum LogLevel + { + Debug = 0, + Info = 1, + Warning = 2, + Error = 3, + Fatal = 4 + } + + public enum LogCategory + { + General, + Unity, + Save, + Yarn, + Resource, + Scene, + UI, + Audio, + FixSystem, + MiniGame + } + + public static class GameLog + { + public static void Debug(LogCategory category, string message, string context = null) + { + Write(LogLevel.Debug, category, message, context, null); + } + + public static void Info(LogCategory category, string message, string context = null) + { + Write(LogLevel.Info, category, message, context, null); + } + + public static void Warn(LogCategory category, string message, string context = null) + { + Write(LogLevel.Warning, category, message, context, null); + } + + public static void Error(LogCategory category, string message, string context = null) + { + Write(LogLevel.Error, category, message, context, null); + } + + public static void Exception(LogCategory category, Exception exception, string context = null) + { + var message = exception == null ? "Unknown exception" : exception.Message; + Write(LogLevel.Error, category, message, context, exception); + } + + private static void Write(LogLevel level, LogCategory category, string message, string context, Exception exception) + { + var entry = LogEntry.FromGame(level, category, message, context, exception); + LogKit.Write(entry); + + if (!LogKit.ShouldWriteToConsole(level)) + return; + + var consoleMessage = $"[{category}] {message}"; + if (!string.IsNullOrEmpty(context)) + consoleMessage += $" | {context}"; + + LogKit.ForwardToUnity(() => + { + if (exception != null) + { + UnityEngine.Debug.LogException(exception); + return; + } + + switch (level) + { + case LogLevel.Warning: + UnityEngine.Debug.LogWarning(consoleMessage); + break; + case LogLevel.Error: + case LogLevel.Fatal: + UnityEngine.Debug.LogError(consoleMessage); + break; + default: + UnityEngine.Debug.Log(consoleMessage); + break; + } + }); + } + } + + internal sealed class LogSettings + { + public bool Enabled { get; private set; } + public bool EchoToConsole { get; private set; } + public LogLevel MinLevel { get; private set; } + public LogLevel ConsoleMinLevel { get; private set; } + public int QueueCapacity { get; private set; } + public int BatchSize { get; private set; } + public int FlushIntervalMilliseconds { get; private set; } + public int ShutdownDrainMilliseconds { get; private set; } + public long MaxFileBytes { get; private set; } + public long MaxTotalBytes { get; private set; } + public int MaxSessionFiles { get; private set; } + public bool IncludeWarningStackTrace { get; private set; } + public string SessionId { get; private set; } + public string AppVersion { get; private set; } + public string Platform { get; private set; } + + public static string PlatformName + { + get + { +#if UNITY_ANDROID + return "android"; +#elif UNITY_STANDALONE_WIN + return "windows"; +#elif UNITY_STANDALONE_OSX + return "mac"; +#elif UNITY_STANDALONE_LINUX + return "linux"; +#else + return UnityEngine.Application.platform.ToString().ToLowerInvariant(); +#endif + } + } + + public bool ShouldWrite(LogLevel level) + { + return Enabled && level >= MinLevel; + } + + public bool ShouldIncludeStackTrace(LogLevel level) + { + return level >= LogLevel.Error || IncludeWarningStackTrace && level == LogLevel.Warning; + } + + public static LogSettings CreateDefault() + { + return Create(LogSettingsProfiles.Current); + } + + private static LogSettings Create(LogSettingsProfile profile) + { + return new LogSettings + { + Enabled = profile.Enabled, + EchoToConsole = profile.EchoToConsole, + MinLevel = profile.MinLevel, + ConsoleMinLevel = profile.ConsoleMinLevel, + QueueCapacity = profile.QueueCapacity, + BatchSize = profile.BatchSize, + FlushIntervalMilliseconds = profile.FlushIntervalMilliseconds, + ShutdownDrainMilliseconds = profile.ShutdownDrainMilliseconds, + MaxFileBytes = profile.MaxFileBytes, + MaxTotalBytes = profile.MaxTotalBytes, + MaxSessionFiles = profile.MaxSessionFiles, + IncludeWarningStackTrace = profile.IncludeWarningStackTrace, + SessionId = Guid.NewGuid().ToString("N").Substring(0, 8), + AppVersion = UnityEngine.Application.version, + Platform = PlatformName + }; + } + } + + internal readonly struct LogEntry + { + private static int _mainThreadId; + + public readonly DateTime TimestampUtc; + public readonly LogLevel Level; + public readonly LogCategory Category; + public readonly string Message; + public readonly string StackTrace; + public readonly string Context; + public readonly string SceneName; + public readonly int FrameCount; + public readonly int ThreadId; + + private LogEntry(LogLevel level, LogCategory category, string message, string stackTrace, string context) + { + TimestampUtc = DateTime.UtcNow; + Level = level; + Category = category; + Message = message ?? string.Empty; + StackTrace = stackTrace ?? string.Empty; + Context = context ?? string.Empty; + var isMainThread = Thread.CurrentThread.ManagedThreadId == _mainThreadId; + SceneName = isMainThread ? GetSceneName() : string.Empty; + FrameCount = isMainThread ? Time.frameCount : -1; + ThreadId = Thread.CurrentThread.ManagedThreadId; + } + + public static void SetMainThreadId(int threadId) + { + _mainThreadId = threadId; + } + + public static LogEntry System(LogLevel level, LogCategory category, string message) + { + return new LogEntry(level, category, message, string.Empty, string.Empty); + } + + public static LogEntry FromUnity(string condition, string stackTrace, LogType type, Func shouldIncludeStackTrace) + { + var level = ToLogLevel(type); + var stack = shouldIncludeStackTrace != null && shouldIncludeStackTrace(level) ? stackTrace : string.Empty; + return new LogEntry(level, LogCategory.Unity, condition, stack, string.Empty); + } + + public static LogEntry FromGame(LogLevel level, LogCategory category, string message, string context, Exception exception) + { + var stack = exception == null ? string.Empty : exception.ToString(); + return new LogEntry(level, category, message, stack, context); + } + + private static LogLevel ToLogLevel(LogType type) + { + switch (type) + { + case LogType.Warning: + return LogLevel.Warning; + case LogType.Error: + return LogLevel.Error; + case LogType.Exception: + case LogType.Assert: + return LogLevel.Fatal; + default: + return LogLevel.Info; + } + } + + private static string GetSceneName() + { + try + { + return SceneManager.GetActiveScene().name; + } + catch + { + return string.Empty; + } + } + } + + internal static class LogFormatter + { + public static string Format(LogEntry entry) + { + var builder = new StringBuilder(256); + builder.Append(entry.TimestampUtc.ToString("O")); + builder.Append(" | "); + builder.Append(entry.Level); + builder.Append(" | "); + builder.Append(entry.Category); + builder.Append(" | scene="); + builder.Append(Escape(entry.SceneName)); + builder.Append(" | frame="); + builder.Append(entry.FrameCount); + builder.Append(" | thread="); + builder.Append(entry.ThreadId); + + if (!string.IsNullOrEmpty(entry.Context)) + { + builder.Append(" | context="); + builder.Append(Escape(entry.Context)); + } + + builder.Append(" | "); + builder.Append(Escape(entry.Message)); + + if (!string.IsNullOrEmpty(entry.StackTrace)) + { + builder.Append(" | stack="); + builder.Append(Escape(entry.StackTrace)); + } + + return builder.ToString(); + } + + private static string Escape(string value) + { + if (string.IsNullOrEmpty(value)) + return string.Empty; + + return value.Replace("\r", "\\r").Replace("\n", "\\n"); + } + } +} diff --git a/Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs b/Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs new file mode 100644 index 000000000..12c6a83f1 --- /dev/null +++ b/Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs @@ -0,0 +1,143 @@ +namespace AibisDream.Kit +{ + internal readonly struct LogSettingsProfile + { + public readonly bool Enabled; + public readonly bool EchoToConsole; + public readonly LogLevel MinLevel; + public readonly LogLevel ConsoleMinLevel; + public readonly int QueueCapacity; + public readonly int BatchSize; + public readonly int FlushIntervalMilliseconds; + public readonly int ShutdownDrainMilliseconds; + public readonly long MaxFileBytes; + public readonly long MaxTotalBytes; + public readonly int MaxSessionFiles; + public readonly bool IncludeWarningStackTrace; + + public LogSettingsProfile( + bool enabled, + bool echoToConsole, + LogLevel minLevel, + LogLevel consoleMinLevel, + int queueCapacity, + int batchSize, + int flushIntervalMilliseconds, + int shutdownDrainMilliseconds, + long maxFileBytes, + long maxTotalBytes, + int maxSessionFiles, + bool includeWarningStackTrace) + { + Enabled = enabled; + EchoToConsole = echoToConsole; + MinLevel = minLevel; + ConsoleMinLevel = consoleMinLevel; + QueueCapacity = queueCapacity; + BatchSize = batchSize; + FlushIntervalMilliseconds = flushIntervalMilliseconds; + ShutdownDrainMilliseconds = shutdownDrainMilliseconds; + MaxFileBytes = maxFileBytes; + MaxTotalBytes = maxTotalBytes; + MaxSessionFiles = maxSessionFiles; + IncludeWarningStackTrace = includeWarningStackTrace; + } + } + + internal static class LogSettingsProfiles + { + private const long Megabyte = 1024L * 1024L; + + public static LogSettingsProfile Current + { + get + { +#if UNITY_EDITOR + return Editor; +#elif UNITY_ANDROID +#if DEVELOPMENT_BUILD + return AndroidDevelopment; +#else + return AndroidRelease; +#endif +#else +#if DEVELOPMENT_BUILD + return StandaloneDevelopment; +#else + return StandaloneRelease; +#endif +#endif + } + } + + private static LogSettingsProfile Editor => new LogSettingsProfile( + enabled: false, + echoToConsole: true, + minLevel: LogLevel.Info, + consoleMinLevel: LogLevel.Debug, + queueCapacity: 2048, + batchSize: 128, + flushIntervalMilliseconds: 1000, + shutdownDrainMilliseconds: 1000, + maxFileBytes: 10L * Megabyte, + maxTotalBytes: 100L * Megabyte, + maxSessionFiles: 20, + includeWarningStackTrace: false); + + private static LogSettingsProfile AndroidDevelopment => new LogSettingsProfile( + enabled: true, + echoToConsole: true, + minLevel: LogLevel.Info, + consoleMinLevel: LogLevel.Debug, + queueCapacity: 1024, + batchSize: 64, + flushIntervalMilliseconds: 1500, + shutdownDrainMilliseconds: 1000, + maxFileBytes: 5L * Megabyte, + maxTotalBytes: 30L * Megabyte, + maxSessionFiles: 6, + includeWarningStackTrace: false); + + private static LogSettingsProfile AndroidRelease => new LogSettingsProfile( + enabled: true, + echoToConsole: true, + minLevel: LogLevel.Warning, + consoleMinLevel: LogLevel.Warning, + queueCapacity: 1024, + batchSize: 64, + flushIntervalMilliseconds: 1500, + shutdownDrainMilliseconds: 1000, + maxFileBytes: 5L * Megabyte, + maxTotalBytes: 30L * Megabyte, + maxSessionFiles: 6, + includeWarningStackTrace: false); + + private static LogSettingsProfile StandaloneDevelopment => new LogSettingsProfile( + enabled: true, + echoToConsole: true, + minLevel: LogLevel.Info, + consoleMinLevel: LogLevel.Debug, + queueCapacity: 2048, + batchSize: 128, + flushIntervalMilliseconds: 1000, + shutdownDrainMilliseconds: 1000, + maxFileBytes: 10L * Megabyte, + maxTotalBytes: 100L * Megabyte, + maxSessionFiles: 20, + includeWarningStackTrace: false); + + private static LogSettingsProfile StandaloneRelease => new LogSettingsProfile( + enabled: true, + echoToConsole: true, + minLevel: LogLevel.Info, + consoleMinLevel: LogLevel.Info, + queueCapacity: 2048, + batchSize: 128, + flushIntervalMilliseconds: 1000, + shutdownDrainMilliseconds: 1000, + maxFileBytes: 10L * Megabyte, + maxTotalBytes: 100L * Megabyte, + maxSessionFiles: 20, + includeWarningStackTrace: false); + } +} diff --git a/Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs.meta b/Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs.meta new file mode 100644 index 000000000..5e6e167b5 --- /dev/null +++ b/Assets/Scripts/Framework/LogKit/LogSettingsProfiles.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a8f67c393a6748d3aa8c6fd4a05d34a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: From 0265de117a1d697cb3e81d36286eaf7671b673f5 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 8 Jul 2026 15:21:05 +0800 Subject: [PATCH 02/47] =?UTF-8?q?docs(log-kit):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E7=B3=BB=E7=BB=9F=E6=94=B9=E8=BF=9B=E7=95=99?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 记录背景、已完成内容、文件格式、平台默认配置 - 说明 GameLog 用法与后续待补足项 --- Docs/日志系统改进留档.md | 164 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 Docs/日志系统改进留档.md diff --git a/Docs/日志系统改进留档.md b/Docs/日志系统改进留档.md new file mode 100644 index 000000000..ecc2a085a --- /dev/null +++ b/Docs/日志系统改进留档.md @@ -0,0 +1,164 @@ +# 日志系统改进留档 + +## 背景与目的 + +旧日志系统直接订阅 Unity 日志回调,把 `Debug.*` 输出同步写入文件。这个实现有几个明显问题: + +- 每条日志同步 `WriteLine`,并且 `AutoFlush = true`,移动端写盘成本容易造成卡顿。 +- Android 因性能问题被编译条件直接禁用文件日志,真机问题缺少可追踪依据。 +- 日志格式只接近“控制台文本转储”,缺少等级、分类、场景、帧号、线程、会话等排查信息。 +- 文件按天追加,同一天多次启动会混在一起,不利于定位一次具体测试或玩家反馈。 +- `Application.logMessageReceivedThreaded` 可能从多线程进入,但旧实现直接操作同一个 `StreamWriter`,线程安全不足。 + +本次改进目标是建立一套可以在 PC 与 Android 都安全启用的轻量文件日志系统:降低写盘卡顿风险,保留 Unity 日志兼容入口,并为后续业务结构化日志打基础。 + +## 已完成内容 + +核心代码位于 `Assets/Scripts/Framework/LogKit/`: + +- `LogKit.cs` + - 保留运行时自动初始化入口。 + - 继续订阅 `Application.logMessageReceivedThreaded`,捕获旧有 `Debug.Log/Warning/Error`。 + - 新增 `GameLog` 业务日志入口,支持按 `LogCategory` 分类输出。 + - 新增 `LogLevel`、`LogCategory`、`LogEntry`、`LogFormatter`,把日志记录转换为结构化文本行。 + - 应用失焦和退出时触发 flush,降低日志丢失概率。 + +- `FileLogger.cs` + - 从同步写文件改为线程安全队列 + 后台线程批量写入。 + - 关闭每条日志 `AutoFlush`,改为批量 flush。 + - 队列满时丢弃低优先级日志,并记录 dropped count。 + - `Error` 及以上等级优先保留。 + - 按 session 创建日志文件,并支持大小轮转、总大小/文件数量保留。 + - 日志写入器内部异常静默降级,避免日志系统自身递归刷错误。 + +- `LogSettingsProfiles.cs` + - 将平台配置从 `LogKit.cs` 中抽离为轻量 C# profile。 + - 不使用 JSON、StreamingAssets 或 ScriptableObject,避免额外资源加载和 Unity asset 依赖。 + - 当前 profile 包括 `Editor`、`AndroidDevelopment`、`AndroidRelease`、`StandaloneDevelopment`、`StandaloneRelease`。 + +## 日志文件与格式 + +日志目录仍使用 `ConstRef.LogFilePath`,即 `Application.persistentDataPath/LogFile`。 + +文件按启动会话生成,命名格式类似: + +```text +20260708_153012_android_v1.2.0_session-abcd1234.log +``` + +单行日志包含: + +```text +timestamp | level | category | scene | frame | thread | context | message | stack +``` + +说明: + +- `timestamp` 使用 UTC ISO 格式。 +- `category` 可区分 Unity 捕获日志和业务系统日志。 +- 非主线程日志不会读取 Unity 场景和帧号,避免在线程回调中访问 Unity 主线程 API。 +- 普通日志默认不写堆栈;`Error/Exception/Assert` 写入堆栈。 + +## 平台默认配置 + +当前配置集中在 `LogSettingsProfiles.cs`。 + +### Editor + +- 默认不写文件日志。 +- 仍保留 Unity Console 的正常输出。 + +### Android Development + +- 文件日志启用。 +- 最低等级:`Info`。 +- 队列容量:`1024`。 +- 批量写入:`64` 条。 +- Flush 间隔:`1500ms`。 +- 单文件上限:`5MB`。 +- 总保留上限:`30MB`。 +- Session 文件保留:`6` 个。 + +### Android Release + +- 文件日志启用。 +- 最低等级:`Warning`。 +- Console 最低等级:`Warning`。 +- 其余写入参数与 Android Development 保持一致。 + +### Standalone Development / Release + +- 文件日志启用。 +- Development 最低等级:`Info`,Console 最低等级:`Debug`。 +- Release 最低等级:`Info`,Console 最低等级:`Info`。 +- 队列容量:`2048`。 +- 批量写入:`128` 条。 +- Flush 间隔:`1000ms`。 +- 单文件上限:`10MB`。 +- 总保留上限:`100MB`。 +- Session 文件保留:`20` 个。 + +## 如何使用 + +旧代码中的 `Debug.Log/Warning/Error` 不需要立刻迁移,仍会被捕获到文件日志。 + +新代码或关键链路建议使用 `GameLog`: + +```csharp +GameLog.Info(LogCategory.Save, "Auto save completed", "slot=0"); +GameLog.Warn(LogCategory.Resource, "Addressable load slow", "key=Scene/ClinicOut"); +GameLog.Error(LogCategory.Yarn, "Node missing", "node=Start"); +``` + +优先迁移高价值排查链路,而不是一次性替换全项目日志: + +- 存档/读档:`SaveRestoreOrchestrator`、`SaveSystem` +- 对话:`DialogController`、Yarn node 进入/退出 +- 资源:`ResourceSystem`、`SceneResourceLoader` +- 场景:`SceneLoader` +- 维修系统入口:`FixSystemCenter` + +## 已验证内容 + +本次实现后已执行: + +```bash +git diff --check -- Assembly-CSharp.csproj Assets/Scripts/Framework/LogKit +dotnet build Assembly-CSharp.csproj --no-restore +``` + +结果: + +- 空白检查通过。 +- `Assembly-CSharp.csproj` 构建通过,0 个错误。 +- 构建中的 warning 为项目既有 warning,与日志系统改动无关。 + +## 仍需补足 + +后续建议按优先级补足以下内容: + +1. Android 真机压测 + - 在 Android Development build 中压测高频 `Debug.Log`。 + - 对比启用日志前后的帧率和卡顿尖刺。 + - 验证切后台、返回、退出时日志能正常 flush。 + +2. 关键业务链路迁移到 `GameLog` + - 先迁移 Save、Resource、Dialog、Scene 这些排查价值最高的系统。 + - 不建议批量替换所有旧 `Debug.Log`,避免制造无意义 diff。 + +3. 重复日志限流 + - 当前已有队列满时低等级丢弃机制。 + - 仍可补充同一 message 短时间重复出现时的合并策略,减少高频系统刷屏。 + +4. 日志导出入口 + - 增加获取当前日志目录或当前 session 日志路径的 API。 + - 后续可接入设置界面或测试菜单,方便测试人员导出日志。 + +5. 配置开关扩展 + - 当前 profile 是代码内固定配置。 + - 如果未来测试需要临时打开 Release `Info` 日志,可考虑增加启动参数、调试菜单或本地轻量覆盖开关。 + +6. Unity 工程文件同步 + - 本次为了命令行构建验证,手动把 `LogSettingsProfiles.cs` 加入了 `Assembly-CSharp.csproj`。 + - Unity 重新生成工程文件时可能覆盖 `.csproj`,这是 Unity 生成文件的正常行为;源码和 `.meta` 才是长期留档重点。 + From 0babb520de12e0d8f6ddcceb74df12f168054eb7 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 8 Jul 2026 15:21:13 +0800 Subject: [PATCH 03/47] =?UTF-8?q?yarn(dialog):=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E7=81=AB=E5=B1=B1=20Stage2=20=E8=AF=AD=E8=A8=80=E6=A0=87?= =?UTF-8?q?=E7=AD=BE=E4=B8=8E=E8=BF=90=E7=AE=97=E7=AC=A6=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将 baseLanguage 从 zh-CHS 修正为 zh-Hans - 补全 $TaskToDo 减法运算符两侧空格 --- Assets/Yarn/FP/FP_Huoshan1/FP_Huoshan1.yarnproject | 2 +- Assets/Yarn/FP/FP_Huoshan1/Stage2.yarn | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Assets/Yarn/FP/FP_Huoshan1/FP_Huoshan1.yarnproject b/Assets/Yarn/FP/FP_Huoshan1/FP_Huoshan1.yarnproject index 554513792..c0a27ac66 100644 --- a/Assets/Yarn/FP/FP_Huoshan1/FP_Huoshan1.yarnproject +++ b/Assets/Yarn/FP/FP_Huoshan1/FP_Huoshan1.yarnproject @@ -8,6 +8,6 @@ "./Samples/Yarn Spinner*/*" ], "localisation": {}, - "baseLanguage": "zh-CHS", + "baseLanguage": "zh-Hans", "compilerOptions": {} } \ No newline at end of file diff --git a/Assets/Yarn/FP/FP_Huoshan1/Stage2.yarn b/Assets/Yarn/FP/FP_Huoshan1/Stage2.yarn index 0dbe8d693..980dcd44c 100644 --- a/Assets/Yarn/FP/FP_Huoshan1/Stage2.yarn +++ b/Assets/Yarn/FP/FP_Huoshan1/Stage2.yarn @@ -355,7 +355,7 @@ SpeakerModule: 已与表达模块建立连接! #line:027b73c me:看起来表达模块正常了 #line:001972a <> <> - <> + <> <> <> <> @@ -455,7 +455,7 @@ SaleModule: 已与销售模块建立连接! #line:0448f12 me:波形分布恢复正常了 #line:06ec20b <> <> - <> + <> <> <> <> From a305e5ef4256b290e6aec73d652afefd88079423 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 8 Jul 2026 15:21:18 +0800 Subject: [PATCH 04/47] =?UTF-8?q?scene(open-fix):=20=E8=B0=83=E6=95=B4=20O?= =?UTF-8?q?penFixScene=20=E7=9B=B8=E6=9C=BA=E4=B8=8E=E5=AF=B9=E8=B1=A1?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 降低虚拟相机优先级 - 微调 Prefab 本地坐标与路径点位置 --- Assets/Scenes/OpenFixScene.unity | 1604 +++++++++++++++--------------- 1 file changed, 802 insertions(+), 802 deletions(-) diff --git a/Assets/Scenes/OpenFixScene.unity b/Assets/Scenes/OpenFixScene.unity index 7b43a9cf5..c47e96805 100644 --- a/Assets/Scenes/OpenFixScene.unity +++ b/Assets/Scenes/OpenFixScene.unity @@ -1862,7 +1862,7 @@ MonoBehaviour: - m_Script m_LockStageInInspector: m_StreamingVersion: 20170927 - m_Priority: 12 + m_Priority: 1 m_StandbyUpdate: 2 m_LookAt: {fileID: 0} m_Follow: {fileID: 0} @@ -9506,7 +9506,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 3103334153009339654, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_LocalPosition.y - value: 0.16600835 + value: 0.010355592 objectReference: {fileID: 0} - target: {fileID: 3405228258737689538, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_text @@ -9522,7 +9522,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[0].y - value: -1.2438487 + value: -1.227864 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[1].x @@ -9530,7 +9530,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[1].y - value: -1.2398431 + value: -1.2259012 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[2].x @@ -9538,7 +9538,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[2].y - value: -1.2392201 + value: -1.2256258 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[3].x @@ -9546,7 +9546,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[3].y - value: -1.2390937 + value: -1.2291055 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[4].x @@ -9554,7 +9554,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[4].y - value: -1.2345594 + value: -1.2309264 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[5].x @@ -9562,7 +9562,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[5].y - value: -1.2310907 + value: -1.230682 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[6].x @@ -9570,7 +9570,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[6].y - value: -1.2312636 + value: -1.2336321 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[7].x @@ -9578,7 +9578,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[7].y - value: -1.2298166 + value: -1.238156 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[8].x @@ -9586,7 +9586,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[8].y - value: -1.2262009 + value: -1.238784 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[9].x @@ -9594,7 +9594,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[9].y - value: -1.2258425 + value: -1.2390118 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[10].x @@ -9602,7 +9602,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[10].y - value: -1.227655 + value: -1.2431096 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[11].x @@ -9610,7 +9610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[11].y - value: -1.2263004 + value: -1.2456307 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[12].x @@ -9618,7 +9618,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[12].y - value: -1.2248347 + value: -1.2444844 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[13].x @@ -9626,7 +9626,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[13].y - value: -1.2281909 + value: -1.2449641 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[14].x @@ -9634,7 +9634,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[14].y - value: -1.2309161 + value: -1.247246 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[15].x @@ -9642,7 +9642,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[15].y - value: -1.2306261 + value: -1.2459754 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[16].x @@ -9650,7 +9650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[16].y - value: -1.2324705 + value: -1.2427748 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[17].x @@ -9658,7 +9658,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[17].y - value: -1.2369832 + value: -1.2430438 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[18].x @@ -9666,7 +9666,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[18].y - value: -1.2386503 + value: -1.2430931 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[19].x @@ -9674,7 +9674,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[19].y - value: -1.2385999 + value: -1.2387837 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[20].x @@ -9682,7 +9682,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[20].y - value: -1.2420882 + value: -1.2355734 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[21].x @@ -9690,7 +9690,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[21].y - value: -1.2457559 + value: -1.2354935 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[22].x @@ -9698,7 +9698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[22].y - value: -1.2447323 + value: -1.2333165 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[23].x @@ -9706,7 +9706,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[23].y - value: -1.244346 + value: -1.229051 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[24].x @@ -9714,7 +9714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[24].y - value: -1.2467571 + value: -1.2281579 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[25].x @@ -9722,7 +9722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[25].y - value: -1.2466812 + value: -1.229033 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[26].x @@ -9730,7 +9730,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[26].y - value: -1.2436136 + value: -1.2264007 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[27].x @@ -9738,7 +9738,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[27].y - value: -1.2429916 + value: -1.2242215 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[28].x @@ -9746,7 +9746,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[28].y - value: -1.2434802 + value: -1.2266018 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[29].x @@ -9754,7 +9754,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[29].y - value: -1.2399172 + value: -1.2281861 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[30].x @@ -9762,7 +9762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[30].y - value: -1.2357157 + value: -1.2271216 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[31].x @@ -9770,7 +9770,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[31].y - value: -1.2356482 + value: -1.2287102 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[32].x @@ -9778,7 +9778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[32].y - value: -1.2344623 + value: -1.2328638 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[33].x @@ -9786,7 +9786,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[33].y - value: -1.2301263 + value: -1.2341325 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[34].x @@ -9794,7 +9794,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[34].y - value: -1.2281022 + value: -1.2341973 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[35].x @@ -9802,7 +9802,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[35].y - value: -1.2288667 + value: -1.2382834 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[36].x @@ -9810,7 +9810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[36].y - value: -1.2271044 + value: -1.2422076 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[37].x @@ -9818,7 +9818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[37].y - value: -1.2243768 + value: -1.2419164 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[38].x @@ -9826,7 +9826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[38].y - value: -1.2259881 + value: -1.2426543 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[39].x @@ -9834,7 +9834,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[39].y - value: -1.2284482 + value: -1.2460531 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[40].x @@ -9842,7 +9842,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[40].y - value: -1.2272451 + value: -1.2466896 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[41].x @@ -9850,7 +9850,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[41].y - value: -1.2276957 + value: -1.2446285 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[42].x @@ -9858,7 +9858,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[42].y - value: -1.2317679 + value: -1.2452087 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[43].x @@ -9866,7 +9866,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[43].y - value: -1.2340081 + value: -1.2465549 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[44].x @@ -9874,7 +9874,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[44].y - value: -1.2340394 + value: -1.2433661 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[45].x @@ -9882,7 +9882,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[45].y - value: -1.2371165 + value: -1.2399244 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[46].x @@ -9890,7 +9890,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[46].y - value: -1.2415613 + value: -1.2401116 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[47].x @@ -9898,7 +9898,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[47].y - value: -1.2419065 + value: -1.2386863 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[48].x @@ -9906,7 +9906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[48].y - value: -1.2417334 + value: -1.2341574 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[49].x @@ -9914,7 +9914,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[49].y - value: -1.2452391 + value: -1.2319999 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[50].x @@ -9922,7 +9922,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[50].y - value: -1.2470701 + value: -1.2321362 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[51].x @@ -9930,7 +9930,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[51].y - value: -1.2451515 + value: -1.2293301 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[52].x @@ -9938,7 +9938,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[52].y - value: -1.2448597 + value: -1.2256713 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[53].x @@ -9946,7 +9946,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[53].y - value: -1.2463573 + value: -1.2265834 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[54].x @@ -9954,7 +9954,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[54].y - value: -1.244313 + value: -1.2277597 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[55].x @@ -9962,7 +9962,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[55].y - value: -1.2404498 + value: -1.2255807 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[56].x @@ -9970,7 +9970,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[56].y - value: -1.2402112 + value: -1.2254062 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[57].x @@ -9978,7 +9978,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[57].y - value: -1.2398423 + value: -1.2287021 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[58].x @@ -9986,7 +9986,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[58].y - value: -1.235336 + value: -1.230064 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[59].x @@ -9994,7 +9994,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[59].y - value: -1.2321097 + value: -1.2297082 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[60].x @@ -10002,7 +10002,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[60].y - value: -1.2321968 + value: -1.2328827 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[61].x @@ -10010,7 +10010,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[61].y - value: -1.230318 + value: -1.2373816 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[62].x @@ -10018,7 +10018,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[62].y - value: -1.2265605 + value: -1.2377368 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[63].x @@ -10026,7 +10026,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[63].y - value: -1.226294 + value: -1.2383335 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[64].x @@ -10034,7 +10034,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[64].y - value: -1.2279005 + value: -1.2425498 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[65].x @@ -10042,7 +10042,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[65].y - value: -1.2260199 + value: -1.2449203 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[66].x @@ -10050,7 +10050,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[66].y - value: -1.2246614 + value: -1.2439574 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[67].x @@ -10058,7 +10058,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[67].y - value: -1.2278281 + value: -1.2449415 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[68].x @@ -10066,7 +10066,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[68].y - value: -1.230109 + value: -1.2474356 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[69].x @@ -10074,7 +10074,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[69].y - value: -1.2296504 + value: -1.2460779 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[70].x @@ -10082,7 +10082,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[70].y - value: -1.2317512 + value: -1.243074 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[71].x @@ -10090,7 +10090,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[71].y - value: -1.2362064 + value: -1.2438129 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[72].x @@ -10098,7 +10098,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[72].y - value: -1.237602 + value: -1.2437025 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[73].x @@ -10106,7 +10106,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[73].y - value: -1.2376097 + value: -1.2394928 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[74].x @@ -10114,7 +10114,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[74].y - value: -1.2415041 + value: -1.236641 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[75].x @@ -10122,7 +10122,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[75].y - value: -1.2450128 + value: -1.2365663 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[76].x @@ -10130,7 +10130,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[76].y - value: -1.244164 + value: -1.2340435 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[77].x @@ -10138,7 +10138,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[77].y - value: -1.2442571 + value: -1.2296879 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[78].x @@ -10146,7 +10146,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[78].y - value: -1.2283869 + value: -1.22896 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[79].x @@ -10154,7 +10154,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[79].y - value: -1.2162018 + value: -1.2296686 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[80].x @@ -10162,7 +10162,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[80].y - value: -1.2064399 + value: -1.2265469 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[81].x @@ -10170,7 +10170,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[81].y - value: -1.2068146 + value: -1.2244606 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[82].x @@ -10178,7 +10178,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[82].y - value: -1.2071893 + value: -1.226628 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[83].x @@ -10186,7 +10186,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[83].y - value: -1.2077777 + value: -1.2277014 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[84].x @@ -10194,7 +10194,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[84].y - value: -1.1963751 + value: -1.2264528 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[85].x @@ -10202,7 +10202,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[85].y - value: -1.1844648 + value: -1.2281778 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[86].x @@ -10210,7 +10210,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[86].y - value: -1.1725544 + value: -1.2322068 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[87].x @@ -10218,7 +10218,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[87].y - value: -1.1692767 + value: -1.233097 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[88].x @@ -10226,7 +10226,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[88].y - value: -1.1698651 + value: -1.233127 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[89].x @@ -10234,7 +10234,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[89].y - value: -1.1702399 + value: -1.2375269 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[90].x @@ -10242,7 +10242,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[90].y - value: -1.1646382 + value: -1.2412091 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[91].x @@ -10250,7 +10250,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[91].y - value: -1.1527277 + value: -1.2410256 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[92].x @@ -10258,7 +10258,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[92].y - value: -1.1405426 + value: -1.2422149 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[93].x @@ -10266,7 +10266,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[93].y - value: -1.1319525 + value: -1.2457888 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[94].x @@ -10274,7 +10274,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[94].y - value: -1.1323273 + value: -1.2463284 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[95].x @@ -10282,7 +10282,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[95].y - value: -1.1327021 + value: -1.2444786 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[96].x @@ -10290,7 +10290,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[96].y - value: -1.1326264 + value: -1.2455671 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[97].x @@ -10298,7 +10298,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[97].y - value: -1.120716 + value: -1.2471132 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[98].x @@ -10306,7 +10306,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[98].y - value: -1.1088057 + value: -1.2438031 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[99].x @@ -10314,7 +10314,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[99].y - value: -1.0968952 + value: -1.2408134 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[100].x @@ -10322,7 +10322,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[100].y - value: -1.0950031 + value: -1.2411089 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[101].x @@ -10330,7 +10330,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[101].y - value: -1.0953778 + value: -1.2394446 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[102].x @@ -10338,7 +10338,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[102].y - value: -1.0957526 + value: -1.2349309 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[103].x @@ -10346,7 +10346,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[103].y - value: -1.0889789 + value: -1.2330364 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[104].x @@ -10354,7 +10354,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[104].y - value: -1.0770686 + value: -1.2330916 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[105].x @@ -10362,7 +10362,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[105].y - value: -1.0648835 + value: -1.2298645 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[106].x @@ -10370,7 +10370,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[106].y - value: -1.0574652 + value: -1.2260426 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[107].x @@ -10378,7 +10378,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[107].y - value: -1.05784 + value: -1.227071 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[108].x @@ -10386,7 +10386,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[108].y - value: -1.0582148 + value: -1.2277366 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[109].x @@ -10394,7 +10394,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[109].y - value: -1.0569673 + value: -1.2253486 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[110].x @@ -10402,7 +10402,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[110].y - value: -1.0450568 + value: -1.2252629 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[111].x @@ -10410,7 +10410,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[111].y - value: -1.0331464 + value: -1.228366 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[112].x @@ -10418,7 +10418,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[112].y - value: -1.0212361 + value: -1.2292641 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[113].x @@ -10426,7 +10426,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[113].y - value: -1.0365986 + value: -1.228776 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[114].x @@ -10434,7 +10434,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[114].y - value: -1.0258124 + value: -1.2321591 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[115].x @@ -10442,7 +10442,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[115].y - value: -1.0209736 + value: -1.2365891 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[116].x @@ -10450,7 +10450,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[116].y - value: -1.0317597 + value: -1.2366688 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[117].x @@ -10458,7 +10458,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[117].y - value: -1.0338202 + value: -1.2376233 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[118].x @@ -10466,7 +10466,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[118].y - value: -1.0230341 + value: -1.2419361 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[119].x @@ -10474,7 +10474,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[119].y - value: -1.0237519 + value: -1.2441489 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[120].x @@ -10482,7 +10482,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[120].y - value: -1.034538 + value: -1.2433585 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[121].x @@ -10490,7 +10490,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[121].y - value: -1.0306756 + value: -1.2448361 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[122].x @@ -10498,7 +10498,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[122].y - value: -1.0202557 + value: -1.2342577 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[123].x @@ -10506,7 +10506,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[123].y - value: -1.0265303 + value: -1.2223129 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[124].x @@ -10514,7 +10514,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[124].y - value: -1.0373163 + value: -1.210334 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[125].x @@ -10522,7 +10522,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[125].y - value: -1.0278974 + value: -1.2021683 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[126].x @@ -10530,7 +10530,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[126].y - value: -1.0185224 + value: -1.2025964 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[127].x @@ -10538,7 +10538,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[127].y - value: -1.0293086 + value: -1.2030246 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[128].x @@ -10546,7 +10546,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[128].y - value: -1.0359051 + value: -1.2024176 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[129].x @@ -10554,7 +10554,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[129].y - value: -1.025119 + value: -1.1904386 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[130].x @@ -10562,7 +10562,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[130].y - value: -1.0213008 + value: -1.1784595 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[131].x @@ -10570,7 +10570,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[131].y - value: -1.0320868 + value: -1.1665148 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[132].x @@ -10578,7 +10578,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[132].y - value: -1.0331268 + value: -1.1651387 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[133].x @@ -10586,7 +10586,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[133].y - value: -1.0223407 + value: -1.1655669 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[134].x @@ -10594,7 +10594,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[134].y - value: -1.0240791 + value: -1.165995 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[135].x @@ -10602,7 +10602,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[135].y - value: -1.0348653 + value: -1.1585985 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[136].x @@ -10610,7 +10610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[136].y - value: -1.0303485 + value: -1.1466194 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[137].x @@ -10618,7 +10618,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[137].y - value: -1.0195624 + value: -1.1346405 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[138].x @@ -10626,7 +10626,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[138].y - value: -1.0272236 + value: -1.1277077 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[139].x @@ -10634,7 +10634,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[139].y - value: -1.0376436 + value: -1.1281359 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[140].x @@ -10642,7 +10642,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[140].y - value: -1.0275701 + value: -1.1285373 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[141].x @@ -10650,7 +10650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[141].y - value: -1.0192158 + value: -1.1267585 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[142].x @@ -10658,7 +10658,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[142].y - value: -1.0300019 + value: -1.1147795 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[143].x @@ -10666,7 +10666,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[143].y - value: -1.035578 + value: -1.1028004 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[144].x @@ -10674,7 +10674,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[144].y - value: -1.0247918 + value: -1.0908213 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[145].x @@ -10682,7 +10682,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[145].y - value: -1.0219941 + value: -1.0906781 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[146].x @@ -10690,7 +10690,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[146].y - value: -1.0327803 + value: -1.0911063 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[147].x @@ -10698,7 +10698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[147].y - value: -1.0327996 + value: -1.0915345 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[148].x @@ -10706,7 +10706,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[148].y - value: -1.0409466 + value: -1.0829394 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[149].x @@ -10714,7 +10714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[149].y - value: -1.0490069 + value: -1.0709603 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[150].x @@ -10722,7 +10722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[150].y - value: -1.059665 + value: -1.0589812 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[151].x @@ -10730,7 +10730,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[151].y - value: -1.0721186 + value: -1.0532204 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[152].x @@ -10738,7 +10738,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[152].y - value: -1.0848225 + value: -1.0536486 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[153].x @@ -10746,7 +10746,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[153].y - value: -1.0975263 + value: -1.0540767 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[154].x @@ -10754,7 +10754,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[154].y - value: -1.1096685 + value: -1.051065 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[155].x @@ -10762,7 +10762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[155].y - value: -1.1177288 + value: -1.0390859 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[156].x @@ -10770,7 +10770,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[156].y - value: -1.1261493 + value: -1.0271069 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[157].x @@ -10778,7 +10778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[157].y - value: -1.1342095 + value: -1.0284504 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[158].x @@ -10786,7 +10786,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[158].y - value: -1.1422698 + value: -1.0182441 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[159].x @@ -10794,7 +10794,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[159].y - value: -1.1534992 + value: -1.0289387 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[160].x @@ -10802,7 +10802,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[160].y - value: -1.1659528 + value: -1.0363666 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[161].x @@ -10810,7 +10810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[161].y - value: -1.1786567 + value: -1.025672 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[162].x @@ -10818,7 +10818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[162].y - value: -1.1913606 + value: -1.0210224 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[163].x @@ -10826,7 +10826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[163].y - value: -1.2029315 + value: -1.031717 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[164].x @@ -10834,7 +10834,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[164].y - value: -1.2113519 + value: -1.0335883 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[165].x @@ -10842,7 +10842,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[165].y - value: -1.2194122 + value: -1.0228479 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[166].x @@ -10850,7 +10850,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[166].y - value: -1.2274724 + value: -1.0238465 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[167].x @@ -10858,7 +10858,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[167].y - value: -1.2355328 + value: -1.0345411 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[168].x @@ -10866,7 +10866,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[168].y - value: -1.2470832 + value: -1.0307641 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[169].x @@ -10874,7 +10874,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[169].y - value: -1.2597871 + value: -1.0200696 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[170].x @@ -10882,7 +10882,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[170].y - value: -1.272491 + value: -1.0266248 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[171].x @@ -10890,7 +10890,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[171].y - value: -1.2851948 + value: -1.0373194 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[172].x @@ -10898,7 +10898,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[172].y - value: -1.2961944 + value: -1.0279858 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[173].x @@ -10906,7 +10906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[173].y - value: -1.3046148 + value: -1.0187086 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[174].x @@ -10914,7 +10914,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[174].y - value: -1.3126751 + value: -1.029449 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[175].x @@ -10922,7 +10922,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[175].y - value: -1.3207355 + value: -1.0358562 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[176].x @@ -10930,7 +10930,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[176].y - value: -1.3287957 + value: -1.0251617 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[177].x @@ -10938,7 +10938,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[177].y - value: -1.3409175 + value: -1.0215327 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[178].x @@ -10946,7 +10946,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[178].y - value: -1.3536214 + value: -1.0322273 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[179].x @@ -10954,7 +10954,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[179].y - value: -1.3663251 + value: -1.033078 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[180].x @@ -10962,7 +10962,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[180].y - value: -1.379029 + value: -1.0223835 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[181].x @@ -10970,7 +10970,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[181].y - value: -1.3898175 + value: -1.0243111 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[182].x @@ -10978,7 +10978,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[182].y - value: -1.3881073 + value: -1.0350513 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[183].x @@ -10986,7 +10986,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[183].y - value: -1.3932856 + value: -1.0302539 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[184].x @@ -10994,7 +10994,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[184].y - value: -1.3973211 + value: -1.0195593 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[185].x @@ -11002,7 +11002,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[185].y - value: -1.3921112 + value: -1.0271351 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[186].x @@ -11010,7 +11010,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[186].y - value: -1.3892817 + value: -1.0378296 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[187].x @@ -11018,7 +11018,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[187].y - value: -1.3946748 + value: -1.0274756 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[188].x @@ -11026,7 +11026,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[188].y - value: -1.395932 + value: -1.0192188 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[189].x @@ -11034,7 +11034,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[189].y - value: -1.3905389 + value: -1.0299134 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[190].x @@ -11042,7 +11042,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[190].y - value: -1.3906709 + value: -1.035346 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[191].x @@ -11050,7 +11050,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[191].y - value: -1.3960639 + value: -1.0246514 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[192].x @@ -11058,7 +11058,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[192].y - value: -1.3945428 + value: -1.0397626 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[193].x @@ -11066,7 +11066,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[193].y - value: -1.3891498 + value: -1.0524039 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[194].x @@ -11074,7 +11074,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[194].y - value: -1.39206 + value: -1.0650452 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[195].x @@ -11082,7 +11082,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[195].y - value: -1.3974531 + value: -1.0774753 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[196].x @@ -11090,7 +11090,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[196].y - value: -1.3931537 + value: -1.0856255 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[197].x @@ -11098,7 +11098,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[197].y - value: -1.3882393 + value: -1.0937759 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[198].x @@ -11106,7 +11106,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[198].y - value: -1.3934492 + value: -1.1019262 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[199].x @@ -11114,7 +11114,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[199].y - value: -1.3971575 + value: -1.1100316 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[200].x @@ -11122,7 +11122,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[200].y - value: -1.3917645 + value: -1.1209244 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[201].x @@ -11130,7 +11130,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[201].y - value: -1.3896284 + value: -1.1335657 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[202].x @@ -11138,7 +11138,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[202].y - value: -1.3948383 + value: -1.1462069 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[203].x @@ -11146,7 +11146,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[203].y - value: -1.3957684 + value: -1.1588482 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[204].x @@ -11154,7 +11154,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[204].y - value: -1.3903754 + value: -1.1707832 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[205].x @@ -11162,7 +11162,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[205].y - value: -1.3910176 + value: -1.1789335 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[206].x @@ -11170,7 +11170,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[206].y - value: -1.3964106 + value: -1.1870838 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[207].x @@ -11178,7 +11178,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[207].y - value: -1.3943793 + value: -1.1951891 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[208].x @@ -11186,7 +11186,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[208].y - value: -1.3889862 + value: -1.2033395 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[209].x @@ -11194,7 +11194,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[209].y - value: -1.3924067 + value: -1.2147273 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[210].x @@ -11202,7 +11202,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[210].y - value: -1.3977997 + value: -1.2273686 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[211].x @@ -11210,7 +11210,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[211].y - value: -1.3929901 + value: -1.2400099 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[212].x @@ -11218,7 +11218,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[212].y - value: -1.3884028 + value: -1.2526512 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[213].x @@ -11226,7 +11226,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[213].y - value: -1.3937958 + value: -1.2640911 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[214].x @@ -11234,7 +11234,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[214].y - value: -1.3968109 + value: -1.2722415 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[215].x @@ -11242,7 +11242,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[215].y - value: -1.391601 + value: -1.2803918 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[216].x @@ -11250,7 +11250,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[216].y - value: -1.389792 + value: -1.2884971 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[217].x @@ -11258,7 +11258,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[217].y - value: -1.2274828 + value: -1.2966474 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[218].x @@ -11266,7 +11266,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[218].y - value: -1.2281984 + value: -1.3085302 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[219].x @@ -11274,7 +11274,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[219].y - value: -1.2280525 + value: -1.3211715 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[220].x @@ -11282,7 +11282,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[220].y - value: -1.225236 + value: -1.3338128 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[221].x @@ -11290,7 +11290,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[221].y - value: -1.2251356 + value: -1.3464541 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[222].x @@ -11298,7 +11298,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[222].y - value: -1.2278359 + value: -1.3573991 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[223].x @@ -11306,7 +11306,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[223].y - value: -1.2279192 + value: -1.3655494 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[224].x @@ -11314,7 +11314,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[224].y - value: -1.2271489 + value: -1.3736547 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[225].x @@ -11322,7 +11322,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[225].y - value: -1.230705 + value: -1.3818051 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[226].x @@ -11330,7 +11330,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[226].y - value: -1.234566 + value: -1.3919209 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[227].x @@ -11338,7 +11338,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[227].y - value: -1.2345847 + value: -1.3972682 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[228].x @@ -11346,7 +11346,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[228].y - value: -1.2360165 + value: -1.3933843 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[229].x @@ -11354,7 +11354,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[229].y - value: -1.2404783 + value: -1.3880371 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[230].x @@ -11362,7 +11362,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[230].y - value: -1.2425015 + value: -1.3933101 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[231].x @@ -11370,7 +11370,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[231].y - value: -1.2420108 + value: -1.3973426 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[232].x @@ -11378,7 +11378,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[232].y - value: -1.2442824 + value: -1.3919952 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[233].x @@ -11386,7 +11386,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[233].y - value: -1.2474009 + value: -1.3893747 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[234].x @@ -11394,7 +11394,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[234].y - value: -1.2459654 + value: -1.3947221 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[235].x @@ -11402,7 +11402,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[235].y - value: -1.2440903 + value: -1.3959304 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[236].x @@ -11410,7 +11410,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[236].y - value: -1.2456137 + value: -1.3905832 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[237].x @@ -11418,7 +11418,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[237].y - value: -1.2453076 + value: -1.390764 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[238].x @@ -11426,7 +11426,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[238].y - value: -1.2414904 + value: -1.3961112 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[239].x @@ -11434,7 +11434,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[239].y - value: -1.2396389 + value: -1.3945413 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[240].x @@ -11442,7 +11442,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[240].y - value: -1.2397085 + value: -1.389194 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[241].x @@ -11450,7 +11450,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[241].y - value: -1.2364391 + value: -1.392176 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[242].x @@ -11458,7 +11458,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[242].y - value: -1.2319195 + value: -1.3975233 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[243].x @@ -11466,7 +11466,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[243].y - value: -1.2316217 + value: -1.3931292 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[244].x @@ -11474,7 +11474,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[244].y - value: -1.2313547 + value: -1.3882179 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[245].x @@ -11482,7 +11482,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[245].y - value: -1.22755 + value: -1.3935652 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[246].x @@ -11490,7 +11490,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[246].y - value: -1.2255803 + value: -1.3970873 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[247].x @@ -11498,7 +11498,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[247].y - value: -1.227125 + value: -1.3917401 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[248].x @@ -11506,7 +11506,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[248].y - value: -1.2268277 + value: -1.3896071 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[249].x @@ -11514,7 +11514,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[249].y - value: -1.224992 + value: -1.3949543 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[250].x @@ -11522,7 +11522,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[250].y - value: -1.2268658 + value: -1.3956753 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[251].x @@ -11530,7 +11530,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[251].y - value: -1.230437 + value: -1.390328 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[252].x @@ -11538,7 +11538,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[252].y - value: -1.2302419 + value: -1.3910191 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[253].x @@ -11546,7 +11546,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[253].y - value: -1.2306467 + value: -1.3963664 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[254].x @@ -11554,7 +11554,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[254].y - value: -1.2351056 + value: -1.3942862 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[255].x @@ -11562,7 +11562,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[255].y - value: -1.2381479 + value: -1.3889389 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[256].x @@ -11570,7 +11570,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[256].y - value: -1.2381696 + value: -1.3924083 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[257].x @@ -11578,7 +11578,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[257].y - value: -1.2404444 + value: -1.3977555 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[258].x @@ -11586,7 +11586,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[258].y - value: -1.2444644 + value: -1.3928741 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[259].x @@ -11594,7 +11594,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[259].y - value: -1.2448432 + value: -1.388473 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[260].x @@ -11602,7 +11602,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[260].y - value: -1.2435956 + value: -1.3938203 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[261].x @@ -11610,7 +11610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[261].y - value: -1.2460622 + value: -1.2283456 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[262].x @@ -11618,7 +11618,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[262].y - value: -1.2475977 + value: -1.2290064 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[263].x @@ -11626,7 +11626,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[263].y - value: -1.2447927 + value: -1.2274756 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[264].x @@ -11634,7 +11634,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[264].y - value: -1.2430413 + value: -1.224606 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[265].x @@ -11642,7 +11642,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[265].y - value: -1.243768 + value: -1.2257792 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[266].x @@ -11650,7 +11650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[266].y - value: -1.2416791 + value: -1.2284161 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[267].x @@ -11658,7 +11658,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[267].y - value: -1.2373224 + value: -1.2271333 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[268].x @@ -11666,7 +11666,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[268].y - value: -1.236164 + value: -1.2271596 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[269].x @@ -11674,7 +11674,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[269].y - value: -1.2360991 + value: -1.2311479 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[270].x @@ -11682,7 +11682,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[270].y - value: -1.231876 + value: -1.2336571 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[271].x @@ -11690,7 +11690,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[271].y - value: -1.228333 + value: -1.233673 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[272].x @@ -11698,7 +11698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[272].y - value: -1.2288958 + value: -1.2364236 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[273].x @@ -11706,7 +11706,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[273].y - value: -1.2282599 + value: -1.2408953 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[274].x @@ -11714,7 +11714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[274].y - value: -1.2252387 + value: -1.2416214 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[275].x @@ -11722,7 +11722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[275].y - value: -1.2252365 + value: -1.2411999 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[276].x @@ -11730,7 +11730,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[276].y - value: -1.2277278 + value: -1.2448254 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[277].x @@ -11738,7 +11738,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[277].y - value: -1.2273334 + value: -1.2470714 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[278].x @@ -11746,7 +11746,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[278].y - value: -1.2263517 + value: -1.245285 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[279].x @@ -11754,7 +11754,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[279].y - value: -1.2300885 + value: -1.2447904 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[280].x @@ -11762,7 +11762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[280].y - value: -1.2335684 + value: -1.2463984 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[281].x @@ -11770,7 +11770,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[281].y - value: -1.2335333 + value: -1.2447946 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[282].x @@ -11778,7 +11778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[282].y - value: -1.2352597 + value: -1.2410281 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[283].x @@ -11786,7 +11786,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[283].y - value: -1.2397463 + value: -1.2405332 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[284].x @@ -11794,7 +11794,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[284].y - value: -1.2415773 + value: -1.2405393 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[285].x @@ -11802,7 +11802,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[285].y - value: -1.2412175 + value: -1.2360339 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[286].x @@ -11810,7 +11810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[286].y - value: -1.2439609 + value: -1.2324857 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[287].x @@ -11818,7 +11818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[287].y - value: -1.2472733 + value: -1.2325199 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[288].x @@ -11826,7 +11826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[288].y - value: -1.2457371 + value: -1.2309059 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[289].x @@ -11834,7 +11834,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[289].y - value: -1.2443553 + value: -1.227041 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[290].x @@ -11842,7 +11842,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[290].y - value: -1.2461193 + value: -1.2263596 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[291].x @@ -11850,7 +11850,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[291].y - value: -1.2456605 + value: -1.2278378 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[292].x @@ -11858,7 +11858,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[292].y - value: -1.2420275 + value: -1.2261637 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[293].x @@ -11866,7 +11866,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[293].y - value: -1.240582 + value: -1.2243669 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[294].x @@ -11874,7 +11874,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[294].y - value: -1.2407333 + value: -1.2274102 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[295].x @@ -11882,7 +11882,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[295].y - value: -1.2371985 + value: -1.2299029 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[296].x @@ -11890,7 +11890,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[296].y - value: -1.2326832 + value: -1.2293717 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[297].x @@ -11898,7 +11898,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[297].y - value: -1.2326051 + value: -1.2310741 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[298].x @@ -11906,7 +11906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[298].y - value: -1.2319497 + value: -1.2355117 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[299].x @@ -11914,7 +11914,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[299].y - value: -1.2279761 + value: -1.2372193 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[300].x @@ -11922,7 +11922,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[300].y - value: -1.2261332 + value: -1.237258 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[301].x @@ -11930,7 +11930,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[301].y - value: -1.2274791 + value: -1.2408726 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[302].x @@ -11938,7 +11938,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[302].y - value: -1.2266898 + value: -1.244772 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[303].x @@ -11946,7 +11946,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[303].y - value: -1.2246099 + value: -1.2440314 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[304].x @@ -11954,7 +11954,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[304].y - value: -1.2265987 + value: -1.2439194 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[305].x @@ -11962,7 +11962,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[305].y - value: -1.2299923 + value: -1.2466861 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[306].x @@ -11970,7 +11970,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[306].y - value: -1.2293688 + value: -1.2469555 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[307].x @@ -11978,7 +11978,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[307].y - value: -1.2299666 + value: -1.2442175 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[308].x @@ -11986,7 +11986,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[308].y - value: -1.2343614 + value: -1.2438469 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[309].x @@ -11994,7 +11994,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[309].y - value: -1.2370881 + value: -1.2446151 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[310].x @@ -12002,7 +12002,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[310].y - value: -1.2371433 + value: -1.2412353 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[311].x @@ -12010,7 +12010,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[311].y - value: -1.2397803 + value: -1.2371312 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[312].x @@ -12018,7 +12018,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[312].y - value: -1.2439452 + value: -1.2370927 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[313].x @@ -12026,7 +12026,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[313].y - value: -1.2441806 + value: -1.2358928 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[314].x @@ -12034,7 +12034,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[314].y - value: -1.2431536 + value: -1.2314471 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[315].x @@ -12042,7 +12042,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[315].y - value: -1.246073 + value: -1.2292212 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[316].x @@ -12050,7 +12050,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[316].y - value: -1.2475096 + value: -1.2297324 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[317].x @@ -12058,7 +12058,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[317].y - value: -1.2449418 + value: -1.2277215 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[318].x @@ -12066,7 +12066,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[318].y - value: -1.2436641 + value: -1.2246503 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[319].x @@ -12074,7 +12074,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[319].y - value: -1.2445571 + value: -1.225916 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[320].x @@ -12082,7 +12082,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[320].y - value: -1.2422986 + value: -1.2280658 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[321].x @@ -12090,7 +12090,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[321].y - value: -1.2380337 + value: -1.2265598 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[322].x @@ -12098,7 +12098,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[322].y - value: -1.2372204 + value: -1.2267069 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[323].x @@ -12106,7 +12106,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[323].y - value: -1.2370605 + value: -1.2305509 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[324].x @@ -12114,7 +12114,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[324].y - value: -1.2325746 + value: -1.2326584 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[325].x @@ -12122,7 +12122,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[325].y - value: -1.2292747 + value: -1.2326148 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[326].x @@ -12130,7 +12130,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[326].y - value: -1.2296581 + value: -1.2356534 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[327].x @@ -12138,7 +12138,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[327].y - value: -1.228569 + value: -1.240163 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[328].x @@ -12146,7 +12146,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[328].y - value: -1.2253524 + value: -1.2406693 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[329].x @@ -12154,7 +12154,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[329].y - value: -1.2254537 + value: -1.2406768 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[330].x @@ -12162,7 +12162,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[330].y - value: -1.227702 + value: -1.2444651 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[331].x @@ -12170,7 +12170,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[331].y - value: -1.2268236 + value: -1.246604 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[332].x @@ -12178,7 +12178,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[332].y - value: -1.2258068 + value: -1.2450243 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[333].x @@ -12186,7 +12186,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[333].y - value: -1.2295446 + value: -1.2450393 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[334].x @@ -12194,7 +12194,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[334].y - value: -1.2326053 + value: -1.246859 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[335].x @@ -12202,7 +12202,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[335].y - value: -1.2324977 + value: -1.2451419 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[336].x @@ -12210,7 +12210,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[336].y - value: -1.2344807 + value: -1.2415402 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[337].x @@ -12218,7 +12218,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[337].y - value: -1.23901 + value: -1.2414743 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[338].x @@ -12226,7 +12226,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[338].y - value: -1.2405704 + value: -1.2412704 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[339].x @@ -12234,7 +12234,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[339].y - value: -1.2403674 + value: -1.2368056 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[340].x @@ -12242,7 +12242,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[340].y - value: -1.2435452 + value: -1.2335458 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[341].x @@ -12250,7 +12250,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[341].y - value: -1.2468349 + value: -1.2335231 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[342].x @@ -12258,7 +12258,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[342].y - value: -1.2453916 + value: -1.2315073 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[343].x @@ -12266,7 +12266,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[343].y - value: -1.2445363 + value: -1.2275 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[344].x @@ -12274,7 +12274,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[344].y - value: -1.2465092 + value: -1.2269483 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[345].x @@ -12282,7 +12282,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[345].y - value: -1.2459645 + value: -1.2282281 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[346].x @@ -12290,7 +12290,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[346].y - value: -1.2424818 + value: -1.2260426 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[347].x @@ -12298,7 +12298,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[347].y - value: -1.2414802 + value: -1.2243308 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[348].x @@ -12306,7 +12306,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[348].y - value: -1.2417307 + value: -1.227172 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[349].x @@ -12314,7 +12314,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[349].y - value: -1.2379681 + value: -1.229186 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[350].x @@ -12322,7 +12322,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[350].y - value: -1.2337021 + value: -1.2285036 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[351].x @@ -12330,7 +12330,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[351].y - value: -1.2336187 + value: -1.2303923 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[352].x @@ -12338,7 +12338,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[352].y - value: -1.2325921 + value: -1.2347608 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[353].x @@ -12346,7 +12346,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[353].y - value: -1.2284876 + value: -1.2361429 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[354].x @@ -12354,7 +12354,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[354].y - value: -1.2267975 + value: -1.2362149 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[355].x @@ -12362,7 +12362,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[355].y - value: -1.2279494 + value: -1.2402021 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[356].x @@ -12370,7 +12370,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[356].y - value: -1.2266363 + value: -1.2439235 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[357].x @@ -12378,7 +12378,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[357].y - value: -1.2243447 + value: -1.2433392 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[358].x @@ -12386,7 +12386,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[358].y - value: -1.2264358 + value: -1.2437093 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[359].x @@ -12394,7 +12394,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[359].y - value: -1.22932 + value: -1.2466837 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[360].x @@ -12402,7 +12402,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[360].y - value: -1.2285498 + value: -1.2468612 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[361].x @@ -12410,7 +12410,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[361].y - value: -1.2293054 + value: -1.244333 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[362].x @@ -12418,7 +12418,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[362].y - value: -1.2336185 + value: -1.2444624 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[363].x @@ -12426,7 +12426,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[363].y - value: -1.235986 + value: -1.2453965 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[364].x @@ -12434,7 +12434,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[364].y - value: -1.2360979 + value: -1.2418566 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[365].x @@ -12442,7 +12442,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[365].y - value: -1.2390786 + value: -1.2381456 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[366].x @@ -12450,7 +12450,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[366].y - value: -1.2433504 + value: -1.2381572 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[367].x @@ -12458,7 +12458,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[367].y - value: -1.2434118 + value: -1.2366616 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[368].x @@ -12466,7 +12466,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[368].y - value: -1.2428824 + value: -1.2321662 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[369].x @@ -12474,7 +12474,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[369].y - value: -1.2460008 + value: -1.2301512 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[370].x @@ -12482,7 +12482,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[370].y - value: -1.2473658 + value: -1.2305273 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[371].x @@ -12490,7 +12490,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[371].y - value: -1.2449813 + value: -1.2280457 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[372].x @@ -12498,7 +12498,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[372].y - value: -1.2442483 + value: -1.2247804 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[373].x @@ -12506,7 +12506,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[373].y - value: -1.2452836 + value: -1.2261343 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[374].x @@ -12514,7 +12514,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[374].y - value: -1.2428901 + value: -1.2277746 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[375].x @@ -12522,7 +12522,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[375].y - value: -1.2387329 + value: -1.2260636 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[376].x @@ -12530,7 +12530,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[376].y - value: -1.2383074 + value: -1.2263242 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[377].x @@ -12538,7 +12538,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[377].y - value: -1.2378386 + value: -1.2300098 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[378].x @@ -12546,7 +12546,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[378].y - value: -1.233319 + value: -1.2316912 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[379].x @@ -12554,7 +12554,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[379].y - value: -1.2302206 + value: -1.2315693 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[380].x @@ -12562,7 +12562,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[380].y - value: -1.23052 + value: -1.2348796 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[381].x @@ -12570,7 +12570,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[381].y - value: -1.2289499 + value: -1.2394073 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[382].x @@ -12578,7 +12578,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[382].y - value: -1.2255464 + value: -1.2396829 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[383].x @@ -12586,7 +12586,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[383].y - value: -1.2257245 + value: -1.2400982 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[384].x @@ -12594,7 +12594,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[384].y - value: -1.2277901 + value: -1.2440361 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[385].x @@ -12602,7 +12602,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[385].y - value: -1.2263926 + value: -1.2460535 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[386].x @@ -12610,7 +12610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[386].y - value: -1.2254658 + value: -1.2446754 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[387].x @@ -12618,7 +12618,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[387].y - value: -1.2290372 + value: -1.2452071 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[388].x @@ -12626,7 +12626,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[388].y - value: -1.231643 + value: -1.2472336 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[389].x @@ -12634,7 +12634,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[389].y - value: -1.2314436 + value: -1.2454184 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[390].x @@ -12642,7 +12642,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[390].y - value: -1.2337061 + value: -1.241993 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[391].x @@ -12650,7 +12650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[391].y - value: -1.2382395 + value: -1.2423683 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[392].x @@ -12658,7 +12658,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[392].y - value: -1.2395709 + value: -1.2419722 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[393].x @@ -12666,7 +12666,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[393].y - value: -1.2394257 + value: -1.2375644 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[394].x @@ -12674,7 +12674,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[394].y - value: -1.2430646 + value: -1.2346206 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[395].x @@ -12682,7 +12682,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[395].y - value: -1.2462442 + value: -1.2345601 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[396].x @@ -12690,7 +12690,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[396].y - value: -1.2449962 + value: -1.2321575 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[397].x @@ -12698,7 +12698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[397].y - value: -1.2446618 + value: -1.2280229 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[398].x @@ -12706,7 +12706,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[398].y - value: -1.2468168 + value: -1.2276055 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[399].x @@ -12714,7 +12714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[399].y - value: -1.2461928 + value: -1.2286955 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[400].x @@ -12722,7 +12722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[400].y - value: -1.242893 + value: -1.2260063 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[401].x @@ -12730,7 +12730,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[401].y - value: -1.2423669 + value: -1.2243825 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[402].x @@ -12738,7 +12738,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[402].y - value: -1.2426939 + value: -1.227016 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[403].x @@ -12746,7 +12746,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[403].y - value: -1.238722 + value: -1.2285341 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[404].x @@ -12754,7 +12754,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[404].y - value: -1.2347627 + value: -1.2276868 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[405].x @@ -12762,7 +12762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[405].y - value: -1.2346979 + value: -1.2297482 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[406].x @@ -12770,7 +12770,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[406].y - value: -1.2332562 + value: -1.2340295 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[407].x @@ -12778,7 +12778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[407].y - value: -1.2290559 + value: -1.2350743 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[408].x @@ -12786,7 +12786,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[408].y - value: -1.2274948 + value: -1.2351547 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[409].x @@ -12794,7 +12794,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[409].y - value: -1.2284645 + value: -1.2394958 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[410].x @@ -12802,7 +12802,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[410].y - value: -1.2266389 + value: -1.2430174 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[411].x @@ -12810,7 +12810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[411].y - value: -1.2241638 + value: -1.2425758 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[412].x @@ -12818,7 +12818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[412].y - value: -1.2263275 + value: -1.2434255 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[413].x @@ -12826,7 +12826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[413].y - value: -1.2287343 + value: -1.2465945 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[414].x @@ -12834,7 +12834,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[414].y - value: -1.2277527 + value: -1.2466855 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[415].x @@ -12842,7 +12842,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[415].y - value: -1.2286888 + value: -1.2443691 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[416].x @@ -12850,7 +12850,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[416].y - value: -1.2329028 + value: -1.2449976 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[417].x @@ -12858,7 +12858,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[417].y - value: -1.2349346 + value: -1.2461133 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[418].x @@ -12866,7 +12866,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[418].y - value: -1.2349983 + value: -1.2424278 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[419].x @@ -12874,7 +12874,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[419].y - value: -1.2383468 + value: -1.239132 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[420].x @@ -12882,7 +12882,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[420].y - value: -1.2427078 + value: -1.2392126 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[421].x @@ -12890,7 +12890,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[421].y - value: -1.2426186 + value: -1.2374334 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[422].x @@ -12898,7 +12898,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[422].y - value: -1.242561 + value: -1.2329123 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[423].x @@ -12906,7 +12906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[423].y - value: -1.2458733 + value: -1.2311187 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[424].x @@ -12914,7 +12914,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[424].y - value: -1.2471375 + value: -1.2313758 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[425].x @@ -12922,7 +12922,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[425].y - value: -1.2329559 + value: -1.2284409 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[426].x @@ -12930,7 +12930,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[426].y - value: -1.2210456 + value: -1.2249905 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[427].x @@ -12938,7 +12938,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[427].y - value: -1.2091352 + value: -1.2264413 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[428].x @@ -12946,7 +12946,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[428].y - value: -1.1969501 + value: -1.2275642 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[429].x @@ -12954,7 +12954,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[429].y - value: -1.1947467 + value: -1.2256435 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[430].x @@ -12962,7 +12962,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[430].y - value: -1.1951215 + value: -1.2260102 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[431].x @@ -12970,7 +12970,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[431].y - value: -1.1954962 + value: -1.2295253 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[432].x @@ -12978,7 +12978,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[432].y - value: -1.1890339 + value: -1.2307729 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[433].x @@ -12986,7 +12986,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[433].y - value: -1.1771234 + value: -1.2305548 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[434].x @@ -12994,7 +12994,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[434].y - value: -1.1652131 + value: -1.2341121 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[435].x @@ -13002,7 +13002,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[435].y - value: -1.1572089 + value: -1.2386153 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[436].x @@ -13010,7 +13010,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[436].y - value: -1.1577972 + value: -1.2386593 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[437].x @@ -13018,7 +13018,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[437].y - value: -1.158172 + value: -1.239473 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[438].x @@ -13026,7 +13026,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[438].y - value: -1.1572968 + value: -1.2435459 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[439].x @@ -13034,7 +13034,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[439].y - value: -1.1453865 + value: -1.2454324 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[440].x @@ -13042,7 +13042,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[440].y - value: -1.133476 + value: -1.2442484 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[441].x @@ -13050,7 +13050,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[441].y - value: -1.1212909 + value: -1.2452859 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[442].x @@ -13058,7 +13058,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[442].y - value: -1.1202594 + value: -1.247525 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[443].x @@ -13066,7 +13066,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[443].y - value: -1.1206342 + value: -1.2456176 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[444].x @@ -13074,7 +13074,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[444].y - value: -1.1210089 + value: -1.2424506 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[445].x @@ -13082,7 +13082,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[445].y - value: -1.1133747 + value: -1.243214 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[446].x @@ -13090,7 +13090,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[446].y - value: -1.1014643 + value: -1.2426349 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[447].x @@ -13098,7 +13098,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[447].y - value: -1.0895538 + value: -1.2383076 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[448].x @@ -13106,7 +13106,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[448].y - value: -1.0827216 + value: -1.2356914 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[449].x @@ -13114,7 +13114,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[449].y - value: -1.08331 + value: -1.2356128 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[450].x @@ -13122,7 +13122,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[450].y - value: -1.0836847 + value: -1.2328467 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[451].x @@ -13130,7 +13130,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[451].y - value: -1.0816376 + value: -1.2286015 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[452].x @@ -13138,7 +13138,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[452].y - value: -1.0697272 + value: -1.2283362 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[453].x @@ -13146,7 +13146,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[453].y - value: -1.0575422 + value: -1.2291214 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[454].x @@ -13154,7 +13154,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[454].y - value: -1.0456318 + value: -1.2260505 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[455].x @@ -13162,7 +13162,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[455].y - value: -1.0457721 + value: -1.2245156 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[456].x @@ -13170,7 +13170,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[456].y - value: -1.0461469 + value: -1.2269382 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[457].x @@ -13178,7 +13178,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[457].y - value: -1.0465217 + value: -1.2279606 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[458].x @@ -13186,7 +13186,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[458].y - value: -1.0377156 + value: -1.226937 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[459].x @@ -13194,7 +13194,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[459].y - value: -1.0217402 + value: -1.2291511 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[460].x @@ -13202,7 +13202,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[460].y - value: -1.0325264 + value: -1.2333277 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[461].x @@ -13210,7 +13210,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[461].y - value: -1.0326874 + value: -1.2340107 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[462].x @@ -13218,7 +13218,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[462].y - value: -1.0222675 + value: -1.2342539 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[463].x @@ -13226,7 +13226,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[463].y - value: -1.0245185 + value: -1.2387635 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[464].x @@ -13234,7 +13234,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[464].y - value: -1.0353047 + value: -1.2420704 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[465].x @@ -13242,7 +13242,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[465].y - value: -1.029909 + value: -1.2417557 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[466].x @@ -13250,7 +13250,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[466].y - value: -1.0194892 + value: -1.2430652 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[467].x @@ -13258,7 +13258,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[467].y - value: -1.0272968 + value: -1.2464241 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[468].x @@ -13266,7 +13266,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[468].y - value: -1.0379169 + value: -1.2464249 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[469].x @@ -13274,7 +13274,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[469].y - value: -1.0271307 + value: -1.2283611 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[470].x @@ -13282,7 +13282,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[470].y - value: -1.019289 + value: -1.2269851 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[471].x @@ -13290,7 +13290,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[471].y - value: -1.0300752 + value: -1.215006 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[472].x @@ -13298,7 +13298,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[472].y - value: -1.0351385 + value: -1.2030269 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[473].x @@ -13306,7 +13306,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[473].y - value: -1.0243524 + value: -1.1910479 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[474].x @@ -13314,7 +13314,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[474].y - value: -1.0224335 + value: -1.1905019 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[475].x @@ -13322,7 +13322,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[475].y - value: -1.0328535 + value: -1.19093 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[476].x @@ -13330,7 +13330,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[476].y - value: -1.0323602 + value: -1.1913582 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[477].x @@ -13338,7 +13338,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[477].y - value: -1.021574 + value: -1.1831659 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[478].x @@ -13346,7 +13346,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[478].y - value: -1.0252119 + value: -1.1711869 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[479].x @@ -13354,7 +13354,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[479].y - value: -1.0356318 + value: -1.1592078 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[480].x @@ -13362,7 +13362,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[480].y - value: -1.0295819 + value: -1.1530441 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[481].x @@ -13370,7 +13370,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[481].y - value: -1.0187957 + value: -1.1534723 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[482].x @@ -13378,7 +13378,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[482].y - value: -1.0279902 + value: -1.1539005 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[483].x @@ -13386,7 +13386,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[483].y - value: -1.0375897 + value: -1.1512916 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[484].x @@ -13394,7 +13394,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[484].y - value: -1.0268036 + value: -1.1393125 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[485].x @@ -13402,7 +13402,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[485].y - value: -1.0199825 + value: -1.1273334 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[486].x @@ -13410,7 +13410,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[486].y - value: -1.0307685 + value: -1.1155864 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[487].x @@ -13418,7 +13418,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[487].y - value: -1.0348114 + value: -1.1160146 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[488].x @@ -13426,7 +13426,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[488].y - value: -1.0240252 + value: -1.1164427 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[489].x @@ -13434,7 +13434,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[489].y - value: -1.0227607 + value: -1.1168709 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[490].x @@ -13442,7 +13442,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[490].y - value: -1.0335468 + value: -1.1074724 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[491].x @@ -13450,7 +13450,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[491].y - value: -1.0316669 + value: -1.0954933 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[492].x @@ -13458,7 +13458,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[492].y - value: -1.0212469 + value: -1.0835143 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[493].x @@ -13466,7 +13466,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[493].y - value: -1.025539 + value: -1.0785836 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[494].x @@ -13474,7 +13474,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[494].y - value: -1.0389801 + value: -1.078985 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[495].x @@ -13482,7 +13482,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[495].y - value: -1.0470403 + value: -1.0794132 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[496].x @@ -13490,7 +13490,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[496].y - value: -1.0554608 + value: -1.0756323 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[497].x @@ -13498,7 +13498,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[497].y - value: -1.0673835 + value: -1.0636533 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[498].x @@ -13506,7 +13506,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[498].y - value: -1.0800874 + value: -1.0516742 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[499].x @@ -13514,7 +13514,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[499].y - value: -1.0927912 + value: -1.0411258 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[500].x @@ -13522,7 +13522,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[500].y - value: -1.1052449 + value: -1.041554 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[501].x @@ -13530,7 +13530,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[501].y - value: -1.1161224 + value: -1.0419822 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[502].x @@ -13538,7 +13538,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[502].y - value: -1.1241827 + value: -1.0424103 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[503].x @@ -13546,7 +13546,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[503].y - value: -1.132243 + value: -1.0297511 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[504].x @@ -13554,7 +13554,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[504].y - value: -1.1406634 + value: -1.0355542 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[505].x @@ -13562,7 +13562,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[505].y - value: -1.1487237 + value: -1.0248597 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[506].x @@ -13570,7 +13570,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[506].y - value: -1.1612177 + value: -1.0218349 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[507].x @@ -13578,7 +13578,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[507].y - value: -1.1739216 + value: -1.0325294 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[508].x @@ -13586,7 +13586,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[508].y - value: -1.1866255 + value: -1.0327759 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[509].x @@ -13594,7 +13594,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[509].y - value: -1.199079 + value: -1.0220813 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[510].x @@ -13602,7 +13602,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[510].y - value: -1.2093853 + value: -1.0246131 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[511].x @@ -13610,7 +13610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[511].y - value: -1.2174456 + value: -1.0353076 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[512].x @@ -13618,7 +13618,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[512].y - value: -1.225506 + value: -1.0299518 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[513].x @@ -13626,7 +13626,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[513].y - value: -1.2339263 + value: -1.0192572 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[514].x @@ -13634,7 +13634,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[514].y - value: -1.2423481 + value: -1.0274372 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[515].x @@ -13642,7 +13642,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[515].y - value: -1.255052 + value: -1.037868 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[516].x @@ -13650,7 +13650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[516].y - value: -1.2677559 + value: -1.0271734 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[517].x @@ -13658,7 +13658,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[517].y - value: -1.2802094 + value: -1.019521 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[518].x @@ -13666,7 +13666,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[518].y - value: -1.2929133 + value: -1.0302155 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[519].x @@ -13674,7 +13674,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[519].y - value: -1.3026483 + value: -1.0350897 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[520].x @@ -13682,7 +13682,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[520].y - value: -1.3107085 + value: -1.0243493 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[521].x @@ -13690,7 +13690,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[521].y - value: -1.319129 + value: -1.0223451 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[522].x @@ -13698,7 +13698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[522].y - value: -1.3271892 + value: -1.0330397 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[523].x @@ -13706,7 +13706,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[523].y - value: -1.3361824 + value: -1.0322657 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[524].x @@ -13714,7 +13714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[524].y - value: -1.3488863 + value: -1.021571 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[525].x @@ -13722,7 +13722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[525].y - value: -1.36159 + value: -1.0251234 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[526].x @@ -13730,7 +13730,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[526].y - value: -1.3740437 + value: -1.035818 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[527].x @@ -13738,7 +13738,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[527].y - value: -1.3867476 + value: -1.0294873 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[528].x @@ -13746,7 +13746,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[528].y - value: -1.3959112 + value: -1.018747 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[529].x @@ -13754,7 +13754,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[529].y - value: -1.3915448 + value: -1.0279475 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[530].x @@ -13762,7 +13762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[530].y - value: -1.389665 + value: -1.0373578 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[531].x @@ -13770,7 +13770,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[531].y - value: -1.395058 + value: -1.0266632 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[532].x @@ -13778,7 +13778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[532].y - value: -1.3955487 + value: -1.0200312 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[533].x @@ -13786,7 +13786,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[533].y - value: -1.3901557 + value: -1.0307258 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[534].x @@ -13794,7 +13794,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[534].y - value: -1.3910542 + value: -1.0345794 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[535].x @@ -13802,7 +13802,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[535].y - value: -1.3964472 + value: -1.0238849 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[536].x @@ -13810,7 +13810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[536].y - value: -1.3941596 + value: -1.0228095 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[537].x @@ -13818,7 +13818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[537].y - value: -1.3887664 + value: -1.0335499 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[538].x @@ -13826,7 +13826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[538].y - value: -1.3924433 + value: -1.0349337 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[539].x @@ -13834,7 +13834,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[539].y - value: -1.3978364 + value: -1.047575 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[540].x @@ -13842,7 +13842,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[540].y - value: -1.3927704 + value: -1.0602163 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[541].x @@ -13850,7 +13850,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[541].y - value: -1.3886225 + value: -1.0728576 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[542].x @@ -13858,7 +13858,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[542].y - value: -1.3940156 + value: -1.0837941 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[543].x @@ -13866,7 +13866,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[543].y - value: -1.3967743 + value: -1.0919445 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[544].x @@ -13874,7 +13874,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[544].y - value: -1.3913813 + value: -1.1000947 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[545].x @@ -13882,7 +13882,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[545].y - value: -1.3900117 + value: -1.1082001 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[546].x @@ -13890,7 +13890,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[546].y - value: -1.3954048 + value: -1.1163504 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[547].x @@ -13898,7 +13898,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[547].y - value: -1.3953851 + value: -1.1287367 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[548].x @@ -13906,7 +13906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[548].y - value: -1.389992 + value: -1.1413779 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[549].x @@ -13914,7 +13914,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[549].y - value: -1.3914008 + value: -1.1540192 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[550].x @@ -13922,7 +13922,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[550].y - value: -1.396794 + value: -1.1666605 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[551].x @@ -13930,7 +13930,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[551].y - value: -1.393996 + value: -1.177102 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[552].x @@ -13938,7 +13938,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[552].y - value: -1.3886029 + value: -1.1852523 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[553].x @@ -13946,7 +13946,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[553].y - value: -1.3927901 + value: -1.1934026 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[554].x @@ -13954,7 +13954,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[554].y - value: -1.3978168 + value: -1.2015079 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[555].x @@ -13962,7 +13962,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[555].y - value: -1.3926067 + value: -1.2098984 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[556].x @@ -13970,7 +13970,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[556].y - value: -1.3887861 + value: -1.2225397 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[557].x @@ -13978,7 +13978,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[557].y - value: -1.3941792 + value: -1.2351809 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[558].x @@ -13986,7 +13986,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[558].y - value: -1.3964276 + value: -1.2478222 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[559].x @@ -13994,7 +13994,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[559].y - value: -1.3910345 + value: -1.2604635 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[560].x @@ -14002,7 +14002,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[560].y - value: -1.3901753 + value: -1.27041 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[561].x @@ -14010,7 +14010,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[561].y - value: -1.3955684 + value: -1.2785603 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[562].x @@ -14018,7 +14018,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[562].y - value: -1.3950384 + value: -1.2866656 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[563].x @@ -14026,7 +14026,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[563].y - value: -1.2299143 + value: -1.2948159 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[564].x @@ -14034,7 +14034,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[564].y - value: -1.2299455 + value: -1.3037013 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[565].x @@ -14042,7 +14042,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[565].y - value: -1.2264872 + value: -1.3163426 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[566].x @@ -14050,7 +14050,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[566].y - value: -1.2249568 + value: -1.3289839 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[567].x @@ -14058,7 +14058,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[567].y - value: -1.2269583 + value: -1.3416252 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[568].x @@ -14066,7 +14066,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[568].y - value: -1.2271442 + value: -1.3542664 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[569].x @@ -14074,7 +14074,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[569].y - value: -1.2257279 + value: -1.3637179 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[570].x @@ -14082,7 +14082,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[570].y - value: -1.2280288 + value: -1.3718232 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[571].x @@ -14090,7 +14090,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[571].y - value: -1.2319499 + value: -1.3799735 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[572].x @@ -14098,7 +14098,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[572].y - value: -1.2320504 + value: -1.3881239 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[573].x @@ -14106,7 +14106,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[573].y - value: -1.2326063 + value: -1.388369 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[574].x @@ -14114,7 +14114,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[574].y - value: -1.2371372 + value: -1.3937162 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[575].x @@ -14122,7 +14122,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[575].y - value: -1.2401282 + value: -1.3969363 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[576].x @@ -14130,7 +14130,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[576].y - value: -1.2400093 + value: -1.391589 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[577].x @@ -14138,7 +14138,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[577].y - value: -1.2420402 + value: -1.3897581 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[578].x @@ -14146,7 +14146,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[578].y - value: -1.2457561 + value: -1.3951054 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[579].x @@ -14154,7 +14154,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[579].y - value: -1.2457267 + value: -1.3955243 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[580].x @@ -14162,7 +14162,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[580].y - value: -1.2440395 + value: -1.390177 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[581].x @@ -14170,7 +14170,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[581].y - value: -1.246027 + value: -1.3911701 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[582].x @@ -14178,7 +14178,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[582].y - value: -1.247113 + value: -1.3965174 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[583].x @@ -14186,7 +14186,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[583].y - value: -1.2438706 + value: -1.3941351 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[584].x @@ -14194,7 +14194,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[584].y - value: -1.2417463 + value: -1.3887879 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[585].x @@ -14202,7 +14202,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[585].y - value: -1.242112 + value: -1.3925593 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[586].x @@ -14210,7 +14210,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[586].y - value: -1.2398131 + value: -1.3979065 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[587].x @@ -14218,7 +14218,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[587].y - value: -1.2353214 + value: -1.3927231 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[588].x @@ -14226,7 +14226,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[588].y - value: -1.2341497 + value: -1.3886241 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[589].x @@ -14234,7 +14234,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[589].y - value: -1.2341207 + value: -1.3939713 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[590].x @@ -14242,7 +14242,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[590].y - value: -1.2301053 + value: -1.3966812 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[591].x @@ -14250,7 +14250,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[591].y - value: -1.2268531 + value: -1.3913339 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[592].x @@ -14258,7 +14258,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[592].y - value: -1.2277696 + value: -1.3900132 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[593].x @@ -14266,7 +14266,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[593].y - value: -1.2275313 + value: -1.3953605 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[594].x @@ -14274,7 +14274,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[594].y - value: -1.2249922 + value: -1.395292 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[595].x @@ -14282,7 +14282,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[595].y - value: -1.2254444 + value: -1.3899448 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[596].x @@ -14290,7 +14290,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[596].y - value: -1.2283913 + value: -1.3914253 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[597].x @@ -14298,7 +14298,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[597].y - value: -1.2284017 + value: -1.3967726 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[598].x @@ -14306,7 +14306,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[598].y - value: -1.2278237 + value: -1.39388 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[599].x @@ -14314,7 +14314,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[599].y - value: -1.2318254 + value: -1.3885326 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[600].x @@ -14322,7 +14322,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[600].y - value: -1.2354846 + value: -1.3928144 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[601].x @@ -14330,7 +14330,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[601].y - value: -1.2355429 + value: -1.3978381 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[602].x @@ -14338,7 +14338,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[602].y - value: -1.2372532 + value: -1.3924909 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[603].x @@ -14346,7 +14346,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[603].y - value: -1.241638 + value: -1.3888563 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[604].x @@ -14354,7 +14354,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[604].y - value: -1.2432327 + value: -1.3942037 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[605].x @@ -14362,7 +14362,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[605].y - value: -1.2425647 + value: -1.3964261 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[606].x @@ -14370,7 +14370,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[606].y - value: -1.2449183 + value: -1.3910787 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[607].x @@ -14378,7 +14378,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[607].y - value: -1.2477965 + value: -1.2307745 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[608].x @@ -14386,7 +14386,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[608].y - value: -1.2458096 + value: -1.2294425 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[609].x @@ -14394,7 +14394,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[609].y - value: -1.2439791 + value: -1.2259381 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[610].x @@ -14402,7 +14402,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[610].y - value: -1.2452985 + value: -1.2256767 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[611].x @@ -14410,7 +14410,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[611].y - value: -1.2444452 + value: -1.2276101 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[612].x @@ -14418,7 +14418,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[612].y - value: -1.240453 + value: -1.2264066 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[613].x @@ -14426,7 +14426,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[613].y - value: -1.2387717 + value: -1.2250613 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[614].x @@ -14434,7 +14434,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[614].y - value: -1.2387673 + value: -1.2285225 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[615].x @@ -14442,7 +14442,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[615].y - value: -1.2351837 + value: -1.2313731 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[616].x @@ -14450,7 +14450,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[616].y - value: -1.2307068 + value: -1.2311227 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[617].x @@ -14458,7 +14458,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[617].y - value: -1.230806 + value: -1.2330136 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[618].x @@ -14466,7 +14466,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[618].y - value: -1.2303914 + value: -1.2375358 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[619].x @@ -14474,7 +14474,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[619].y - value: -1.2267811 + value: -1.2392198 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[620].x @@ -14482,7 +14482,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[620].y - value: -1.2253356 + value: -1.2391344 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[621].x @@ -14490,7 +14490,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[621].y - value: -1.2271277 + value: -1.2425162 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[622].x @@ -14498,7 +14498,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[622].y - value: -1.2267874 + value: -1.2460988 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[623].x @@ -14506,7 +14506,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[623].y - value: -1.2252023 + value: -1.2449719 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[624].x @@ -14514,7 +14514,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[624].y - value: -1.227604 + value: -1.2444243 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[625].x @@ -14522,7 +14522,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[625].y - value: -1.2313743 + value: -1.2467278 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[626].x @@ -14530,7 +14530,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[626].y - value: -1.2310385 + value: -1.2465309 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[627].x @@ -14538,7 +14538,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[627].y - value: -1.2318674 + value: -1.2433501 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[628].x @@ -14546,7 +14546,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[628].y - value: -1.2363584 + value: -1.2425835 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[629].x @@ -14554,7 +14554,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[629].y - value: -1.2390953 + value: -1.2430222 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[630].x @@ -14562,7 +14562,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[630].y - value: -1.2390515 + value: -1.2393965 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[631].x @@ -14570,7 +14570,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[631].y - value: -1.2415038 + value: -1.2351459 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[632].x @@ -14578,7 +14578,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[632].y - value: -1.2453543 + value: -1.2350656 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[633].x @@ -14586,7 +14586,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[633].y - value: -1.2452273 + value: -1.2339307 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[634].x @@ -14594,7 +14594,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[634].y - value: -1.2437931 + value: -1.2296551 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[635].x @@ -14602,7 +14602,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[635].y - value: -1.2462559 + value: -1.2276953 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[636].x @@ -14610,7 +14610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[636].y - value: -1.2472378 + value: -1.2285529 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[637].x @@ -14618,7 +14618,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[637].y - value: -1.2441896 + value: -1.2269533 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[638].x @@ -14626,7 +14626,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[638].y - value: -1.2425171 + value: -1.2243288 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[639].x @@ -14634,7 +14634,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[639].y - value: -1.2430602 + value: -1.2260624 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[640].x @@ -14642,7 +14642,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[640].y - value: -1.240535 + value: -1.2286707 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[641].x @@ -14650,7 +14650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[641].y - value: -1.2360933 + value: -1.2275918 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[642].x @@ -14658,7 +14658,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[642].y - value: -1.2352049 + value: -1.228112 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[643].x @@ -14666,7 +14666,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[643].y - value: -1.2350641 + value: -1.2322537 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[644].x @@ -14674,7 +14674,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[644].y - value: -1.2307187 + value: -1.2345675 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[645].x @@ -14682,7 +14682,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[645].y - value: -1.2276341 + value: -1.2346296 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[646].x @@ -14690,7 +14690,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[646].y - value: -1.2283826 + value: -1.2376655 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[647].x @@ -14698,7 +14698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[647].y - value: -1.2276696 + value: -1.2420691 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[648].x @@ -14706,7 +14706,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[648].y - value: -1.2248924 + value: -1.242365 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[649].x @@ -14714,7 +14714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[649].y - value: -1.225444 + value: -1.2420738 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[650].x @@ -14722,7 +14722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[650].y - value: -1.2281867 + value: -1.2454883 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[651].x @@ -14730,7 +14730,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[651].y - value: -1.2277296 + value: -1.247198 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[652].x @@ -14738,7 +14738,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[652].y - value: -1.227118 + value: -1.2451587 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[653].x @@ -14746,7 +14746,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[653].y - value: -1.2311558 + value: -1.2447076 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[654].x @@ -14754,7 +14754,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[654].y - value: -1.2344553 + value: -1.2460737 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[655].x @@ -14762,7 +14762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[655].y - value: -1.2344826 + value: -1.2439524 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[656].x @@ -14770,7 +14770,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[656].y - value: -1.2365112 + value: -1.2400061 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[657].x @@ -14778,7 +14778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[657].y - value: -1.2409434 + value: -1.2396779 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[658].x @@ -14786,7 +14786,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[658].y - value: -1.2423666 + value: -1.2393056 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[659].x @@ -14794,7 +14794,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[659].y - value: -1.2418472 + value: -1.2347773 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[660].x @@ -14802,7 +14802,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[660].y - value: -1.2446874 + value: -1.2315629 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[661].x @@ -14810,7 +14810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[661].y - value: -1.2475473 + value: -1.23169 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[662].x @@ -14818,7 +14818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[662].y - value: -1.2456831 + value: -1.2299231 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[663].x @@ -14826,7 +14826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[663].y - value: -1.2443442 + value: -1.2262444 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[664].x @@ -14834,7 +14834,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[664].y - value: -1.2458618 + value: -1.2260917 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[665].x @@ -14842,7 +14842,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[665].y - value: -1.2448802 + value: -1.2278154 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[666].x @@ -14850,7 +14850,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[666].y - value: -1.2410548 + value: -1.2260946 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[667].x @@ -14858,7 +14858,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[667].y - value: -1.2397594 + value: -1.2248465 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[668].x @@ -14866,7 +14866,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[668].y - value: -1.2398146 + value: -1.2281232 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[669].x @@ -14874,7 +14874,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[669].y - value: -1.2359425 + value: -1.2305213 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[670].x @@ -14882,7 +14882,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[670].y - value: -1.2316637 + value: -1.2301528 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[671].x @@ -14890,7 +14890,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[671].y - value: -1.2317433 + value: -1.2322686 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[672].x @@ -14898,7 +14898,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[672].y - value: -1.2309207 + value: -1.2367638 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[673].x @@ -14906,7 +14906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[673].y - value: -1.2271243 + value: -1.2381654 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[674].x @@ -14914,7 +14914,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[674].y - value: -1.225795 + value: -1.2381502 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[675].x @@ -14922,7 +14922,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[675].y - value: -1.2273813 + value: -1.2419482 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[676].x @@ -14930,7 +14930,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[676].y - value: -1.2265478 + value: -1.245386 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[677].x @@ -14938,7 +14938,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[677].y - value: -1.2247211 + value: -1.2444413 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[678].x @@ -14946,7 +14946,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[678].y - value: -1.2272727 + value: -1.2443931 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[679].x @@ -14954,7 +14954,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[679].y - value: -1.2305803 + value: -1.2469087 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[680].x @@ -14962,7 +14962,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[680].y - value: -1.2301083 + value: -1.2466216 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[681].x @@ -14970,7 +14970,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[681].y - value: -1.2311319 + value: -1.2436385 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[682].x @@ -14978,7 +14978,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[682].y - value: -1.2356007 + value: -1.2433509 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[683].x @@ -14986,7 +14986,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[683].y - value: -1.2380457 + value: -1.2439262 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[684].x @@ -14994,7 +14994,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[684].y - value: -1.2380582 + value: -1.2401047 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[685].x @@ -15002,7 +15002,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[685].y - value: -1.2408938 + value: -1.2362069 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[686].x @@ -15010,7 +15010,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[686].y - value: -1.2449086 + value: -1.2361338 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[687].x @@ -15018,7 +15018,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[687].y - value: -1.2446517 + value: -1.2346603 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[688].x @@ -15026,7 +15026,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[688].y - value: -1.243696 + value: -1.2302966 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[689].x @@ -15034,7 +15034,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[689].y - value: -1.2463682 + value: -1.2285085 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[690].x @@ -15042,7 +15042,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[690].y - value: -1.2472519 + value: -1.2292006 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[691].x @@ -15050,7 +15050,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[691].y - value: -1.2444336 + value: -1.2271044 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[692].x @@ -15058,7 +15058,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[692].y - value: -1.2432235 + value: -1.2242757 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[693].x @@ -15066,7 +15066,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[693].y - value: -1.2439176 + value: -1.2260936 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[694].x @@ -15074,7 +15074,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[694].y - value: -1.2412043 + value: -1.2281984 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[695].x @@ -15082,7 +15082,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[695].y - value: -1.2368323 + value: -1.2269303 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[696].x @@ -15090,7 +15090,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[696].y - value: -1.2362654 + value: -1.2275854 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[697].x @@ -15098,7 +15098,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[697].y - value: -1.2358153 + value: -1.2316035 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[698].x @@ -15106,7 +15106,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[698].y - value: -1.2313949 + value: -1.2335291 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[699].x @@ -15114,7 +15114,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[699].y - value: -1.2285132 + value: -1.2335545 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[700].x @@ -15122,7 +15122,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[700].y - value: -1.229066 + value: -1.2369075 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[701].x @@ -15130,7 +15130,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[701].y - value: -1.2278872 + value: -1.2413694 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[702].x @@ -15138,7 +15138,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[702].y - value: -1.2249068 + value: -1.241474 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[703].x @@ -15146,7 +15146,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[703].y - value: -1.2255579 + value: -1.241625 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[704].x @@ -15154,7 +15154,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[704].y - value: -1.2280619 + value: -1.2452164 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[705].x @@ -15162,7 +15162,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[705].y - value: -1.2271287 + value: -1.2468283 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[706].x @@ -15170,7 +15170,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[706].y - value: -1.226629 + value: -1.2449961 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[707].x @@ -15178,7 +15178,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[707].y - value: -1.2305502 + value: -1.2450615 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[708].x @@ -15186,7 +15186,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[708].y - value: -1.2334516 + value: -1.2466288 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[709].x @@ -15194,7 +15194,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[709].y - value: -1.2334291 + value: -1.2443855 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[710].x @@ -15202,7 +15202,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[710].y - value: -1.2357377 + value: -1.2405877 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[711].x @@ -15210,7 +15210,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[711].y - value: -1.2402359 + value: -1.2406664 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[712].x @@ -15218,7 +15218,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[712].y - value: -1.2414105 + value: -1.2400622 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[713].x @@ -15226,7 +15226,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[713].y - value: -1.2410662 + value: -1.235551 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[714].x @@ -15234,7 +15234,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[714].y - value: -1.2443562 + value: -1.2326069 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[715].x @@ -15242,7 +15242,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[715].y - value: -1.2471274 + value: -1.2326548 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[716].x @@ -15250,7 +15250,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[716].y - value: -1.24544 + value: -1.2304608 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[717].x @@ -15258,7 +15258,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[717].y - value: -1.2446265 + value: -1.2266259 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[718].x @@ -15266,7 +15266,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[718].y - value: -1.246348 + value: -1.2265832 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[719].x @@ -15274,7 +15274,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[719].y - value: -1.2452705 + value: -1.2281015 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[720].x @@ -15282,7 +15282,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[720].y - value: -1.2415817 + value: -1.2258712 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[721].x @@ -15290,7 +15290,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[721].y - value: -1.2407109 + value: -1.2247115 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[722].x @@ -15298,7 +15298,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[722].y - value: -1.2408439 + value: -1.2277976 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[723].x @@ -15306,7 +15306,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[723].y - value: -1.2367209 + value: -1.2297227 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[724].x @@ -15314,7 +15314,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[724].y - value: -1.2327484 + value: -1.22922 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[725].x @@ -15322,7 +15322,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[725].y - value: -1.2327195 + value: -1.2315454 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[726].x @@ -15330,7 +15330,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[726].y - value: -1.231505 + value: -1.2359945 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[727].x @@ -15338,7 +15338,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[727].y - value: -1.2275602 + value: -1.2371016 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[728].x @@ -15346,7 +15346,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[728].y - value: -1.2263688 + value: -1.2371376 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[729].x @@ -15354,7 +15354,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[729].y - value: -1.2277522 + value: -1.2413297 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[730].x @@ -15362,7 +15362,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[730].y - value: -1.2263925 + value: -1.2446084 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[731].x @@ -15370,7 +15370,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[731].y - value: -1.2243558 + value: -1.2438302 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[732].x @@ -15378,7 +15378,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[732].y - value: -1.2269913 + value: -1.2442826 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[733].x @@ -15386,7 +15386,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[733].y - value: -1.2298026 + value: -1.2470081 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[734].x @@ -15394,7 +15394,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[734].y - value: -1.2292248 + value: -1.2466326 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[735].x @@ -15402,7 +15402,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[735].y - value: -1.2304257 + value: -1.2438533 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[736].x @@ -15410,7 +15410,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[736].y - value: -1.234835 + value: -1.2440473 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[737].x @@ -15418,7 +15418,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[737].y - value: -1.2369441 + value: -1.244778 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[738].x @@ -15426,7 +15426,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[738].y - value: -1.2370368 + value: -1.2407776 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[739].x @@ -15434,7 +15434,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[739].y - value: -1.2402383 + value: -1.2372513 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[740].x @@ -15442,7 +15442,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[740].y - value: -1.2443793 + value: -1.2372104 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[741].x @@ -15450,7 +15450,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[741].y - value: -1.2439656 + value: -1.2354101 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[742].x @@ -15458,7 +15458,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[742].y - value: -1.2435184 + value: -1.2309762 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[743].x @@ -15466,7 +15466,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[743].y - value: -1.2463963 + value: -1.2293735 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[744].x @@ -15474,7 +15474,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[744].y - value: -1.2472099 + value: -1.2299134 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[745].x @@ -15482,7 +15482,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[745].y - value: -1.2445722 + value: -1.2273381 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[746].x @@ -15490,7 +15490,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[746].y - value: -1.2438977 + value: -1.2243068 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[747].x @@ -15498,7 +15498,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[747].y - value: -1.244719 + value: -1.2262096 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[748].x @@ -15506,7 +15506,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[748].y - value: -1.2418526 + value: -1.2278031 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[749].x @@ -15514,7 +15514,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[749].y - value: -1.2375678 + value: -1.2263372 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[750].x @@ -15522,7 +15522,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[750].y - value: -1.237366 + value: -1.2271227 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[751].x @@ -15530,7 +15530,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[751].y - value: -1.2365832 + value: -1.2309966 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[752].x @@ -15538,7 +15538,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[752].y - value: -1.2321063 + value: -1.2325239 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[753].x @@ -15546,7 +15546,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[753].y - value: -1.2294048 + value: -1.2324935 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[754].x @@ -15554,7 +15554,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[754].y - value: -1.2298545 + value: -1.2361363 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[755].x @@ -15562,7 +15562,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[755].y - value: -1.228181 + value: -1.240621 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[756].x @@ -15570,7 +15570,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[756].y - value: -1.2250038 + value: -1.2405305 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[757].x @@ -15578,7 +15578,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[757].y - value: -1.2257272 + value: -1.2411164 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[758].x @@ -15586,7 +15586,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[758].y - value: -1.2280478 + value: -1.2448734 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[759].x @@ -15594,7 +15594,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[759].y - value: -1.226603 + value: -1.2463726 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[760].x @@ -15602,7 +15602,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[760].y - value: -1.2262042 + value: -1.2447522 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[761].x @@ -15610,7 +15610,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[761].y - value: -1.2299745 + value: -1.2453274 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[762].x @@ -15618,7 +15618,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[762].y - value: -1.2324396 + value: -1.2471011 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[763].x @@ -15626,7 +15626,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[763].y - value: -1.2323474 + value: -1.24475 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[764].x @@ -15634,7 +15634,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[764].y - value: -1.2349589 + value: -1.2411873 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[765].x @@ -15642,7 +15642,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[765].y - value: -1.2394848 + value: -1.2416211 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[766].x @@ -15650,7 +15650,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[766].y - value: -1.2404526 + value: -1.2407961 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[767].x @@ -15658,7 +15658,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[767].y - value: -1.2401872 + value: -1.2363216 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[768].x @@ -15666,7 +15666,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[768].y - value: -1.2439544 + value: -1.2336644 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[769].x @@ -15674,7 +15674,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[769].y - value: -1.246628 + value: -1.2336515 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[770].x @@ -15682,7 +15682,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[770].y - value: -1.2451439 + value: -1.2310548 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[771].x @@ -15690,7 +15690,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[771].y - value: -1.2200031 + value: -1.2270749 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[772].x @@ -15698,7 +15698,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[772].y - value: -1.2205914 + value: -1.2271521 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[773].x @@ -15706,7 +15706,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[773].y - value: -1.2209662 + value: -1.22835 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[774].x @@ -15714,7 +15714,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[774].y - value: -1.2137042 + value: -1.2257291 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[775].x @@ -15722,7 +15722,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[775].y - value: -1.2017939 + value: -1.2246622 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[776].x @@ -15730,7 +15730,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[776].y - value: -1.1896088 + value: -1.2275441 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[777].x @@ -15738,7 +15738,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[777].y - value: -1.1826788 + value: -1.2289927 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[778].x @@ -15746,7 +15746,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[778].y - value: -1.1830536 + value: -1.2283415 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[779].x @@ -15754,7 +15754,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[779].y - value: -1.1834284 + value: -1.230854 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[780].x @@ -15762,7 +15762,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[780].y - value: -1.1819673 + value: -1.2352378 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[781].x @@ -15770,7 +15770,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[781].y - value: -1.1697822 + value: -1.2360309 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[782].x @@ -15778,7 +15778,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[782].y - value: -1.1578717 + value: -1.2362684 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[783].x @@ -15786,7 +15786,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[783].y - value: -1.1459614 + value: -1.2406695 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[784].x @@ -15794,7 +15794,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[784].y - value: -1.1455158 + value: -1.2437662 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[785].x @@ -15802,7 +15802,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[785].y - value: -1.1461041 + value: -1.2431518 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[786].x @@ -15810,7 +15810,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[786].y - value: -1.1464789 + value: -1.2440883 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[787].x @@ -15818,7 +15818,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[787].y - value: -1.1380451 + value: -1.2470189 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[788].x @@ -15826,7 +15826,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[788].y - value: -1.1261346 + value: -1.246559 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[789].x @@ -15834,7 +15834,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[789].y - value: -1.1139497 + value: -1.2439884 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[790].x @@ -15842,7 +15842,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[790].y - value: -1.1081915 + value: -1.2446774 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[791].x @@ -15850,7 +15850,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[791].y - value: -1.1085663 + value: -1.2453523 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[792].x @@ -15858,7 +15858,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[792].y - value: -1.1089411 + value: -1.2414057 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[793].x @@ -15866,7 +15866,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[793].y - value: -1.1060333 + value: -1.2382767 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[794].x @@ -15874,7 +15874,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[794].y - value: -1.094123 + value: -1.2382767 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[795].x @@ -15882,7 +15882,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[795].y - value: -1.0822126 + value: -1.2361768 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[796].x @@ -15890,7 +15890,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[796].y - value: -1.0706537 + value: -1.2316918 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[797].x @@ -15898,7 +15898,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[797].y - value: -1.0710285 + value: -1.2302889 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[798].x @@ -15906,7 +15906,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[798].y - value: -1.0716169 + value: -1.230691 objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[799].x @@ -15914,7 +15914,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 4738665139271349446, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_Positions.Array.data[799].y - value: -1.0719916 + value: -1.2276444 objectReference: {fileID: 0} - target: {fileID: 6528188484605802245, guid: 7f4c602d6453eb741b937d0efdb26f9d, type: 3} propertyPath: m_SizeDelta.x From 65d895798ff8a5edae20861b293aa9a060ebda4f Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 8 Jul 2026 15:21:23 +0800 Subject: [PATCH 05/47] =?UTF-8?q?scene(camera):=20=E6=B7=BB=E5=8A=A0=20Dre?= =?UTF-8?q?am=20Camera=20=E9=95=9C=E5=A4=B4=E6=B7=B7=E5=90=88=E8=A7=84?= =?UTF-8?q?=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增从任意相机切换到 Dream Camera 的混合配置 --- Assets/CameraData/Main Camera Blends.asset | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Assets/CameraData/Main Camera Blends.asset b/Assets/CameraData/Main Camera Blends.asset index af8cc3079..79429ade6 100644 --- a/Assets/CameraData/Main Camera Blends.asset +++ b/Assets/CameraData/Main Camera Blends.asset @@ -244,3 +244,14 @@ MonoBehaviour: m_PreInfinity: 0 m_PostInfinity: 0 m_RotationOrder: 0 + - m_From: '**ANY CAMERA**' + m_To: Dream Camera + m_Blend: + m_Style: 0 + m_Time: 2 + m_CustomCurve: + serializedVersion: 2 + m_Curve: [] + m_PreInfinity: 0 + m_PostInfinity: 0 + m_RotationOrder: 0 From 558706ee08eb7983d4bbb2ae35d71a702e075273 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 8 Jul 2026 15:21:27 +0800 Subject: [PATCH 06/47] =?UTF-8?q?scene(render):=20=E6=B8=85=E7=90=86=20Ren?= =?UTF-8?q?derer2Dtest=20=E4=B8=AD=20VolFx=20=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 VolFx Renderer Feature 及相关引用 --- Assets/Render/Renderer2Dtest.asset | 39 +----------------------------- 1 file changed, 1 insertion(+), 38 deletions(-) diff --git a/Assets/Render/Renderer2Dtest.asset b/Assets/Render/Renderer2Dtest.asset index 603255831..43fc54260 100644 --- a/Assets/Render/Renderer2Dtest.asset +++ b/Assets/Render/Renderer2Dtest.asset @@ -14,42 +14,6 @@ MonoBehaviour: m_EditorClassIdentifier: _active: 1 _shader: {fileID: 4800000, guid: 2bc242da8bd3afc46b9a21ba0353488a, type: 3} ---- !u!114 &-5944937020451865993 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9c53165b379c3d94ca34b12cb8eb10f1, type: 3} - m_Name: VolFx - m_EditorClassIdentifier: - m_Active: 1 - _event: 550 - _format: - enabled: 1 - value: 0 - _mask: - enabled: 1 - value: - serializedVersion: 2 - m_Bits: 32 - _source: - _source: 1 - _globalTex: _inputTex - _renderTex: {fileID: 0} - _pool: {fileID: 0} - _output: - _output: 0 - _renderTex: {fileID: 0} - _outputTex: _VolFxTex - _sortingOrder: 0 - _camDistance: 100 - _passes: - m_List: [] - _blitShader: {fileID: 4800000, guid: a8a709d9db2241741ab3032b946ef258, type: 3} --- !u!114 &-5125607493159684606 MonoBehaviour: m_ObjectHideFlags: 3 @@ -274,9 +238,8 @@ MonoBehaviour: m_RendererFeatures: - {fileID: 8662106111246897391} - {fileID: 3859429700647655299} - - {fileID: -5944937020451865993} - {fileID: 7237630548273206629} - m_RendererFeatureMap: ef909c479dfb35788317b256dd728f3577bae50b47577fad65155715a33a7164 + m_RendererFeatureMap: ef909c479dfb35788317b256dd728f3565155715a33a7164 m_UseNativeRenderPass: 0 m_TransparencySortMode: 0 m_TransparencySortAxis: {x: 0, y: 1, z: 0} From 2a8d82fd2eb26e6047765f77ff711a89d955e1bb Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 8 Jul 2026 15:21:33 +0800 Subject: [PATCH 07/47] =?UTF-8?q?art(ui):=20=E6=9B=B4=E6=96=B0=E5=AD=97?= =?UTF-8?q?=E4=BD=93=20SDF=20=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 更新 ChillBitmap 16px 与 WenQuanYi Bitmap Song 14px 的 SDF 图集 --- Assets/Font/Assets/ChillBitmap_16px SDF.asset | 4 ++-- Assets/Font/Assets/WenQuanYi Bitmap Song 14px SDF.asset | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Assets/Font/Assets/ChillBitmap_16px SDF.asset b/Assets/Font/Assets/ChillBitmap_16px SDF.asset index 9e08b358c..b09bfd888 100644 --- a/Assets/Font/Assets/ChillBitmap_16px SDF.asset +++ b/Assets/Font/Assets/ChillBitmap_16px SDF.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7f7b60b463f038cc41cd5105bcf00f29e4018f4720d98b44203f7b28aaa88e2c -size 68983050 +oid sha256:170c0afe6570a4dbf24dd9e83b44510413ac2d9e61b47962383b2217b637113f +size 18639284 diff --git a/Assets/Font/Assets/WenQuanYi Bitmap Song 14px SDF.asset b/Assets/Font/Assets/WenQuanYi Bitmap Song 14px SDF.asset index 0b5453247..9ad3e167c 100644 --- a/Assets/Font/Assets/WenQuanYi Bitmap Song 14px SDF.asset +++ b/Assets/Font/Assets/WenQuanYi Bitmap Song 14px SDF.asset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0dda62cf1d5d85b9e7f4da321263cdc540466620ee803ccc9bcac5e8ada4c5b5 -size 69086225 +oid sha256:b79cb79daf452cc55e371ddbbf1d40503926e494577e2e69af8974334a9483fc +size 10242249 From 52d7656c306b15205b03b45c78c9a69deb397432 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Sat, 11 Jul 2026 16:17:09 +0800 Subject: [PATCH 08/47] =?UTF-8?q?docs:=20=E5=8A=A8=E7=94=BB=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=9C=AA=E5=AE=8C=E6=88=90=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/动画系统需求整理.md | 601 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 601 insertions(+) create mode 100644 Docs/动画系统需求整理.md diff --git a/Docs/动画系统需求整理.md b/Docs/动画系统需求整理.md new file mode 100644 index 000000000..6a97617b8 --- /dev/null +++ b/Docs/动画系统需求整理.md @@ -0,0 +1,601 @@ +# 自研帧动画系统需求文档 + +> 当前文档处于需求梳理阶段。目标是先把系统边界、数据结构、编辑器工作流和运行时接入方式说清楚,再进入具体技术设计与实现。 + +## 1. 背景与问题 + +### 1.1 项目背景 + +本项目是 2D 像素风格 AVG / 视觉小说游戏,动画主要服务于角色立绘、场景物件和少量 UI 表现。当前项目中,大部分序列帧动画显示在 `SpriteRenderer` 上,少量显示在 UI `Image` 上。 + +现阶段主要使用 Unity 原生 Animator / AnimationClip / Timeline 等系统完成表现。其中 Animator 更适合状态机式角色动作,而本项目大量需求更接近“演出编排”:播放一个片段、接另一个片段、最后进入 Idle,或者停留在某一帧。 + +### 1.2 当前痛点 + +#### Unity Animator / AnimationClip 相关 + +1. 状态机模型与项目需求不匹配 + Unity Animator 的核心是状态机,适合玩家可控角色在多个状态之间切换;本项目常见需求是线性演出、片段编排、播完后进入 Idle 或停在终帧。 + +2. 资产结构臃肿 + 简单序列帧动画也需要 `Animator Controller`、`Animation Clip`、Sprite 绑定等多层资源。资源关系依赖 Unity 序列化引用,更新和排查成本高。 + +3. 预览体验差 + Animator Controller 难以直接预览,Animation Clip 预览通常需要依附 GameObject。策划或美术无法轻松检查一个片段或一组片段的最终效果。 + +4. 帧内容不可读、不可维护 + Animation Clip 内部通过 Unity 对象引用记录 Sprite,难以直观看到每一帧具体使用了哪个 Sprite、持续多久,也不方便做批量替换或差异检查。 + +#### 美术资产导入相关 + +1. Aseprite 导入链路不稳定 + 当前美术使用 Aseprite 生产资源。Unity Aseprite Importer 存在中文 Tag 支持不佳、资源更新后 Clip 重新生成导致引用关系变化等问题。 + +2. 现有 AnimationClip 生成器只能部分解决问题 + 项目中已有 PNG + JSON -> 切图 -> 生成 AnimationClip 的工具,但最终产物仍然是 Unity AnimationClip,仍然保留了 Animator / Clip 体系的维护成本。 + +3. 美术更新成本高 + 理想流程应当是:美术更新 PNG / JSON 后,策划或开发点击刷新,已有动画资产保持引用不变,只更新帧数据和 Sprite 映射。 + +### 1.3 文档目标 + +本文档希望定义一个独立于 Unity Animator Controller 的自研帧动画系统,重点解决: + +- 序列帧动画的数据结构 +- PNG / Aseprite JSON 等来源的导入与刷新 +- Clip / AnimationSet / Sequence 的组织关系 +- 编辑器内预览、检查和编排工作流 +- 运行时播放器接口 +- 与现有 Actor、Yarn、AnimatorCenter、存档系统的兼容与迁移路径 + +## 2. 系统目标与非目标 + +### 2.1 核心目标 + +1. 支持 SpriteRenderer 和 UI Image 的序列帧播放。 +2. 支持单个动画片段独立播放、预览、刷新和检查。 +3. 支持同一对象的一组动画片段集中管理。 +4. 支持简单演出编排,例如“播放一次动作 -> 进入 Idle 循环 -> 停在最后一帧”。 +5. 支持从 Aseprite JSON / PNG 生成动画数据,并在资源更新时保持动画资产引用稳定。 +6. 提供不依赖场景 GameObject 的编辑器预览能力。 +7. 为运行时代码提供清晰、稳定、可迁移的播放 API。 + +### 2.2 非目标 + +第一阶段不尝试替代以下系统: + +1. Unity Timeline 的多轨演出能力。 +2. DOTween 等 Tween 动效系统。 +3. Cinemachine 镜头系统。 +4. 骨骼动画、网格变形、复杂 Transform 曲线动画。 +5. 完整可视化节点编辑器或通用状态机编辑器。 + +### 2.3 第一阶段范围建议 + +第一阶段建议聚焦: + +- `FrameClip`:单个序列帧片段。 +- `AnimationSet`:同一对象的一组 `FrameClip`。 +- 简单 `Sequence`:线性片段队列 + 结束行为。 +- `FrameAnimationPlayer`:运行时播放器。 +- Clip / Set 的基础编辑器和预览。 + +复杂图编辑器、条件分支、随机播放、批量迁移工具可以放到后续阶段。 + +## 3. 术语与概念 + +### 3.1 Frame + +单帧数据,描述某一时间段内应该显示的 Sprite。 + +候选字段: + +- `Sprite sprite` +- `float duration` +- `string frameName` +- `int sourceIndex` + +待讨论: + +- `duration` 使用秒还是毫秒? +- 是否需要记录来源 rect / pivot / tag 等导入信息? + +### 3.2 FrameClip + +最小可播放动画片段,由一组 Frame 组成。 + +候选职责: + +- 保存帧列表。 +- 保存默认播放速度。 +- 保存默认结束行为。 +- 保存导入来源。 +- 提供总时长、帧数等只读信息。 + +待讨论: + +- Clip 是否应当保存 loop,还是只保存 default end behavior? +- 导入生成的 Clip 是否允许手动编辑帧表? +- Clip 作为独立 `.asset` 保存,还是作为 AnimationSet 的 sub-asset 保存? + +### 3.3 AnimationSet + +同一对象的一组动画片段集合。例如一个角色、一个场景物件或一个 UI 元件的所有动画。 + +候选职责: + +- 维护 Clip 名称到 Clip 的映射。 +- 维护默认 Idle Clip。 +- 维护导入来源列表。 +- 支持刷新导入来源后按名称更新已有 Clip。 +- 提供编辑器集中预览。 + +待讨论: + +- 原文中的 `Library` 是否改名为 `AnimationSet`? +- Set 内 Clip 是否必须唯一命名? +- Set 是否负责 Sequence,还是 Sequence 独立成资产? + +### 3.4 Sequence + +一段演出编排,描述多个 Clip 的播放顺序和结束策略。 + +候选能力: + +- 线性播放:`Clip A -> Clip B -> Clip C` +- 播完进入 Idle:`Intro -> Idle(loop)` +- 播完停在最后一帧 +- 播完隐藏目标 + +待讨论: + +- 第一阶段是否只做线性 Sequence? +- Sequence 是否需要独立资产? +- Sequence 是否应该支持分支、随机、条件判断? + +### 3.5 Player / Controller + +运行时负责推进时间、设置 Sprite、响应代码调用的组件。 + +候选拆分: + +- `FrameAnimationPlayer`:底层播放逻辑。 +- `FrameAnimationController`:挂载在 GameObject 上,对外暴露 `Play("clipName")` 等接口。 +- `IFrameAnimationTarget`:统一封装 SpriteRenderer / Image。 + +待讨论: + +- 是否需要一个类似 `AnimatorCenter` 的全局注册中心? +- 是否沿用现有 `animatorName + stateName` 的外部调用模型? + +## 4. 数据结构需求 + +### 4.1 FrameClip 数据 + +候选字段: + +```csharp +string clipName; +List frames; +float speed; +EndBehavior defaultEndBehavior; +ImportSource importSource; +bool isGenerated; +``` + +候选结束行为: + +- `Stop` +- `HoldLastFrame` +- `Loop` +- `Clear` +- `HideTarget` + +待讨论: + +- `Stop` 和 `HoldLastFrame` 是否需要区分? +- 循环播放是 Clip 的默认属性,还是 Play 请求的属性? + +### 4.2 AnimationSet 数据 + +候选字段: + +```csharp +string setName; +List clips; +string defaultClipName; +List importSources; +``` + +待讨论: + +- Clip 引用外部资产,还是作为 Set 的子资产? +- 如果刷新后某个 Clip 名称消失,应该删除、标记 missing,还是保留旧数据? +- 如果刷新后出现同名 Clip,如何处理冲突? + +### 4.3 Sequence 数据 + +候选字段: + +```csharp +string sequenceName; +List steps; +EndBehavior finalBehavior; +string fallbackIdleClipName; +``` + +待讨论: + +- `SequenceStep` 是否只需要 clipName + overrideEndBehavior? +- 是否需要 step-level speed、事件、等待时间? +- 是否需要在某一帧触发事件? + +### 4.4 ImportSource 数据 + +候选来源类型: + +- `Manual` +- `AsepriteJsonAndTexture` +- `ManualGridJsonAndTexture` + +候选字段: + +```csharp +ImportSourceType type; +Texture2D texture; +TextAsset json; +Vector2 pivot; +bool generateSpritesIfNeeded; +``` + +待讨论: + +- 是否允许一个 AnimationSet 管理多组 PNG / JSON? +- 切图结果是否直接修改原 Texture Importer? +- 是否需要保存上次导入摘要,用于显示差异? + +## 5. 资产导入与刷新需求 + +### 5.1 Aseprite JSON 导入 + +系统应支持读取 Aseprite 导出的 JSON: + +- 读取 `frames` 中的帧 rect 和 duration。 +- 读取 `meta.frameTags` 作为 Clip 名称和帧范围。 +- 支持 `forward`、`reverse`、`pingpong` 等方向。 +- 支持中文 Tag 名称。 + +待讨论: + +- 是否在导入时保留 Aseprite 原始 frameName? +- `pingpong` 是否展开成实际帧列表? + +### 5.2 手动 Grid JSON 导入 + +系统可以复用现有生成器里的手动 JSON 思路: + +- 配置 rows / columns / frameCount。 +- 配置全局 frameDuration。 +- 配置每个动画片段的 frameIndices。 + +待讨论: + +- 这个格式是否继续保留? +- 是否需要提供 JSON 模板和校验工具? + +### 5.3 刷新策略 + +刷新时应尽量保持已有资产引用稳定。 + +候选规则: + +1. 以 Clip 名称作为匹配键。 +2. 同名 Clip 原地更新帧数据。 +3. 新 Clip 自动加入。 +4. 消失的 Clip 标记为 missing,等待用户确认是否删除。 +5. 手动修改过的字段不被刷新覆盖,除非用户选择强制刷新。 + +待讨论: + +- 哪些字段属于导入生成,哪些字段允许用户覆盖? +- 是否需要刷新前预览差异? + +## 6. 编辑器需求 + +### 6.1 FrameClip Inspector + +基础能力: + +- 显示 Clip 名称、总时长、帧数、默认结束行为。 +- 显示帧表:序号、Sprite、duration、来源 frameName。 +- 支持不依赖场景 GameObject 的预览。 +- 支持播放、暂停、逐帧、调整预览速度。 + +手动 Clip: + +- 帧表可编辑。 +- 可增删帧、替换 Sprite、修改 duration。 + +导入 Clip: + +- 帧表默认只读。 +- 可以跳转到 ImportSource。 +- 可以刷新来源。 + +待讨论: + +- 是否允许导入 Clip 局部覆盖某一帧? +- 预览区域是否需要显示透明棋盘格、原始尺寸、缩放倍率? + +### 6.2 AnimationSet Editor + +基础能力: + +- 显示 Set 内所有 Clip。 +- 每个 Clip 有小预览窗口。 +- 支持搜索、排序、重命名、检查重复名。 +- 支持设置默认 Idle / 默认 Clip。 +- 支持从导入来源批量刷新。 +- 支持侧边预览完整 Sequence 或单个 Clip。 + +待讨论: + +- 第一版是否做独立 EditorWindow,而不是只做 Inspector? +- 是否需要拖拽排序? +- Clip 小窗全部实时播放是否会影响编辑器性能? + +### 6.3 Sequence Editor + +第一阶段建议做轻量列表式编辑: + +- 添加 Step。 +- 选择 Clip。 +- 设置 Step 播放策略。 +- 设置最终行为。 +- 一键从头预览。 + +后续再考虑节点图或连线式编辑。 + +待讨论: + +- 是否真的需要节点图? +- Sequence 是否需要与 Yarn / Timeline 联动显示? + +### 6.4 校验与错误提示 + +编辑器应能检查: + +- 空 Sprite。 +- duration 小于等于 0。 +- Clip 重名。 +- Sequence 引用不存在的 Clip。 +- ImportSource 缺少 texture 或 json。 +- JSON 中 Tag 重名。 +- 刷新后丢失的 Clip。 + +## 7. 运行时需求 + +### 7.1 播放目标 + +必须支持: + +- `SpriteRenderer` +- `UnityEngine.UI.Image` + +可选支持: + +- 未来扩展到其他自定义 Sprite 显示组件。 + +### 7.2 播放接口 + +候选接口: + +```csharp +Play(string clipName); +Play(string clipName, EndBehavior endBehavior); +Loop(string clipName); +Queue(string clipName); +Stop(); +Pause(); +Resume(); +Seek(float timeSeconds); +SetSpeed(float speed); +GetCurrentClipName(); +GetPlaybackTime(); +GetDuration(); +``` + +待讨论: + +- `Loop` 是否只是 `Play(..., Loop)` 的快捷方法? +- `Queue` 第一阶段是否需要? +- 是否需要异步协程接口:`IEnumerator PlayAsync(...)`? + +### 7.3 播放行为 + +需要明确: + +- 播放新 Clip 时是否从第 0 帧开始。 +- 播放同一 Clip 时是否重播。 +- Stop 后停在哪一帧。 +- Pause 是否冻结当前帧。 +- HideTarget 是否由播放器设置 GameObject active,还是只清空 Sprite / alpha。 + +### 7.4 时间推进 + +待设计: + +- 使用 `Update()` 基于 `Time.deltaTime` 推进。 +- 是否支持 unscaled time。 +- 是否支持手动 Evaluate,供编辑器预览和存档恢复使用。 + +## 8. 与现有项目系统的关系 + +### 8.1 Actor 系统 + +当前 `ActorAnima` 通过 `Animation/{ActorName}` 加载 AnimatorController,并通过状态名播放。 + +新系统需要考虑: + +- 是否新增 `ActorFrameAnima` 类型。 +- 是否替换 `ActorAnima` 内部实现。 +- 存档中 `stateName` / `stateNormalizedTime` 如何兼容。 +- Yarn 中现有 set_actor_state 等命令是否需要调整。 + +待讨论: + +- 第一批迁移对象是否选择角色立绘? +- 还是先选择孤立的场景物件 / UI 动画做试点? + +### 8.2 AnimatorCenter / AnimatorHandler + +当前通用动画调用以 `animatorName + stateName` 为核心。 + +新系统可以选择: + +1. 新增并行的 `FrameAnimationCenter`。 +2. 让 `AnimatorCenter` 逐步兼容新播放器。 +3. 保持两套系统并存,由 Yarn 命令区分调用。 + +待讨论: + +- 为减少 Yarn 改动,是否应尽量保持类似 API? +- 旧 Animator 动画是否长期保留? + +### 8.3 Yarn 命令 + +候选新命令: + +```yarn +<> +<> +<> +``` + +待讨论: + +- 是否复用现有 `play_animation` 命令? +- 命令是否等待播放完成? +- Loop Clip 的等待语义如何定义? + +### 8.4 Timeline + +第一阶段不替代 Timeline。 + +新系统只需要考虑: + +- Timeline 是否可以调用 FrameAnimationController。 +- Frame 动画是否需要在 Timeline 中被录制或控制。 + +### 8.5 存档系统 + +需要定义快照语义: + +- 当前 Clip 名称。 +- 当前播放时间或帧索引。 +- 当前播放状态:playing / paused / stopped。 +- 当前结束行为。 +- 是否保存队列。 + +待讨论: + +- 对角色立绘保存精确播放时间。 +- 对一次性演出只保存终态,避免读档后重复播放。 + +## 9. 迁移计划 + +### 9.1 第一阶段:原型验证 + +目标: + +- 实现最小 FrameClip。 +- 实现 SpriteRenderer / Image 播放。 +- 实现基础 Inspector 预览。 +- 从一个简单 PNG / JSON 生成 Clip。 + +验收: + +- 不依赖 AnimatorController 播放序列帧。 +- 编辑器中可直接预览 Clip。 +- 修改来源后能刷新 Clip。 + +### 9.2 第二阶段:AnimationSet 与运行时接入 + +目标: + +- 实现 AnimationSet。 +- 实现按名称播放 Clip。 +- 实现 AnimationSet 编辑器。 +- 在一个非核心场景物件上试点。 + +验收: + +- 代码可通过名称播放 Set 内 Clip。 +- 编辑器可集中预览和检查所有 Clip。 + +### 9.3 第三阶段:Sequence 与演出工作流 + +目标: + +- 实现简单线性 Sequence。 +- 支持“播放一次 -> 进入 Idle loop”。 +- 提供 Sequence 预览。 + +验收: + +- 策划可以不写代码配置基础演出序列。 + +### 9.4 第四阶段:Actor / Yarn 迁移 + +目标: + +- 选择一个角色或一组立绘动画试点。 +- 接入 Yarn 命令。 +- 接入存档恢复。 + +验收: + +- 角色动画可以通过新系统播放、保存、恢复。 +- 不破坏旧 Animator 动画。 + +## 10. 验收标准 + +第一版完成时,应满足: + +1. 能创建和保存 FrameClip 资产。 +2. 能在 Inspector 或 EditorWindow 中直接预览 Clip。 +3. 能从 PNG / JSON 生成或刷新 Clip。 +4. 能挂载播放器到 SpriteRenderer / Image 并播放 Clip。 +5. 能通过 AnimationSet 按名称播放 Clip。 +6. 能检查基础错误并给出明确提示。 +7. 刷新导入资源时,不破坏已存在 Clip 的引用。 + +## 11. 待讨论问题清单 + +优先级较高: + +1. `Library` 是否正式命名为 `AnimationSet`? +2. Clip 的循环/结束策略放在哪里最合适? +3. Clip 独立资产与 Set 子资产,哪种更适合项目工作流? +4. 第一阶段试点对象选角色立绘、场景物件,还是 UI 动画? +5. 是否保留现有 `AnimatorCenter` API 形状,降低 Yarn 迁移成本? +6. 存档是否需要保存动画播放中间态? + +优先级较低: + +1. 是否需要节点图式 Sequence 编辑器? +2. 是否需要帧事件? +3. 是否支持随机播放或条件分支? +4. 是否需要 Timeline 轨道扩展? + +## 12. 当前倾向 + +当前建议: + +1. 第一版只做序列帧系统,不做通用动画系统。 +2. 命名采用 `FrameClip` / `AnimationSet` / `Sequence`。 +3. Clip 保存默认结束行为,但播放请求可以覆盖。 +4. 导入刷新以 Clip 名称为稳定匹配键。 +5. 第一版 Sequence 使用列表式编辑,不做节点图。 +6. 运行时底层直接按时间设置 Sprite,不使用 Unity Animator / Playables。 +7. 先新增并行系统,验证稳定后再讨论替换 ActorAnima / AnimatorCenter。 From 92e8cd2f134bd2052addb64002b7f6ad1bcf8c91 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 13 Jul 2026 22:24:16 +0800 Subject: [PATCH 09/47] =?UTF-8?q?docs:=20=E5=8A=A8=E7=94=BB=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Docs/动画系统需求整理.md | 1449 +++++++++++++++++++++++++++++--------- 1 file changed, 1116 insertions(+), 333 deletions(-) diff --git a/Docs/动画系统需求整理.md b/Docs/动画系统需求整理.md index 6a97617b8..d936b98a5 100644 --- a/Docs/动画系统需求整理.md +++ b/Docs/动画系统需求整理.md @@ -1,6 +1,6 @@ # 自研帧动画系统需求文档 -> 当前文档处于需求梳理阶段。目标是先把系统边界、数据结构、编辑器工作流和运行时接入方式说清楚,再进入具体技术设计与实现。 +> 本文档定义自研帧动画系统第一版的系统边界、数据结构、资产导入、编辑器工作流、运行时行为和验收标准。具体类拆分、Unity API 选型与代码组织在技术设计和实现阶段确定。 ## 1. 背景与问题 @@ -39,14 +39,13 @@ ### 1.3 文档目标 -本文档希望定义一个独立于 Unity Animator Controller 的自研帧动画系统,重点解决: +本文档定义一个独立于 Unity Animator Controller 的自研帧动画系统,重点解决: - 序列帧动画的数据结构 - PNG / Aseprite JSON 等来源的导入与刷新 -- Clip / AnimationSet / Sequence 的组织关系 +- FrameClip / FrameAnimationGraph / AnimationFlow 的组织关系 - 编辑器内预览、检查和编排工作流 - 运行时播放器接口 -- 与现有 Actor、Yarn、AnimatorCenter、存档系统的兼容与迁移路径 ## 2. 系统目标与非目标 @@ -54,33 +53,33 @@ 1. 支持 SpriteRenderer 和 UI Image 的序列帧播放。 2. 支持单个动画片段独立播放、预览、刷新和检查。 -3. 支持同一对象的一组动画片段集中管理。 -4. 支持简单演出编排,例如“播放一次动作 -> 进入 Idle 循环 -> 停在最后一帧”。 +3. 支持同一角色或对象的一组动画片段集中管理。 +4. 支持命名演出序列编排,例如“播放一次动作 -> 进入 Idle 循环”或“连续播放多个片段 -> 停在最后一帧”。 5. 支持从 Aseprite JSON / PNG 生成动画数据,并在资源更新时保持动画资产引用稳定。 6. 提供不依赖场景 GameObject 的编辑器预览能力。 7. 为运行时代码提供清晰、稳定、可迁移的播放 API。 ### 2.2 非目标 -第一阶段不尝试替代以下系统: +第一版不尝试替代以下系统: 1. Unity Timeline 的多轨演出能力。 2. DOTween 等 Tween 动效系统。 3. Cinemachine 镜头系统。 4. 骨骼动画、网格变形、复杂 Transform 曲线动画。 -5. 完整可视化节点编辑器或通用状态机编辑器。 +5. 通用状态机编辑器。 -### 2.3 第一阶段范围建议 +### 2.3 第一版范围 -第一阶段建议聚焦: +第一版包含: - `FrameClip`:单个序列帧片段。 -- `AnimationSet`:同一对象的一组 `FrameClip`。 -- 简单 `Sequence`:线性片段队列 + 结束行为。 +- `FrameAnimationGraph`:同一角色或对象的完整帧动画图资产。 +- `AnimationFlow`:`FrameAnimationGraph` 全局节点图中的命名演出流程。 - `FrameAnimationPlayer`:运行时播放器。 -- Clip / Set 的基础编辑器和预览。 +- Graph / Clip / Flow 的基础编辑器和预览。 -复杂图编辑器、条件分支、随机播放、批量迁移工具可以放到后续阶段。 +第一版完成系统自身的数据、导入、编辑器和运行时播放闭环。复杂节点类型、条件分支和随机播放不进入第一版,但数据模型保留节点式演出编排的扩展空间。 ## 3. 术语与概念 @@ -88,23 +87,24 @@ 单帧数据,描述某一时间段内应该显示的 Sprite。 -候选字段: +字段: - `Sprite sprite` -- `float duration` +- `int durationMs` - `string frameName` - `int sourceIndex` -待讨论: +规则: -- `duration` 使用秒还是毫秒? -- 是否需要记录来源 rect / pivot / tag 等导入信息? +- 帧时长使用 `int durationMs` 保存毫秒值;运行时可按需换算为秒。 +- `sprite` 允许为空;空帧表示该帧不显示 Sprite,但仍占用对应时长。 +- Frame 只保存运行时播放必要信息,导入元数据放在 Clip / Graph 的来源信息中。 ### 3.2 FrameClip 最小可播放动画片段,由一组 Frame 组成。 -候选职责: +职责: - 保存帧列表。 - 保存默认播放速度。 @@ -112,399 +112,1184 @@ - 保存导入来源。 - 提供总时长、帧数等只读信息。 -待讨论: +规则: -- Clip 是否应当保存 loop,还是只保存 default end behavior? -- 导入生成的 Clip 是否允许手动编辑帧表? -- Clip 作为独立 `.asset` 保存,还是作为 AnimationSet 的 sub-asset 保存? +- Clip 不单独保存 `bool loop`,循环统一由 `defaultEndBehavior = Loop` 表达。 +- 导入生成的 Clip 帧表只读,不允许直接手动编辑帧内容。 +- Graph 外创建的 Manual Clip 可以保存为独立 `.asset`;Graph 内导入生成的 Clip 保存为 Graph 的 sub-asset。 -### 3.3 AnimationSet +### 3.3 FrameAnimationGraph -同一对象的一组动画片段集合。例如一个角色、一个场景物件或一个 UI 元件的所有动画。 +同一角色或对象的完整帧动画图资产。它不是简单的 Clip 集合,而是承载该对象的基础片段、导入来源、全局节点图、多个命名演出流程、对外可播放对象以及编辑器配置的顶层资产。 -候选职责: +职责: -- 维护 Clip 名称到 Clip 的映射。 -- 维护默认 Idle Clip。 +- 维护 Clip / Flow 统一可播放 id 到目标对象的映射。 +- 维护全局 `AnimationNode` / `AnimationEdge` 节点图。 +- 维护多个 `AnimationFlow`。 - 维护导入来源列表。 -- 支持刷新导入来源后按名称更新已有 Clip。 -- 提供编辑器集中预览。 +- 支持刷新导入来源后按 `importSourceId + sourceTagName` 更新已有 Clip。 +- 以 Clip 或 Flow 作为对外可播放对象,例如 `Idle`、`WakeUp`、`StartTalking`。 +- 提供编辑器集中预览、检查和演出编排。 -待讨论: +规则: -- 原文中的 `Library` 是否改名为 `AnimationSet`? -- Set 内 Clip 是否必须唯一命名? -- Set 是否负责 Sequence,还是 Sequence 独立成资产? +- 顶层资产命名为 `FrameAnimationGraph`。 +- `FrameAnimationGraph` 拥有一套全局节点和连线。 +- `AnimationFlow` 是全局节点图里的命名演出流程。 +- 在 Graph 外创建的 Manual Clip 是独立资产;由 Graph 内图片 / JSON 生成的 Imported Clip 必须是所属 Graph 的 sub-asset。 -### 3.4 Sequence +整体模型: -一段演出编排,描述多个 Clip 的播放顺序和结束策略。 +- 采用“单一全局节点图 + 多个 AnimationFlow”的模型。 +- 一个 Graph 内允许存在多个不联通子图。 +- 不同 Flow 可以从不同入口节点开始,也可以共享部分节点,例如多个 Flow 最终进入同一个 Idle 节点。 +- 之前考虑过“多个独立子编排各自保存 nodes / edges”的模型,但它不如全局图贴合节点编辑器心智,也不利于跨 Flow 共享节点。 +- Clip 和 Flow 都是一等可播放对象,共享同一个可播放 id 命名空间,彼此不能重名。 +- 外部正式播放通过统一的 playable id 调用,不需要显式区分目标是 Clip 还是 Flow。 +- 第一版 Clip 浏览按 ImportSource / Manual 分组并支持扁平模式;自定义分组属于后续扩展。 -候选能力: +### 3.4 AnimationFlow + +`AnimationFlow` 是 `FrameAnimationGraph` 全局节点图中的一个命名演出流程。它不是独立图,也不直接拥有节点和连线;它通过入口节点和默认播放策略,定义一段可预览、可调用的动画流程。 + +一个 `FrameAnimationGraph` 可以包含多个 `AnimationFlow`。每个 Flow 可以对应一段线性演出,也可以对应全局图中的一个可达子图。多个 Flow 可以共享节点和连线。 + +`AnimationFlow` 的核心语义不是“线性序列”,而是“演出流程”。它可以在第一版主要表现为 Clip 节点串联,但数据结构不应限制后续出现分支、等待、随机、事件和回环。 + +能力范围: - 线性播放:`Clip A -> Clip B -> Clip C` - 播完进入 Idle:`Intro -> Idle(loop)` - 播完停在最后一帧 - 播完隐藏目标 -待讨论: +第一版只实现 Clip 节点;没有后继 Edge 的 Clip 节点就是流程终点,不额外提供 End 节点。 -- 第一阶段是否只做线性 Sequence? -- Sequence 是否需要独立资产? -- Sequence 是否应该支持分支、随机、条件判断? - -### 3.5 Player / Controller +### 3.5 FrameAnimationPlayer 运行时负责推进时间、设置 Sprite、响应代码调用的组件。 -候选拆分: +规则: -- `FrameAnimationPlayer`:底层播放逻辑。 -- `FrameAnimationController`:挂载在 GameObject 上,对外暴露 `Play("clipName")` 等接口。 -- `IFrameAnimationTarget`:统一封装 SpriteRenderer / Image。 - -待讨论: - -- 是否需要一个类似 `AnimatorCenter` 的全局注册中心? -- 是否沿用现有 `animatorName + stateName` 的外部调用模型? +- 第一版只提供 `FrameAnimationPlayer` 组件,不额外拆分 `FrameAnimationController`。 +- `FrameAnimationPlayer` 挂载在被控制的 GameObject 上,内部包含时间推进、Graph 解析、播放状态和目标组件适配逻辑。 +- Player 必须与一个 `SpriteRenderer` 或 `UnityEngine.UI.Image` 挂在同一 GameObject;目标适配属于内部实现,不作为第一版公开绑定接口。 +- 第一版不引入全局注册中心。 +- FrameClip 和 AnimationFlow 都可以被正式播放;调用方只提供统一 playable id,由 Graph 解析具体目标类型。 +- AnimationNode 只属于 Flow 内部结构,不作为正式外部播放目标。 ## 4. 数据结构需求 ### 4.1 FrameClip 数据 -候选字段: +字段: ```csharp -string clipName; -List frames; -float speed; -EndBehavior defaultEndBehavior; -ImportSource importSource; -bool isGenerated; +string id; +string displayName; +List frames; +float speed = 1f; +FrameClipEndBehavior defaultEndBehavior; +FrameClipImportInfo importInfo; // null 表示 Manual Clip ``` -候选结束行为: +单帧数据: + +```csharp +Sprite sprite; // 可为空,null 表示空帧 +int durationMs; +string frameName; +int sourceIndex; +``` + +结束行为: -- `Stop` - `HoldLastFrame` - `Loop` - `Clear` - `HideTarget` -待讨论: +规则: -- `Stop` 和 `HoldLastFrame` 是否需要区分? -- 循环播放是 Clip 的默认属性,还是 Play 请求的属性? +- `id` 同时用于 Graph 内 AnimationNode 引用和外部统一播放调用;导入刷新不依赖 `id`。 +- `displayName` 是编辑器展示名,默认与 `id` 一致。 +- `id` 和 `displayName` 都允许中文。 +- 从 Aseprite Tag 导入时,默认 `id = tagName`,`displayName = tagName`。 +- 修改 `displayName` 不影响引用。 +- 允许修改 `id`,但 Clip id 是外部播放契约。编辑器必须检查与所有 Clip / Flow 的冲突,显示受影响的内部引用数量,并对无法自动修复的外部字符串引用给出强警告。 +- 用户确认后,编辑器原子更新 Clip id 和 Graph 内全部 AnimationNode 引用;Graph 外部字符串引用由用户负责迁移。 +- 不单独保存 `bool loop`,循环由 `defaultEndBehavior = Loop` 表达。 +- Clip 保存默认结束行为,但在 `AnimationFlow` 内播放时服从节点配置。 +- 结束行为只在没有后继 Edge 的终点 Clip 节点生效,解析顺序为:节点覆盖 > 播放请求覆盖 > Flow 覆盖 > Clip 默认行为。 +- 中间节点存在后继 Edge 且没有显式节点结束行为时,Clip 播放一次后沿 Edge 推进,Clip 默认的 Loop / Hold 等行为不阻止流程。 +- 导入生成的 Clip 帧表只读,不允许直接手动改帧。 +- 如需修改导入 Clip 的帧内容,应修改源 PNG / JSON 后刷新,或使用编辑器命令复制为 Manual Clip。 +- 空 Sprite 帧合法,不作为错误处理。 +- 帧列表为空的 Clip 可以作为编辑中的中间状态保存,但完整校验结果为 Error,不能正式预览或播放;运行时 `Play()` 应立即以 `Failed` 返回。 +- `Stop` 是播放器控制操作,不属于 `FrameClipEndBehavior`;`HoldLastFrame` 表示自然播完后的终点显示行为。 +- Frame 里只保存运行时必要信息;导入 rect、tag 等元数据放在 `importInfo` 或 Graph 的 `ImportSource` 中。 +- 导入 Clip 的 `id` 被修改后,刷新仍通过 `importSourceId + sourceTagName` 定位并更新该 Clip,不会按 Tag 名重复创建。 +- `importInfo == null` 是 Manual Clip;`importInfo != null` 是 Imported Clip。第一版不再保存额外的 `isGenerated` 或来源类型枚举。 -### 4.2 AnimationSet 数据 - -候选字段: +导入关联信息: ```csharp -string setName; +FrameClipImportInfo +{ + string importSourceId; // 指向 ImportSource.internalId + string sourceTagName; + bool isMissingFromSource; +} +``` + +对于 Graph 内通过 PNG / JSON 生成的 Clip,Clip 自身只保存“来自哪个 `ImportSource`、源 Tag 名称和 Missing 状态”;完整的 Texture / JSON / pivot 等来源资源由 `FrameAnimationImportSource` 保存。源帧索引已经逐帧保存在 `Frame.sourceIndex`,不再在 Clip 级重复保存列表。 + +复制为 Manual Clip 的行为: + +- 第一版提供“复制为 Manual Clip”编辑器命令。 +- 复制操作创建新的 Clip,不修改原导入 Clip,也不自动重定向现有 AnimationNode 引用。 +- 新 Clip 深拷贝帧列表,并保留当前 `displayName`、`speed` 和 `defaultEndBehavior` 作为初始值;Sprite 资源仍按引用复用,不复制 Texture 或 Sprite 资产。 +- 新 Clip 必须清除 ImportSource 关联、Missing 状态和导入刷新所有权,之后不再随源 JSON 刷新,并在资源浏览器中归入 Manual 分组。 +- 数据上表现为新 Clip 的 `importInfo = null`。 +- 新 Clip id 必须在 Clip / Flow 统一命名空间内唯一。编辑器可以生成建议 id,但创建前必须允许用户确认或修改。 +- 从 Graph Editor 执行该命令时,新 Manual Clip 默认保存为当前 Graph 的 sub-asset;Graph 外创建的 Manual Clip 仍可保存为独立 `.asset`。 + +### 4.2 FrameAnimationGraph 数据 + +`FrameAnimationGraph` 是一个角色或对象的完整帧动画工作资产。它服务于编辑器管理、导入刷新和运行时可播放对象解析。 + +字段: + +```csharp +string id; +string displayName; + List clips; -string defaultClipName; -List importSources; +List nodes; +List edges; +List flows; +List importSources; + +FrameAnimationGraphSettings settings; +FrameAnimationGraphEditorData editorData; ``` -待讨论: - -- Clip 引用外部资产,还是作为 Set 的子资产? -- 如果刷新后某个 Clip 名称消失,应该删除、标记 missing,还是保留旧数据? -- 如果刷新后出现同名 Clip,如何处理冲突? - -### 4.3 Sequence 数据 - -候选字段: +#### 4.2.1 Graph 标识 ```csharp -string sequenceName; -List steps; -EndBehavior finalBehavior; -string fallbackIdleClipName; +string id; +string displayName; ``` -待讨论: +规则: -- `SequenceStep` 是否只需要 clipName + overrideEndBehavior? -- 是否需要 step-level speed、事件、等待时间? -- 是否需要在某一帧触发事件? +- `id` 是稳定 key,用于资源查找、Addressable key 或外部工具引用。 +- `displayName` 是编辑器展示名,默认与 `id` 一致。 +- `id` 和 `displayName` 都允许中文。 +- 修改 `displayName` 不影响引用;修改 `id` 需要强警告。 + +#### 4.2.2 Clip 引用 + +Graph 直接维护 `List` 引用,不增加只表达存储状态的 `FrameClipRef` 包装层。Clip 是独立 `.asset` 还是 Graph sub-asset 由 Unity 资产关系推导,不重复序列化 `storageMode`、`isGeneratedByGraph` 等字段。 + +规则: + +- ImportSource 生成的 Imported Clip 必须保存为所属 Graph 的 sub-asset,不能被其他 Graph 引用。 +- Graph 内创建或复制的 Manual Clip 默认保存为 Graph sub-asset,也可以在创建时选择保存为独立 `.asset`。 +- 只有独立 `.asset` 形式的 Manual Clip 可以被多个 Graph 共享;Graph sub-asset Clip 只能由所属 Graph 使用。 +- 同一个 Graph 不能重复添加同一个 FrameClip 引用。 +- 外部共享 Manual Clip 的帧表、速度和默认结束行为发生修改时,会影响所有引用它的 Graph;编辑器必须显示共享引用提示。 +- 刷新后消失的 Imported Clip 在 `importInfo` 中标记 Missing,不自动删除。 +- 新 Tag 生成的 Clip id 与任何已有 Clip 或 Flow id 冲突时,刷新报错并停止,不自动添加前缀或改名。 +- 同一 ImportSource 内、不同 ImportSource 之间的 Aseprite Tag 名均不得重复;冲突信息必须指出双方来源和 Tag。 + +移除与删除规则: + +- 从 Graph 移除 Clip 前,必须检查 AnimationNode 引用和 `defaultPlayableId`;仍存在 Graph 内引用时阻止移除,并提供定位。 +- 移除外部 Manual Clip 时只移除 Graph 引用,不删除 `.asset`。 +- 移除 Graph sub-asset Manual Clip 或 Imported Clip 时同时删除该 sub-asset,并要求明确确认。 +- Missing Imported Clip 只能由用户手动删除;普通刷新永不自动删除 Clip 或 Sprite。 +- 第一版不提供 sub-asset 原地提取为外部资产。需要转换存储方式时,使用“复制为外部 Manual Clip”,不自动替换现有节点引用。 + +#### 4.2.3 全局节点图 + +```csharp +List nodes; +List edges; +``` + +规则: + +- `FrameAnimationGraph` 持有一套全局节点和连线。 +- 节点和连线不归某个 Flow 独占。 +- 一个 Graph 内允许有多个不联通子图。 +- 不同 Flow 可以共享节点,例如多个 Flow 最终进入同一个 Idle 节点。 +- 节点图用于编辑器画布展示,也用于运行时沿边推进播放流程。 + +#### 4.2.4 AnimationFlow 列表 + +```csharp +List flows; +``` + +`AnimationFlow` 是全局节点图里的命名流程。它不直接拥有 nodes / edges,只记录入口和默认播放策略;包含的节点由入口可达关系推导。 + +规则: + +- 第一版采用“单一全局节点图 + 多个 AnimationFlow”的模型。 +- Flow 内嵌在 `FrameAnimationGraph` 中,不作为第一版独立资产。 +- Flow 强依赖本 Graph 内的 Clip、Node、Edge 和命名语义,内嵌更便于校验、预览和刷新。 + +#### 4.2.5 可播放对象命名空间 + +FrameClip 与 AnimationFlow 是并列的一等可播放对象。第一版不引入 AnimationEntry 抽象,也不为 Clip 或 Flow 自动生成额外入口对象。 + +```csharp +FrameAnimationPlayableIndex +{ + Dictionary playables; +} + +FrameAnimationPlayableRef +{ + FrameAnimationPlayableType type; // Clip / Flow,仅供 Graph 内部解析 + FrameClip clip; + AnimationFlow flow; +} +``` + +该索引是可以从 clips / flows 重建的运行时缓存,不作为新的序列化资产层。目标类型只由 Graph 内部解析使用,不要求正式调用方提供。 + +规则: + +- Clip id 和 Flow id 共享同一个 Graph 级可播放命名空间,彼此不能重名。 +- `displayName` 仅用于展示,可以重复。 +- 正式调用统一使用 `Play(playableId)`,调用方不显式区分 Clip 或 Flow。 +- Graph 根据唯一 id 将调用解析为 FrameClip 或 AnimationFlow。 +- AnimationNode 不进入可播放命名空间,只能由 Flow 内部执行或由编辑器调试预览。 +- 单 Clip 动画可以直接播放,不要求包装成单节点 Flow。 +- 将一个 Clip 升级为同名 Flow 时,需要先移除或重命名旧 Clip;外部 playable id 可以保持不变。 + +#### 4.2.6 ImportSource 列表 + +```csharp +List importSources; +``` + +Graph 内的 PNG / JSON 来源都保存在 `importSources` 中。Clip 不重复保存完整 Texture / JSON 引用,只通过 `FrameClipImportInfo.importSourceId` 指向来源。 + +```csharp +FrameAnimationImportSource +{ + string internalId; + string displayName; + bool isEnabled; + Texture2D texture; + TextAsset asepriteJson; + Vector2 pivot; + bool manageSpriteSlicing; + FrameClipEndBehavior defaultNewClipEndBehavior; + string lastSourceHash; +} +``` + +#### 4.2.7 Settings + +```csharp +FrameAnimationGraphSettings +{ + string defaultPlayableId; + FrameClipEndBehavior newManualClipDefaultEndBehavior; +} +``` + +规则: + +- Graph 需要 `defaultPlayableId`,用于 Player 自动播放、编辑器默认预览和未指定目标时的默认播放项;它可以指向 Clip 或 Flow。 +- Graph 不提供运行时结束行为兜底;`newManualClipDefaultEndBehavior` 只作为编辑器中新建 Manual Clip 的初始值。 + +#### 4.2.8 EditorData + +编辑器布局、节点位置、折叠状态、预览偏好等不混入运行时播放数据,必须单独保存。 + +```csharp +FrameAnimationGraphEditorData +{ + List nodeEditorData; + List flowEditorData; +} +``` + +其中,节点位置、Flow 分组或颜色等需要团队共享的编辑数据随 Graph 保存;面板宽度、画布缩放、上次选中对象、搜索词和预览缩放等个人工作区状态保存在本机 EditorPrefs / SessionState,不进入版本控制资产。 + +#### 4.2.9 命名唯一性 + +规则: + +- Clip id 与 AnimationFlow id 共享可播放命名空间,在同一个 Graph 内必须全局唯一且彼此不能重名。 +- AnimationNode internalId 在 Node 命名空间内必须唯一。 +- AnimationEdge internalId 在 Edge 命名空间内必须唯一。 +- ImportSource internalId 在本 Graph 内必须唯一。 +- Node / Edge / ImportSource 的 internalId 使用创建后不可修改的 GUID,只用于序列化引用和编辑器定位,不要求与 playable id 互斥。 +- Clip / Flow 的 `displayName` 可以重复。 +- Clip id 和 Flow id 都可能被外部系统依赖,修改时必须显示强警告。 + +### 4.3 AnimationFlow 与节点图数据 + +`AnimationFlow` 本身不是独立节点图,而是 `FrameAnimationGraph` 全局节点图中的命名流程定义。本节同时描述全局节点、连线和 Flow 的数据结构。 + +#### 4.3.1 AnimationFlow 数据 + +字段: + +```csharp +string id; +string displayName; +string entryNodeId; +FrameClipEndBehavior? endBehaviorOverride; +``` + +说明: + +- `entryNodeId` 保存入口 AnimationNode 的 `internalId`。 +- `endBehaviorOverride` 是 Flow 到达终点时的可选结束行为覆盖。 +- Flow 包含的节点集合从 `entryNodeId` 沿全局边关系遍历得到,不单独保存 `includedNodeIds`。 +- 编辑器高亮、Flow 聚焦、校验和运行时使用同一套可达关系,避免人工维护的节点集合与实际连线不一致。 +- 多个 Flow 的可达范围可以重叠,因此可以自然共享 Idle 等公共节点。 +- 同一个 AnimationNode 不能作为多个 Flow 的入口,但不同 Flow 可以在后续路径中共享该节点。 +- Flow id 属于统一可播放命名空间,不能与任何 Clip 或其他 Flow id 重名。 + +#### 4.3.2 AnimationNode 数据 + +字段: + +```csharp +string internalId; +string displayName; +AnimationNodeType type; +string clipId; +FrameClipEndBehavior? endBehaviorOverride; +float? speedOverride; +``` + +第一版节点类型: + +- `Clip`:播放一个 FrameClip。 + +规则: + +- 第一版只实现 `Clip` 节点,不实现独立 End 节点。 +- 没有后继 Edge 的 Clip 节点就是 Flow 终点,不需要用 End 节点重复表达结束。 +- `Clip` 节点通过 `clipId` 引用 Graph 内的 FrameClip。 +- `endBehaviorOverride` 用于覆盖 Clip 默认结束行为。 +- `speedOverride` 用于覆盖 Clip 默认播放速度;为空时使用 Clip 自身速度。 +- Flow 节点的实际推进速度为 `Player.speed * (Node.speedOverride ?? Clip.speed)`;直接播放 Clip 时为 `Player.speed * Clip.speed`。 +- `speedOverride` 不允许小于 0;等于 0 时只停止时间推进,不改变播放状态。 +- 普通 Idle 循环通过 `Clip` 节点的 `endBehaviorOverride = Loop` 表达,不需要专门的 IdleLoop 节点。 +- 节点存在后继 Edge 且没有显式 `endBehaviorOverride` 时,Clip 播放一次后推进;Clip 默认结束行为只在终点生效。 +- 节点显式设置任何 `endBehaviorOverride` 都表示它应当成为终点;同时存在后继 Edge 属于配置错误。 + +后续可扩展节点类型: + +- `Wait` +- `Random` +- `Branch` +- `Event` +- `SetParameter` +- `Jump` + +#### 4.3.3 AnimationEdge 数据 + +字段: + +```csharp +string internalId; +string fromNodeId; // 指向 AnimationNode.internalId +string toNodeId; // 指向 AnimationNode.internalId +string exitName; // default / success / cancel 等,第一版可仅支持 default +AnimationEdgeCondition condition; +``` + +第一版规则: + +- Edge 只支持顺序连接。 +- `condition` 预留,第一版只实现 `Always`。 +- 普通 Clip 循环不通过自环表达,而通过节点 `endBehaviorOverride = Loop` 表达。 +- 第一版禁止自连接和由多个 Edge 构成的环路。 + +规则: + +- 第一版 Edge 只做 `Always` 顺序连接。 +- 第一版每个节点最多一个后继 Edge,因此从 Flow 入口出发的执行路径是确定的。 +- 第一版检测到自连接或多节点 Edge 环路时作为 Error;合法的无限播放只由终点 Clip 节点显式 `Loop` 表达。 +- 后续如需要多 Clip 循环,应增加明确的 Flow 级循环、循环次数或 `LoopBack` 语义,不通过任意连线隐式形成环。 +- 条件分支、随机分支、事件边等只作为后续扩展。 +- Flow 节点范围只通过 `entryNodeId` 和 Edge 可达关系推导,不保存独立成员列表。 +- 第一版不实现帧事件;后续如需要,优先考虑放在 `AnimationNode` 上,而不是放在 `FrameClip` 上。 ### 4.4 ImportSource 数据 -候选来源类型: +`FrameAnimationImportSource` 是 `FrameAnimationGraph` 内的一组 Aseprite 外部素材来源。第一版只支持“一张 Texture + 一个 Aseprite JSON”作为导入来源,不做通用导入源抽象。 -- `Manual` -- `AsepriteJsonAndTexture` -- `ManualGridJsonAndTexture` - -候选字段: +字段: ```csharp -ImportSourceType type; -Texture2D texture; -TextAsset json; -Vector2 pivot; -bool generateSpritesIfNeeded; +FrameAnimationImportSource +{ + string internalId; + string displayName; + bool isEnabled; + + Texture2D texture; + TextAsset asepriteJson; + + Vector2 pivot; + bool manageSpriteSlicing; + FrameClipEndBehavior defaultNewClipEndBehavior; + string lastSourceHash; +} ``` -待讨论: +#### 4.4.1 导入来源范围 -- 是否允许一个 AnimationSet 管理多组 PNG / JSON? -- 切图结果是否直接修改原 Texture Importer? -- 是否需要保存上次导入摘要,用于显示差异? +规则: + +- 第一版只支持 Aseprite JSON + Texture 导入。 +- 不需要 `ImportSourceType`。 +- `internalId` 在创建时生成 GUID,之后不可修改;`displayName` 可自由修改,不影响 Clip 关联。 +- 手动 Clip 不属于 ImportSource;手动 Clip 没有外部刷新来源。 +- 一个 `FrameAnimationGraph` 可以包含多个 ImportSource。 +- 每个 ImportSource 对应一对图片和 JSON。 +- 每个 ImportSource 可以生成多个 Clip。 + +示例: + +```text +Peipei_FrameAnimationGraph +├─ body.png + body.json -> Idle / Turn / WakeUp +├─ face.png + face.json -> Blink / Smile / Shock +└─ special.png + special.json -> Glitch / Break +``` + +#### 4.4.2 切图设置 + +```csharp +Vector2 pivot; +bool manageSpriteSlicing; +``` + +规则: + +- `pivot` 用于控制根据 Aseprite JSON 切出的 Sprite pivot。 +- `manageSpriteSlicing = false` 时,系统绝不修改 TextureImporter,只查找并使用 Texture 中已有的 Sprite。 +- `manageSpriteSlicing = true` 时,系统可以根据 Aseprite JSON 创建或更新 Sprite 切图元数据。 +- 自动切图会修改 TextureImporter,编辑器必须先显示差异并要求确认。TextureImporter 更新失败时,不修改 Graph 或 Clip 数据。 +- `defaultNewClipEndBehavior` 只用于首次创建导入 Clip,默认值为 `HoldLastFrame`。 +- Aseprite Tag 的 `direction` 只决定帧顺序,不表达 Clip 是否循环。 + +#### 4.4.3 刷新策略 + +规则: + +- 第一版不序列化 `ImportRefreshPolicy`;新增 Tag、Missing 标记和 Imported Clip 帧表覆盖均为固定刷新规则。 +- 新增 Aseprite Tag 自动生成新 Clip。 +- 源中消失的 Tag 对应 Clip 标记 `importInfo.isMissingFromSource = true`,不自动删除。 +- 导入生成的 Clip 帧表只读,刷新时可以覆盖生成帧。 +- 手动 Clip 不受 ImportSource 刷新影响。 +- 刷新只覆盖导入器拥有的字段,不覆盖用户已经设置的 `displayName`、`speed` 和 `defaultEndBehavior`。 + +#### 4.4.4 导入状态 + +规则: + +- 第一版保存 `lastSourceHash`。 +- `lastSourceHash` 用于判断来源是否变化和显示刷新差异。 +- hash 的具体计算方式留到实现阶段决定,可以基于 JSON 文本、Texture asset guid、TextureImporter 状态等信息。 +- 不保存 `lastImportedAt` 和 `lastImportedClipIds`。当前来源关联的 Clip 通过 `clip.importInfo.importSourceId == source.internalId` 推导,避免 Clip 改名后产生过期缓存。 + +#### 4.4.5 Clip 关联方式 + +Graph 内导入生成的 Clip 通过 `FrameClipImportInfo` 关联 ImportSource: + +```csharp +FrameClipImportInfo +{ + string importSourceId; // 指向 ImportSource.internalId + string sourceTagName; + bool isMissingFromSource; +} +``` + +规则: + +- `importSourceId` 指向 `FrameAnimationGraph.importSources` 中不可变的 `internalId`。 +- Aseprite `frameTags.name` 是第一版稳定匹配键。 +- 从 Aseprite Tag 导入时,默认 `Clip.id = tagName`,`Clip.displayName = tagName`。 +- 刷新时按 `importSourceId + sourceTagName` 匹配源 Tag 和已有 Clip,不依赖当前 `Clip.id`。 +- Tag 存在:原地更新对应 Clip。 +- Tag 新增:创建新 Clip。 +- Tag 消失:标记对应 Clip missing,不删除。 +- missing Tag 重新出现:原地更新原 Clip 并清除 missing 标记。 +- Tag 改名:视为旧 Clip missing + 新 Clip 新增。 +- Graph 内所有启用 ImportSource 参与导入的 Tag 名必须唯一。 +- Tag 或新 Clip id 与现有 Clip / Flow playable id 发生冲突时视为阻断错误,不自动生成前缀或改名。 +- 第一版不提供 Tag 改名后的手动关联或迁移工具;需要保留原 Clip 和内部引用时,应在 Aseprite 中保持原 Tag 名。 + +#### 4.4.6 Sprite 与 TextureImporter 所有权 + +规则: + +- Graph 只拥有动画数据,不拥有 Sprite 或 Texture。自动切出的 Sprite 始终是 Texture 资产的 sub-asset。 +- Frame 只保存 Sprite 的 Unity 序列化引用;删除 Graph、Clip 或 ImportSource 都不自动删除 Texture 或 Sprite。 +- 复制为 Manual Clip 只复制帧表,不复制 Texture 或 Sprite。需要完全独立的图像资源时,由用户显式复制 Texture。 +- `manageSpriteSlicing = true` 的 ImportSource 是该 Texture 切图元数据的写入所有者。同一 Texture 在整个项目中最多只能有一个可写 ImportSource。 +- 其他 ImportSource 可以在 `manageSpriteSlicing = false` 时只读复用同一 Texture 中已有的 Sprite。 +- 修改 TextureImporter 前检查本 Graph 和其他 FrameAnimationGraph 的可写来源;存在多个写入所有者时阻止操作并列出冲突来源。 +- 自动更新切图时,以 Aseprite `frameName` 作为 Sprite 的稳定匹配键。已存在同名 Sprite 时保留稳定 Sprite ID,只更新 rect、pivot 等元数据;新 frameName 创建新 Sprite ID。 +- SourceFrame 的 frameName 必须非空且在同一 ImportSource 内唯一,否则导入失败。 +- 源中消失的 frameName 第一版不自动删除对应 Sprite 元数据,避免 Missing Clip 或 Manual Clip 的 Sprite 引用立即断裂。清理未使用 Sprite 不属于普通刷新流程。 +- `manageSpriteSlicing = false` 时,找不到与 JSON frameName / rect 对应的唯一 Sprite 应视为阻断错误,不自动回退到修改 TextureImporter。 ## 5. 资产导入与刷新需求 ### 5.1 Aseprite JSON 导入 -系统应支持读取 Aseprite 导出的 JSON: +系统读取 Aseprite 导出的 JSON 后,先建立按源文件导出顺序排列的 SourceFrame 列表,再根据 `meta.frameTags` 生成或刷新 FrameClip。 -- 读取 `frames` 中的帧 rect 和 duration。 -- 读取 `meta.frameTags` 作为 Clip 名称和帧范围。 -- 支持 `forward`、`reverse`、`pingpong` 等方向。 -- 支持中文 Tag 名称。 +#### 5.1.1 支持的 JSON 数据 -待讨论: +- 支持 `frames` 为 JSON Object 或 JSON Array 两种导出形式。 +- 两种形式都必须转换为统一的有序 SourceFrame 列表。 +- JSON Object 形式必须保留属性在源文件中的出现顺序,不允许根据 frameName 重新排序。 +- 读取每帧的 `frame` rect、`duration`、`rotated`、`trimmed`、`spriteSourceSize` 和 `sourceSize`。 +- 读取 `meta.size`、`meta.image` 和 `meta.frameTags`。 +- 完整保留 UTF-8 中文 Tag 和 frameName。 -- 是否在导入时保留 Aseprite 原始 frameName? -- `pingpong` 是否展开成实际帧列表? +#### 5.1.2 Frame 转换规则 -### 5.2 手动 Grid JSON 导入 +- Aseprite 原始 frameName 写入 `Frame.frameName`,不参与 SourceFrame 排序、Clip 匹配或节点引用;当系统管理 Sprite 切图时,它作为保留 Sprite ID 的稳定匹配键。 +- 源帧在有序 SourceFrame 列表中的位置写入 `Frame.sourceIndex`。 +- Aseprite `duration` 原样转换为 `int durationMs`,不先换算为浮点秒。 +- FrameClip 中的 Sprite 根据 SourceFrame rect 对应到切图结果。 +- `spriteSourceSize` 和 `sourceSize` 第一版只用于校验和错误提示,不进入运行时 Frame 数据。 -系统可以复用现有生成器里的手动 JSON 思路: +#### 5.1.3 Tag 转换规则 -- 配置 rows / columns / frameCount。 -- 配置全局 frameDuration。 -- 配置每个动画片段的 frameIndices。 +- 每个 `frameTags` 条目生成或刷新一个 FrameClip。 +- Tag 的 `from` / `to` 引用 SourceFrame 索引。 +- Tag 范围允许重叠;同一个 SourceFrame 可以被多个 Clip 使用。 +- `forward` 展开为 `from -> to`。 +- `reverse` 展开为 `to -> from`。 +- `pingpong` 展开为正向帧后接反向内部帧,不重复首尾端点。例如 `0,1,2,3,2,1`。 +- `pingpong_reverse` 按相反起始方向使用同样规则展开。 +- 展开结果直接保存为普通 FrameClip 帧表,运行时不需要理解 Aseprite direction;`sourceIndex` 允许重复。 +- direction 只决定帧排列顺序,不隐含 `Loop` 结束行为。 -待讨论: +#### 5.1.4 第一版素材限制 -- 这个格式是否继续保留? -- 是否需要提供 JSON 模板和校验工具? +- 第一版要求 Aseprite 导出时关闭裁边和旋转。 +- 任一帧 `trimmed = true` 时作为阻断错误,不导入。后续如支持,需要根据 `spriteSourceSize` 修正每帧相对原始画布的位置和 pivot。 +- 任一帧 `rotated = true` 时作为阻断错误,不导入。 -### 5.3 刷新策略 +#### 5.1.5 导入校验 + +以下情况属于阻断错误: + +- `frames` 缺失或为空。 +- SourceFrame 的 frameName 为空或在同一 ImportSource 内重复。 +- Texture 尺寸与 `meta.size` 不一致。 +- Frame rect 越出 Texture 范围。 +- `duration` 不是大于 0 的整数毫秒值。 +- Tag 名为空或发生重名。 +- Tag 的 `from` / `to` 越界或范围无效。 +- direction 不是系统明确支持的值。 +- 不同 ImportSource 的 Tag 名冲突,或新 Tag 生成的 Clip id 与已有 Clip / Flow playable id 冲突。 +- 当前 Texture 存在其他 `manageSpriteSlicing = true` 的 ImportSource 写入所有权。 +- `manageSpriteSlicing = false` 时,已有 Sprite 无法按 frameName / rect 唯一匹配 SourceFrame。 + +以下情况只显示警告: + +- JSON 中没有任何 Tag,此 ImportSource 不生成 Clip。 +- `meta.image` 与当前绑定 Texture 的文件名不同;Unity 内重命名资源可能造成这种情况。 + +导入必须先完成解析和全部校验,再修改 Graph。存在阻断错误时,本次 ImportSource 不产生任何部分更新。 + +### 5.2 刷新策略 刷新时应尽量保持已有资产引用稳定。 -候选规则: +#### 5.2.1 刷新流程 -1. 以 Clip 名称作为匹配键。 -2. 同名 Clip 原地更新帧数据。 -3. 新 Clip 自动加入。 -4. 消失的 Clip 标记为 missing,等待用户确认是否删除。 -5. 手动修改过的字段不被刷新覆盖,除非用户选择强制刷新。 +```text +读取来源 +-> 完整解析 +-> 校验来源与全 Graph 命名冲突 +-> 计算差异 +-> 应用修改 +-> 更新 hash 和导入记录 +``` -待讨论: +- 第一版采用手动刷新。编辑器可以通过 hash 显示“来源已变化”,但文件变化不自动修改 Graph。 +- 刷新单个 ImportSource 时,该来源存在阻断错误则该来源完全不变。 +- 刷新全部 ImportSource 时,必须先校验所有启用来源;任一来源存在阻断错误时,整次刷新不应用。 +- 应用修改前计算 `新增 / 更新 / Missing / 不变 / 错误` 差异摘要。 +- 普通刷新不要求二次确认;删除 Clip、修改 TextureImporter 等影响更大的操作需要明确确认。 +- 需要修改 TextureImporter 时,先计算并确认切图差异,再更新 TextureImporter;只有 TextureImporter 更新成功后才应用 Graph / Clip 变化。 -- 哪些字段属于导入生成,哪些字段允许用户覆盖? -- 是否需要刷新前预览差异? +#### 5.2.2 匹配与资产稳定性 + +- 使用 `importSourceId + sourceTagName` 匹配导入来源与已有 Clip。 +- 已有 Clip 必须原地更新,不删除并重新创建 Clip 子资产。 +- 用户修改导入 Clip 的 `id` 后,刷新仍更新原 Clip。 +- 新 Tag 创建新 Clip;消失的 Tag 标记 missing;重新出现时清除 missing。 +- Tag 改名视为旧 Clip missing + 新 Clip 新增。 +- 刷新不自动删除任何 Clip,也不自动解决命名冲突。 + +#### 5.2.3 字段所有权 + +导入器拥有并可在刷新时覆盖: + +- `frames` +- `importInfo.importSourceId` +- `importInfo.sourceTagName` +- `importInfo.isMissingFromSource` + +用户拥有,刷新不得覆盖: + +- `id` +- `displayName` +- `speed` +- `defaultEndBehavior` + +新 Clip 首次创建时,`id` 和 `displayName` 默认取 Tag 名,`defaultEndBehavior` 取 ImportSource 的 `defaultNewClipEndBehavior`。这些字段创建后归用户控制。 + +#### 5.2.4 Clip / Flow 重命名 + +- Clip 和 Flow id 可以重命名,但新 id 必须在统一可播放命名空间内唯一。 +- Clip id 只能通过 Graph Editor 的正式重命名流程修改;普通 Inspector 中只读。 +- Clip 只被一个 Graph 引用时允许重命名,编辑器必须显示受影响的 AnimationNode 引用数量,并原子更新该 Graph 内相关引用。 +- 外部 Manual Clip 被多个 Graph 引用时禁止重命名;编辑器列出引用它的 Graph,并提示先移除其他引用或复制为新的 Manual Clip。 +- Flow 重命名时,编辑器必须同步更新 `defaultPlayableId` 等 Graph 内引用。 +- Clip / Flow id 都是正式播放契约;修改时必须强警告它可能破坏外部字符串调用。 +- 编辑器只能自动修复 Graph 内部引用,不能假设可以安全修改项目中的所有外部字符串。 ## 6. 编辑器需求 -### 6.1 FrameClip Inspector +### 6.1 编辑器形态与总体布局 + +第一版提供独立的 `FrameAnimationGraph EditorWindow` 作为主要工作环境。普通 Unity Inspector 只显示 Graph / Clip 的摘要信息和“打开 Graph Editor”入口,不承担完整编排工作。 + +编辑器沿用项目现有章节编辑器的基本操作心智:顶部工具栏、可调整宽度的侧栏、中央 GraphView 节点画布、选中对象属性面板。动画编辑器在此基础上增加资源浏览、节点内预览、Clip 独立预览、导入差异和校验结果区域。 + +默认布局: + +```text +顶部工具栏 +├─ Graph 资产 / 保存状态 +├─ 刷新来源 / 全部刷新 +├─ 校验 +└─ Flow 预览与节点预览策略 + +主工作区 +├─ 左侧:资源浏览区 +├─ 中央:全局节点画布 +└─ 右侧:选中对象属性区;选中 Clip 时包含独立预览 + +底部可折叠区域 +├─ 导入差异 +└─ 校验结果 +``` + +布局要求: + +- 左右侧栏和底部区域支持拖拽调整尺寸,并允许折叠。 +- 中央画布始终对应当前 FrameAnimationGraph 的唯一全局节点图,不为每个 AnimationFlow 创建独立画布。 +- 编辑器同一时间编辑一个 FrameAnimationGraph;第一版不要求多个 Graph 同屏。 +- 选中资源列表项、节点、连线或校验结果时,各区域必须同步定位和显示同一对象。 +- 编辑器重新打开时恢复用户上次使用的布局和本机工作区状态。 + +### 6.2 资源浏览区 + +资源浏览区集中管理当前 Graph 内的: + +- FrameClip +- AnimationFlow +- FrameAnimationImportSource 基础能力: -- 显示 Clip 名称、总时长、帧数、默认结束行为。 -- 显示帧表:序号、Sprite、duration、来源 frameName。 -- 支持不依赖场景 GameObject 的预览。 -- 支持播放、暂停、逐帧、调整预览速度。 +- 使用 `Clips / Flows / Sources` 三个标签页切换不同资源类型。 +- 支持按 `id`、`displayName`、`sourceTagName` 和 ImportSource 搜索 Clip。 +- 支持按名称、来源、帧数、时长和 missing 状态排序。 +- 支持按 Manual / Imported、正常 / Missing、是否已被节点引用筛选。 +- 列表项使用纯文本紧凑显示,不绘制 Sprite 缩略图。 +- 列表项显示名称、帧数、总时长、来源状态、节点引用数量和必要的错误 / 警告标记。 +- 双击或使用明确命令可定位到相关节点、目标资源或 ImportSource。 +- Clip 默认按 ImportSource 分组,Manual Clip 放在独立分组;同时提供扁平列表模式。 +- 搜索时可以忽略分组,直接显示全部匹配结果。 +- 单击 Clip 只选中资源并在右侧显示属性和独立预览,不自动定位某个节点,因为同一 Clip 可能被多个节点引用。 +- 支持“定位引用”:只有一个引用时直接定位节点,存在多个引用时显示引用列表。 +- 支持将 Clip 拖到画布,在释放位置创建引用该 Clip 的节点。 -手动 Clip: +第一版不要求 Clip 拖拽排序;搜索、筛选和稳定排序优先。资源浏览区本身不播放动画,也不执行持续的 Sprite 重绘。 + +### 6.3 全局节点画布与 AnimationFlow + +节点画布用于编辑 Graph 持有的全局 AnimationNode / AnimationEdge。第一版沿用 Unity GraphView 风格的缩放、平移、框选、拖动和连线操作。 + +#### 6.3.1 节点创建与连接 + +- 第一版只创建 `Clip` 节点。 +- Clip 可以从资源浏览区拖入画布生成 Clip 节点,也可以通过画布右键菜单创建后选择 Clip。 +- 同一个 FrameClip 可以被多个 AnimationNode 引用。 +- 第一版 Clip 节点最多提供一个默认顺序出口;没有后继 Edge 的节点就是 Flow 终点。 +- 连接节点时立即更新 Graph 的 AnimationEdge 数据。 +- 节点显式设置结束行为后不允许再连接后继 Edge;已有后继 Edge 时设置结束行为也必须提示冲突。 +- 删除节点或连线前检查 Flow 和其他节点引用;存在引用时显示影响范围并要求确认。 +- 节点移动、创建、删除、连接和断开都必须支持 Unity Undo / Redo。 + +Clip 节点至少显示: + +- 节点 displayName。 +- 引用的 Clip id。 +- 默认或覆盖后的结束行为和速度。 +- Missing Clip、无效引用等状态标记。 +- 被哪些 AnimationFlow 使用的简要标记。 +- 位于节点内容下方的固定尺寸预览区。 + +节点预览要求: + +- 预览区具有稳定的宽高比和尺寸,不因不同帧的 Sprite 尺寸变化而改变节点布局。 +- Sprite 使用适应区域的方式显示;静止状态默认显示第一个非空帧。 +- 空帧显示透明棋盘格并保留实际时长。 +- 节点预览应用该 AnimationNode 的 `speedOverride` 和 `endBehaviorOverride`。 + +#### 6.3.2 Flow 查看与编辑 + +- 画布提供“显示全部”和“聚焦某个 AnimationFlow”两种查看模式。 +- 显示全部时展示 Graph 的所有节点和连线,包括互不联通的子图。 +- 选择某个 Flow 时,从 `entryNodeId` 沿 Edge 实时计算可达节点和连线并高亮,降低其他节点的视觉权重,但不切换或复制节点图。 +- 编辑器必须明确标识 Flow 的入口节点。 +- 节点允许同时属于多个 Flow,以支持共享 Idle 等公共节点。 +- Flow 不保存或人工维护节点成员列表;修改连线后,其可达范围和高亮结果立即重新计算。 +- 提供将选中节点设置为 Flow 入口的命令。 +- 两个 Flow 从不同入口到达同一节点时,该节点自然属于两个 Flow,不需要额外登记共享关系。 + +Flow 创建与入口管理: + +- Flow 只能通过“选中一个 Clip 节点 -> 从选中节点创建 Flow”建立。 +- 创建时必须且只能选中一个节点,编辑器自动将该节点写入 `entryNodeId`。 +- Flow id 默认取节点名称,但创建前允许修改;它必须与所有 Clip / Flow playable id 唯一。 +- 同一个节点不能作为多个 Flow 的入口;节点已是入口时禁用创建命令并提供定位现有 Flow 的操作。 +- Flow 入口允许存在前驱节点;从该 Flow 播放时直接从入口开始,入口之前的节点不属于其可达范围。 +- 修改入口时,先选中目标节点并执行“设置为当前 Flow 入口”;若目标已是其他 Flow 入口则阻止修改。 +- 删除 Flow 只删除 Flow 定义,不删除节点或 Edge。 +- 删除 Flow 入口节点时,不允许静默留下失效 Flow;编辑器只提供“同时删除 Flow”或“取消”。如需保留 Flow,用户必须先修改入口。 + +第一版连线约束: + +- 禁止节点自连接和多个节点组成的 Edge 环路。 +- 终点 Clip 节点显式 `Loop` 是第一版唯一合法的无限 Flow。 +- 创建 Edge 时立即执行针对该连接的循环检查;发现环路时标记 Error,并阻止完整 Flow 预览。 + +#### 6.3.3 画布辅助能力 + +- 支持聚焦选中对象、聚焦当前 Flow 和显示全部节点。 +- 支持对选中节点或当前 Flow 做基础自动布局;自动布局必须进入 Undo。 +- 节点位置随 Graph 的共享 EditorData 保存。 +- 第一版允许保存暂时不完整或不联通的图,不能因为编辑中间态而阻止保存;错误通过校验面板持续提示。 + +### 6.4 属性编辑与独立预览 + +右侧属性区根据当前选中对象显示 FrameClip、AnimationNode、AnimationEdge、AnimationFlow 或 ImportSource 的编辑界面。属性修改必须使用 SerializedObject / Undo,并立即同步到资源列表、节点和预览。 + +#### 6.4.1 FrameClip 编辑 + +通用信息: + +- 显示并编辑 `displayName`、`speed` 和 `defaultEndBehavior`;Clip id 只通过带引用检查的正式重命名命令修改。 +- 显示总时长、Frame 数量、来源类型和 Missing 状态。 +- 显示帧表:序号、Sprite、`durationMs`、`frameName`、`sourceIndex`。 +- 重命名 id 时检查统一 playable 命名空间冲突,显示将同步修改的 Node 引用数量,并提示无法自动修复的外部字符串引用。 +- 外部 Manual Clip 被多个 Graph 共享时,显示引用 Graph 列表和共享修改提示,并禁用 id 重命名。 + +Manual Clip: - 帧表可编辑。 -- 可增删帧、替换 Sprite、修改 duration。 +- 支持增加、删除、复制和调整帧顺序。 +- 支持替换 Sprite、修改 `durationMs` 和创建合法空帧。 +- 支持将导入 Clip 复制为新的 Manual Clip;复制后帧表可编辑,且不再参与 ImportSource 刷新。 -导入 Clip: +Imported Clip: -- 帧表默认只读。 -- 可以跳转到 ImportSource。 -- 可以刷新来源。 +- 帧表只读,不允许局部覆盖。 +- 支持跳转到对应 ImportSource、查看 sourceTagName 和刷新来源。 +- 如需手动修改帧内容,使用“复制为 Manual Clip”命令创建脱离导入刷新的副本。 -待讨论: +#### 6.4.2 预览能力 -- 是否允许导入 Clip 局部覆盖某一帧? -- 预览区域是否需要显示透明棋盘格、原始尺寸、缩放倍率? +- Clip、Clip 节点和 AnimationFlow 都可以不依赖场景 GameObject 预览,但使用不同的展示位置和上下文。 +- 选中资源浏览区中的 Clip 时,右侧属性区显示独立 Clip 预览;它直接播放 Clip 帧表和 Clip 自身默认设置,不应用任何节点覆盖。 +- Clip 节点使用节点下方的内嵌预览区,应用该节点的速度和结束行为覆盖。 +- Flow 预览从 `entryNodeId` 开始沿实际边关系执行,通过高亮并驱动当前节点的内嵌预览呈现,不打开另一套 Flow 预览画面。 +- 预览必须复用或严格对齐运行时的时间推进与结束行为逻辑,避免编辑器效果和游戏内结果不一致。 +- 支持播放、暂停、停止、从头播放、上一帧、下一帧、时间拖动和预览速度调整。 +- 显示当前帧索引、当前帧耗时、累计时间和总时长;无限循环 Flow 的总时长显示为无限或不可确定。 +- 独立 Clip 预览支持透明棋盘格、适应窗口、原始像素尺寸、整数倍缩放和手动缩放。 +- 空帧必须按实际时长显示透明内容,不能在预览时跳过。 +- 预览设置只属于编辑器,不修改 Clip 或 Graph 的运行时速度和结束行为。 -### 6.2 AnimationSet Editor +节点自动预览策略: -基础能力: +```csharp +enum NodePreviewPolicy +{ + Static, // 全部静止,只能手动播放 + SelectedOnly, // 只循环播放主选中节点,默认值 + AllVisible // 循环播放当前画布视口内的节点 +} +``` -- 显示 Set 内所有 Clip。 -- 每个 Clip 有小预览窗口。 -- 支持搜索、排序、重命名、检查重复名。 -- 支持设置默认 Idle / 默认 Clip。 -- 支持从导入来源批量刷新。 -- 支持侧边预览完整 Sequence 或单个 Clip。 +- 默认使用 `SelectedOnly`。 +- 选中 Clip 节点时从第 0 帧开始循环预览;切换选择后,原节点停止并恢复代表帧,新节点开始播放。 +- 多选节点时只播放主选中节点;清除选择后所有节点恢复静止。 +- `AllVisible` 只更新当前画布视口中的有效 Clip 节点。 +- 自动循环只是编辑器检查策略,不改变 Clip 或节点的真实结束行为。 +- Flow 预览期间暂停普通节点自动预览,只驱动当前执行节点;Flow 停止后恢复原策略。 +- NodePreviewPolicy、预览速度和背景样式保存在本机工作区,不进入 Graph 资产。 -待讨论: +### 6.5 ImportSource 管理 -- 第一版是否做独立 EditorWindow,而不是只做 Inspector? -- 是否需要拖拽排序? -- Clip 小窗全部实时播放是否会影响编辑器性能? +- 允许查看或复制不可变 internalId,并允许编辑 displayName、Texture、Aseprite JSON、pivot、`manageSpriteSlicing` 和新 Clip 默认结束行为。 +- 显示来源 hash 状态、当前关联 Clip 数量和当前错误 / 警告数量;关联 Clip 数量由 `importInfo.importSourceId` 推导。 +- 支持刷新单个来源、刷新全部启用来源和仅计算差异。 +- 修改 TextureImporter 前必须显示将被修改的内容并要求确认。 +- 导入差异按 `新增 / 更新 / Missing / 不变 / 错误` 分组显示。 +- 差异条目可以定位到 Tag、Clip 或 ImportSource。 +- 刷新失败时保留现有 Graph 数据,并在编辑器内显示完整错误,不要求用户只通过 Console 排查。 -### 6.3 Sequence Editor +### 6.6 校验与问题定位 -第一阶段建议做轻量列表式编辑: +编辑器提供常驻、可折叠的校验结果区,不只使用一次性弹窗或 Console。校验问题分为 `Error / Warning / Info`,支持按级别和对象类型筛选。 -- 添加 Step。 -- 选择 Clip。 -- 设置 Step 播放策略。 -- 设置最终行为。 -- 一键从头预览。 +校验触发方式: -后续再考虑节点图或连线式编辑。 +- 顶部工具栏手动执行完整校验。 +- 关键字段或结构修改后执行轻量增量校验。 +- 导入刷新前执行完整的来源与命名冲突校验。 -待讨论: +第一版至少检查: -- 是否真的需要节点图? -- Sequence 是否需要与 Yarn / Timeline 联动显示? - -### 6.4 校验与错误提示 - -编辑器应能检查: - -- 空 Sprite。 +- Clip / Flow playable id 为空、各自重名或彼此冲突。 +- Clip 帧列表为空。 +- Node / Edge / ImportSource internalId 为空、格式无效或在各自命名空间内重名。 - duration 小于等于 0。 -- Clip 重名。 -- Sequence 引用不存在的 Clip。 -- ImportSource 缺少 texture 或 json。 -- JSON 中 Tag 重名。 -- 刷新后丢失的 Clip。 +- Clip speed、Node speedOverride 或其他参与播放的速度小于 0。 +- AnimationNode 引用不存在或 Missing 的 Clip。 +- AnimationEdge 的起点、终点不存在或连接规则无效。 +- AnimationFlow 的入口节点不存在。 +- 同一个 AnimationNode 被多个 Flow 用作入口。 +- AnimationFlow 从入口出发的可达路径存在无效连接或无法按第一版规则继续执行。 +- Edge 自连接或形成多节点环路。 +- `defaultPlayableId` 不存在,或没有指向 Clip / Flow。 +- ImportSource 缺少 Texture 或 JSON。 +- Imported Clip 不属于其 ImportSource 所在 Graph 的 sub-asset,或 Graph sub-asset Clip 被其他 Graph 引用。 +- 同一个 Graph 重复引用同一个 FrameClip。 +- 同一 Texture 存在多个 `manageSpriteSlicing = true` 的 ImportSource。 +- SourceFrame frameName 为空或在同一 ImportSource 内重复。 +- 导入生成的非空源帧未找到对应 Sprite。 +- JSON 内或多个 ImportSource 之间的 Tag 重名。 +- Aseprite Frame 使用第一版不支持的 trim 或 rotate。 +- 来源变化尚未刷新、Tag 消失或 Clip 处于 Missing 状态。 +- 节点或子图未被任何 Flow 使用。 + +行为要求: + +- 点击问题条目必须定位并选中对应 Clip、节点、Flow 或 ImportSource。 +- Error 可以阻止导入刷新或完整 Flow 预览,但不阻止保存编辑中的 Graph。 +- Warning 不阻止保存、刷新或预览。 +- 校验结果必须说明问题对象、原因和建议处理方式,不能只给出通用错误文本。 + +性能要求: + +- 不在 `OnGUI`、节点重绘或每个预览帧中执行完整校验。 +- 创建 Edge 时只检查从目标节点沿后继链是否能够回到起点;第一版单后继结构下,该检查最多遍历一次节点链。 +- 节点移动只更新 EditorData,不触发运行时结构或导入来源校验。 +- 连续字段修改使用短暂防抖,并复用上一次校验结果;Graph 结构或相关字段未变化时不重复计算。 +- 完整校验只在用户点击 Validate、开始 Flow 预览、刷新来源或进入正式运行前执行。 +- Aseprite 解析、Texture 校验和来源 hash 只在对应来源变化或执行导入刷新时计算,不因普通节点编辑触发。 + +### 6.7 编辑器状态、保存与恢复 + +必须随 Graph 资产共享并进入版本控制: + +- 节点位置。 +- Flow 的编辑器颜色或其他团队需要共享的图形信息。 + +只保存在本机工作区: + +- 左右面板宽度和底部区域高度。 +- 画布缩放、平移和当前查看模式。 +- 上次选中的资源和 Flow。 +- 搜索词、筛选条件和排序方式。 +- 节点预览策略,以及预览缩放、背景和播放速度。 + +所有会修改 Graph 或其子资产的操作必须: + +- 支持 Undo / Redo。 +- 正确标记资源 dirty。 +- 在窗口关闭、脚本重编译或 Domain Reload 后保留已经保存的数据。 +- 不因切换 Graph、切换 Flow 或刷新列表而静默丢失修改。 + +### 6.8 第一版编辑器范围 + +第一版必须完成: + +- 单 Graph 主工作台。 +- Clip / Flow / ImportSource 浏览与编辑。 +- Clip 节点的全局画布编排。 +- Clip 独立预览、节点内预览和在节点图上执行的 Flow 预览。 +- 导入刷新、差异摘要和可定位校验。 +- Undo / Redo 与编辑器状态保存。 + +第一版不要求: + +- Branch、Random、Event 等扩展节点的完整编辑能力。 +- 多个 FrameAnimationGraph 同屏编辑。 +- 资源浏览区显示 Clip 图形或持续动态播放。 +- 复杂分组、注释框、子图折叠和发布级自动排版。 ## 7. 运行时需求 -### 7.1 播放目标 +### 7.1 FrameAnimationPlayer 与播放目标 -必须支持: +`FrameAnimationPlayer` 是挂载在场景对象上的运行时组件,形态类似 Unity `Animator`。它引用一个 `FrameAnimationGraph`,并控制同一 GameObject 上的 Sprite 显示组件。 -- `SpriteRenderer` -- `UnityEngine.UI.Image` +配置: -可选支持: +```csharp +FrameAnimationGraph graph; +bool playOnEnable = false; +float speed = 1f; +``` -- 未来扩展到其他自定义 Sprite 显示组件。 +规则: + +- 第一版同时支持 `SpriteRenderer` 和 `UnityEngine.UI.Image`。 +- Player 必须与且仅与一个受支持的显示组件挂在同一 GameObject。 +- Player 初始化时查找并缓存同对象上的显示组件,不在播放过程中反复查找。 +- Player 不搜索父物体或子物体,也不提供运行时 `BindTarget()` 或目标切换能力。 +- 同时存在 `SpriteRenderer` 和 `Image` 时视为配置冲突,不采用隐式优先级。 +- 没有有效显示组件时,编辑器校验报错;运行时 `Play()` 返回失败结果,不进入空转播放。 +- 实现通过 `[DisallowMultipleComponent]`、自定义 Inspector、`OnValidate()` 和运行时初始化校验共同约束组件配置。Unity `[RequireComponent]` 无法直接表达 SpriteRenderer / Image 二选一。 +- 第一版不支持播放过程中动态替换 Graph。 +- `playOnEnable` 默认关闭。开启时,组件每次启用都从头播放 Graph 的 `defaultPlayableId`。 +- Player 不提供实例级默认 playable 覆盖;未指定 id 时始终使用 Graph 的 `defaultPlayableId`。 +- `OnDisable()` 终止当前播放请求;再次启用时不恢复旧进度,仅根据 `playOnEnable` 决定是否重新播放默认项。 +- `HideTarget` 只设置 `SpriteRenderer.enabled = false` 或 `Image.enabled = false`,不调用 `GameObject.SetActive(false)`。下次成功播放时,Player 重新启用目标组件并显示起始帧。 +- 空帧对两类目标都表现为 `sprite = null`。 + +其他 Sprite 显示组件属于后续扩展,不进入第一版。 ### 7.2 播放接口 -候选接口: +第一版公开接口: ```csharp -Play(string clipName); -Play(string clipName, EndBehavior endBehavior); -Loop(string clipName); -Queue(string clipName); -Stop(); -Pause(); -Resume(); -Seek(float timeSeconds); -SetSpeed(float speed); -GetCurrentClipName(); -GetPlaybackTime(); -GetDuration(); +FrameAnimationPlaybackHandle Play(); +FrameAnimationPlaybackHandle Play(string playableId); +FrameAnimationPlaybackHandle Play(string playableId, FrameAnimationPlayOptions options); + +void Stop(FrameAnimationStopMode mode = FrameAnimationStopMode.HoldCurrentFrame); +void Pause(); +void Resume(); +void SetSpeed(float speed); ``` -待讨论: +播放参数至少包含: -- `Loop` 是否只是 `Play(..., Loop)` 的快捷方法? -- `Queue` 第一阶段是否需要? -- 是否需要异步协程接口:`IEnumerator PlayAsync(...)`? - -### 7.3 播放行为 - -需要明确: - -- 播放新 Clip 时是否从第 0 帧开始。 -- 播放同一 Clip 时是否重播。 -- Stop 后停在哪一帧。 -- Pause 是否冻结当前帧。 -- HideTarget 是否由播放器设置 GameObject active,还是只清空 Sprite / alpha。 - -### 7.4 时间推进 - -待设计: - -- 使用 `Update()` 基于 `Time.deltaTime` 推进。 -- 是否支持 unscaled time。 -- 是否支持手动 Evaluate,供编辑器预览和存档恢复使用。 - -## 8. 与现有项目系统的关系 - -### 8.1 Actor 系统 - -当前 `ActorAnima` 通过 `Animation/{ActorName}` 加载 AnimatorController,并通过状态名播放。 - -新系统需要考虑: - -- 是否新增 `ActorFrameAnima` 类型。 -- 是否替换 `ActorAnima` 内部实现。 -- 存档中 `stateName` / `stateNormalizedTime` 如何兼容。 -- Yarn 中现有 set_actor_state 等命令是否需要调整。 - -待讨论: - -- 第一批迁移对象是否选择角色立绘? -- 还是先选择孤立的场景物件 / UI 动画做试点? - -### 8.2 AnimatorCenter / AnimatorHandler - -当前通用动画调用以 `animatorName + stateName` 为核心。 - -新系统可以选择: - -1. 新增并行的 `FrameAnimationCenter`。 -2. 让 `AnimatorCenter` 逐步兼容新播放器。 -3. 保持两套系统并存,由 Yarn 命令区分调用。 - -待讨论: - -- 为减少 Yarn 改动,是否应尽量保持类似 API? -- 旧 Animator 动画是否长期保留? - -### 8.3 Yarn 命令 - -候选新命令: - -```yarn -<> -<> -<> +```csharp +FrameClipEndBehavior? endBehaviorOverride; ``` -待讨论: +规则: -- 是否复用现有 `play_animation` 命令? -- 命令是否等待播放完成? -- Loop Clip 的等待语义如何定义? +- FrameClip 和 AnimationFlow 都是正式可播放对象。 +- Clip / Flow id 在 Graph 内共享唯一命名空间,调用方只传 `playableId`,不显式区分目标类型。 +- Graph 找到 FrameClip 时直接播放帧表;找到 AnimationFlow 时从 `entryNodeId` 开始沿 Edge 执行。 +- AnimationNode 不作为正式外部播放对象,只由 Flow 执行或由编辑器调试预览。 +- `Play()` 未传 id 时使用 Graph 的 `defaultPlayableId`。 +- 不提供独立 `Loop(string playableId)`;循环通过 `Play()` 的 `endBehaviorOverride = Loop` 表达。 +- 对 AnimationFlow 使用播放请求的 Loop 覆盖时,含义是让终点 Clip 循环,不是让整个 Flow 从头循环。第一版不支持整个 Flow 循环。 +- 第一版不提供 `Queue()`。需要由策划确定的连续演出应使用 AnimationFlow;运行时代码临时排队不纳入第一版。 +- 第一版不公开运行时 `Seek()`。编辑器内部可以按 Clip 时间或帧定位,用于预览和测试,但不为 Flow 定义统一绝对时间轴。 -### 8.4 Timeline +### 7.3 播放状态与生命周期 -第一阶段不替代 Timeline。 +播放状态: -新系统只需要考虑: +```csharp +FrameAnimationPlaybackState +{ + Stopped, + Playing, + Paused +} -- Timeline 是否可以调用 FrameAnimationController。 -- Frame 动画是否需要在 Timeline 中被录制或控制。 +FrameAnimationStopMode +{ + HoldCurrentFrame, + Clear, + HideTarget +} +``` -### 8.5 存档系统 +播放规则: -需要定义快照语义: +- 每次成功 `Play()` 都立即从目标 Clip 的第 0 帧开始显示,不等待下一次 `Update()`。 +- 重播同一个 playable 时仍创建新的播放请求并从头开始,旧请求以 `Replaced` 完成。 +- 播放其他 playable 时立即替换当前请求,旧请求以 `Replaced` 完成。 +- Graph、playable id、目标组件或数据无效时,新请求立即以 `Failed` 完成,但不打断当前正在正常播放的请求。 +- `Pause()` 冻结当前帧和帧内累计时间;`Resume()` 从该位置继续。 +- `Stop()` 默认保留当前显示帧,不执行当前 Clip / Flow 的终点结束行为,并将当前请求以 `Stopped` 完成。 +- `Stop(Clear)` 清空目标 Sprite;`Stop(HideTarget)` 禁用目标显示组件。 +- `OnDisable()` 和销毁 Player 时,尚未完成的请求按 `Stopped` 结算。 +- 一个 Player 同一时间最多有一个活动播放请求。 -- 当前 Clip 名称。 -- 当前播放时间或帧索引。 -- 当前播放状态:playing / paused / stopped。 -- 当前结束行为。 -- 是否保存队列。 +自然到达终点时,结束行为按以下优先级解析: -待讨论: +```text +节点 endBehaviorOverride +> Play 请求 endBehaviorOverride +> Flow endBehaviorOverride +> Clip defaultEndBehavior +``` -- 对角色立绘保存精确播放时间。 -- 对一次性演出只保存终态,避免读档后重复播放。 +结束行为语义: -## 9. 迁移计划 +- `HoldLastFrame`:保留最后一帧,播放状态变为 `Stopped`,请求以 `Completed` 完成。 +- `Loop`:当前终点 Clip 持续循环,不产生自然完成通知;直到被替换或主动停止后才结算请求。 +- `Clear`:自然完成后将目标 Sprite 设为 `null`,保持显示组件启用,请求以 `Completed` 完成。 +- `HideTarget`:自然完成后禁用显示组件,请求以 `Completed` 完成。 +- Flow 中间节点存在后继 Edge 且没有显式节点结束行为时,Clip 播放一次后立即进入后继节点;Clip 自身默认结束行为不阻止 Flow 推进。 +- Flow 节点切换时,在同一次时间求值中立即显示下一个 Clip 的第 0 帧。 -### 9.1 第一阶段:原型验证 +### 7.4 时间推进与速度 + +运行时使用 `Update()` 提供时间,底层通过统一求值逻辑推进: + +```csharp +Evaluate(double deltaTimeSeconds); +``` + +规则: + +- 第一版运行时只使用 `Time.deltaTime`,动画默认受 `Time.timeScale` 影响。 +- 第一版不提供 unscaled time、运行时 Manual 模式或单次播放时间源覆盖。 +- 编辑器预览使用编辑器时钟驱动同一套内部求值逻辑,但不把 Manual 时间模式暴露为运行时 API。 +- 每帧将时间累计到当前动画帧;达到帧时长后减去该帧时长并保留余量,而不是把累计时间清零。 +- 一次 `Evaluate()` 可以跨过多帧和多个 Flow 节点。发生较大 deltaTime 时,应落到正确的最终帧,不能只前进一帧。 +- Frame 的 `durationMs` 在求值时转换参与计算;内部累计时间使用 `double`,降低长时间累计误差。 +- 直接播放 Clip 时,实际推进速度为 `Player.speed * Clip.speed`。 +- 通过 Flow 节点播放时,实际推进速度为 `Player.speed * (Node.speedOverride ?? Clip.speed)`;Node speedOverride 只替换 Clip speed,不替换 Player speed。 +- Player speed、Clip speed 和 Node speedOverride 都不允许小于 0;编辑器校验和运行时接口都必须拒绝负值。 +- speed 等于 0 时不做特殊状态转换;播放器保持原状态,只因推进量为 0 而停在当前帧。速度恢复为正数后继续。 +- `Time.timeScale = 0` 时同样不改变播放状态,只因 `Time.deltaTime = 0` 而停止推进。 +- 不使用 `FixedUpdate()`、`WaitForSeconds()` 或逐帧协程作为核心计时方式。 + +### 7.5 播放 Handle、异步等待与完成通知 + +异步等待和播放完成通知属于第一版核心能力。每次 `Play()` 都返回独立的 `FrameAnimationPlaybackHandle`,不因 playable id 相同而复用请求。 + +接口: + +```csharp +FrameAnimationPlaybackHandle : CustomYieldInstruction +{ + long RequestId { get; } + bool IsCompleted { get; } + FrameAnimationPlaybackResult Result { get; } + + Task WaitAsync(); + void RegisterCompleted(Action callback); +} + +FrameAnimationPlaybackResult +{ + long requestId; + string playableId; + FrameAnimationCompletionReason reason; + FrameAnimationPlaybackError error; +} + +FrameAnimationPlaybackError +{ + FrameAnimationPlaybackErrorCode code; + string message; +} + +FrameAnimationPlaybackErrorCode +{ + None, + PlayerNotReady, + GraphMissing, + TargetMissing, + TargetConflict, + PlayableIdEmpty, + PlayableNotFound, + InvalidPlayableData, + InvalidSpeed +} + +FrameAnimationCompletionReason +{ + Completed, + Replaced, + Stopped, + Failed +} +``` + +要求: + +- Handle 可以直接用于 `yield return handle`。 +- `WaitAsync()` 使用标准 `Task`,项目第一版不引入 UniTask 依赖。 +- `RegisterCompleted()` 是正式完成通知接口。请求尚未完成时登记回调;请求已经完成时立即用既有结果调用,避免同步失败或极短动画造成通知丢失。 +- 同一个播放请求只能从未完成状态结算一次;协程、Task 和回调必须观察到同一个结果。 +- 循环播放不会自然完成;Handle 保持未完成,直到请求被替换、主动停止、Player 禁用或销毁。 +- 完成回调由 Player 在 Unity 主线程触发。 +- 调用方可以多次注册完成回调,每个注册独立调用一次;单个注册不得重复触发。 +- 播放失败通过 `Failed` 结果表达,不使用异常表示正常的资源、目标、参数或 id 校验失败。 +- `Failed` 结果必须带非 `None` 的结构化错误码和可读消息;非失败结果的错误码必须为 `None`。 +- 错误消息用于日志和调试,不作为程序分支依据;调用方应根据 `FrameAnimationPlaybackErrorCode` 判断失败类型。 +- 将来如果项目整体采用 UniTask,可以增加独立适配层,不修改 Handle 的核心状态和结算机制。 + +### 7.6 运行时状态查询 + +Player 提供以下只读状态,供调试、界面显示和后续系统接入使用: + +```csharp +FrameAnimationPlaybackState State { get; } +string CurrentPlayableId { get; } +string CurrentClipId { get; } +string CurrentNodeId { get; } +int CurrentFrameIndex { get; } +float Speed { get; } +``` + +语义: + +- `CurrentPlayableId` 是当前播放请求指定的一级 Clip 或 Flow id。 +- `CurrentClipId` 是当前真正提供显示帧的 Clip id。 +- `CurrentNodeId` 只在播放 Flow 时有值;直接播放 Clip 时为空。 +- 没有当前播放内容时,字符串属性为空,`CurrentFrameIndex = -1`。 +- 这些属性只反映状态,外部不能通过修改它们控制播放位置。 +- 第一版不提供含义模糊的统一 `GetPlaybackTime()` 或 `GetDuration()`。Clip 时长可以通过明确的 Clip 数据查询接口获得;Flow 可能包含无限循环,未来加入分支后也不保证存在唯一总时长。 + +## 8. 分阶段实施计划 + +### 8.1 第一阶段:原型验证 目标: @@ -519,83 +1304,81 @@ GetDuration(); - 编辑器中可直接预览 Clip。 - 修改来源后能刷新 Clip。 -### 9.2 第二阶段:AnimationSet 与运行时接入 +### 8.2 第二阶段:FrameAnimationGraph 与运行时播放 目标: -- 实现 AnimationSet。 -- 实现按名称播放 Clip。 -- 实现 AnimationSet 编辑器。 -- 在一个非核心场景物件上试点。 +- 实现 FrameAnimationGraph。 +- 实现 Graph 内 Clip、AnimationNode、AnimationEdge、AnimationFlow 的基础组织。 +- 实现按统一 playable id 播放 Clip 或 AnimationFlow。 +- 实现 FrameAnimationGraph 编辑器。 验收: -- 代码可通过名称播放 Set 内 Clip。 -- 编辑器可集中预览和检查所有 Clip。 +- 代码可通过统一 playable id 播放 Graph 内 Clip 或 AnimationFlow。 +- 编辑器可集中预览和检查 Graph 内 Clip、节点图与 AnimationFlow。 -### 9.3 第三阶段:Sequence 与演出工作流 +### 8.3 第三阶段:AnimationFlow 与演出工作流 目标: -- 实现简单线性 Sequence。 +- 实现最小节点式 AnimationFlow。 - 支持“播放一次 -> 进入 Idle loop”。 -- 提供 Sequence 预览。 +- 提供 AnimationFlow 预览。 验收: -- 策划可以不写代码配置基础演出序列。 +- 使用者可以不写代码配置并预览基础帧动画演出序列。 -### 9.4 第四阶段:Actor / Yarn 迁移 - -目标: - -- 选择一个角色或一组立绘动画试点。 -- 接入 Yarn 命令。 -- 接入存档恢复。 - -验收: - -- 角色动画可以通过新系统播放、保存、恢复。 -- 不破坏旧 Animator 动画。 - -## 10. 验收标准 +## 9. 验收标准 第一版完成时,应满足: -1. 能创建和保存 FrameClip 资产。 -2. 能在 Inspector 或 EditorWindow 中直接预览 Clip。 -3. 能从 PNG / JSON 生成或刷新 Clip。 -4. 能挂载播放器到 SpriteRenderer / Image 并播放 Clip。 -5. 能通过 AnimationSet 按名称播放 Clip。 -6. 能检查基础错误并给出明确提示。 -7. 刷新导入资源时,不破坏已存在 Clip 的引用。 +1. 能创建、打开和保存 FrameAnimationGraph,并管理其中的 Clip、Flow 和 ImportSource。 +2. 能在独立 EditorWindow 中浏览 Clip,并直接预览 Clip、节点和 AnimationFlow。 +3. 能在全局节点画布中创建 Clip 节点、连接顺序、设置 Flow 入口并查看共享节点。 +4. 能从 PNG / Aseprite JSON 生成或刷新 Clip,并显示刷新差异。 +5. 能通过可定位的校验面板发现命名、引用、导入和 Missing 问题。 +6. 编辑器数据修改支持 Undo / Redo,窗口重开或脚本重编译后不丢失已保存内容。 +7. 能挂载播放器到 SpriteRenderer / Image 并播放动画。 +8. 能通过 FrameAnimationGraph 的统一 playable id 播放 Clip 或 AnimationFlow,调用方不需要区分目标类型。 +9. 播放器能正确处理重播、替换、暂停、停止、终点结束行为以及大 deltaTime 跨帧推进。 +10. 播放 Handle 能通过协程、标准 Task 和完成回调等待,并对 Completed / Replaced / Stopped / Failed 各结算一次。 +11. 运行时播放空 Clip、无效 id、无效目标或非法速度时返回带结构化错误信息的 Failed 结果。 +12. 能将导入 Clip 复制为不再参与刷新且帧表可编辑的 Manual Clip。 +13. 外部 Manual Clip 能被多个 Graph 共享;Graph sub-asset Clip 不会被其他 Graph 非法引用,移除操作遵守资产所有权。 +14. 自动切图刷新能为同名 frameName 保留稳定 Sprite ID,并阻止多个 ImportSource 同时写入同一 TextureImporter。 +15. 刷新导入资源时,不破坏已存在 Clip、Node 和 Flow 的引用。 -## 11. 待讨论问题清单 +## 10. 后续扩展 -优先级较高: +以下能力已明确不进入第一版,也不阻塞第一版实现: -1. `Library` 是否正式命名为 `AnimationSet`? -2. Clip 的循环/结束策略放在哪里最合适? -3. Clip 独立资产与 Set 子资产,哪种更适合项目工作流? -4. 第一阶段试点对象选角色立绘、场景物件,还是 UI 动画? -5. 是否保留现有 `AnimatorCenter` API 形状,降低 Yarn 迁移成本? -6. 存档是否需要保存动画播放中间态? +1. 其他导入格式,例如手动 Grid JSON、rows / columns / frameCount、全局 frameDuration 和自定义 frameIndices。 +2. Wait、Random、Branch、Event、SetParameter、Jump 等节点,以及帧事件、条件分支和随机播放。 +3. 多 Clip 循环、Flow 整体循环、循环次数和明确的 LoopBack 语义。 +4. 其他 Sprite 显示组件、unscaled time、运行时 Seek、运行时 Queue 和 UniTask 适配。 +5. 大型 Graph 的自定义分组、注释框、子图折叠、发布级自动排版和多个 Graph 同屏编辑。 +6. trimmed / rotated Aseprite 帧支持,以及未使用 Sprite 元数据的安全清理工具。 -优先级较低: +后续能力必须在保持第一版资产兼容的前提下单独补充需求与技术设计,不能通过改变现有字段语义隐式加入。 -1. 是否需要节点图式 Sequence 编辑器? -2. 是否需要帧事件? -3. 是否支持随机播放或条件分支? -4. 是否需要 Timeline 轨道扩展? +## 11. 已确定设计摘要 -## 12. 当前倾向 - -当前建议: +第一版已确定: 1. 第一版只做序列帧系统,不做通用动画系统。 -2. 命名采用 `FrameClip` / `AnimationSet` / `Sequence`。 +2. 命名采用 `FrameAnimationGraph` / `FrameClip` / `AnimationFlow`。 3. Clip 保存默认结束行为,但播放请求可以覆盖。 -4. 导入刷新以 Clip 名称为稳定匹配键。 -5. 第一版 Sequence 使用列表式编辑,不做节点图。 +4. 导入刷新以 `importSourceId + sourceTagName` 为稳定匹配键,不依赖当前 Clip id。 +5. FrameAnimationGraph 采用全局节点图编辑;AnimationFlow 是图中的命名演出流程。 6. 运行时底层直接按时间设置 Sprite,不使用 Unity Animator / Playables。 -7. 先新增并行系统,验证稳定后再讨论替换 ActorAnima / AnimatorCenter。 +7. 第一版 Aseprite 导入兼容 Object / Array 两种 frames 格式,但不支持 trimmed 或 rotated 帧。 +8. 删除 AnimationEntry;Clip 和 Flow 都是一等可播放对象,共享统一且互斥的 playable id 命名空间,正式调用不区分目标类型。 +9. 第一版使用单 Graph 独立 EditorWindow,采用紧凑资源浏览、全局节点画布、属性区、节点内预览、Clip 独立预览和可定位校验组成的工作台。 +10. AnimationFlow 不保存节点成员列表;编辑器和运行时都从入口沿 Edge 推导可达节点,并在同一全局画布上高亮显示。 +11. Flow 从单个选中节点创建,同一个节点不能作为多个 Flow 的入口;第一版禁止 Edge 自连接和多节点环路。 +12. Graph 直接保存 `List`;Clip 的 `.asset` / sub-asset 存储关系由 Unity 资产关系推导,不序列化重复状态。 +13. `FrameClip.importInfo == null` 表示 Manual Clip,非空表示 Imported Clip;Missing 状态保存在 importInfo 内,不再保存 isGenerated 等重复字段。 +14. Node、Edge 和 ImportSource 使用不可变 GUID internalId;Clip、Flow 和 Graph 保留面向外部调用的可读 id。 +15. Graph 不拥有 Sprite 或 Texture;可写 ImportSource 负责维护 TextureImporter 切图数据,并尽量保持 Sprite ID 稳定。 From 19b6b9c4e238c2e840b96bc268cc94f0bf02b2b4 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Mon, 13 Jul 2026 22:24:39 +0800 Subject: [PATCH 10/47] =?UTF-8?q?fix:=20=E7=AB=A0=E8=8A=82=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=99=A8=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Editor/ChapterGraph/ChapterGraphEditorWindow.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Assets/Editor/ChapterGraph/ChapterGraphEditorWindow.cs b/Assets/Editor/ChapterGraph/ChapterGraphEditorWindow.cs index c265e4f6c..0ae2735be 100644 --- a/Assets/Editor/ChapterGraph/ChapterGraphEditorWindow.cs +++ b/Assets/Editor/ChapterGraph/ChapterGraphEditorWindow.cs @@ -148,9 +148,19 @@ namespace AibisDream.SystemEditor }); // 右侧 GraphView + // 套一层容器:GraphView 与左侧 Inspector 并列放在 Flex Row 中时, + // 内置 RectangleSelector 绘制的框选矩形会出现坐标偏移(已知 Unity 问题)。 + // 将 GraphView 放在独立的 Flex 子容器中可使其局部原点与父容器对齐,规避该偏移。 + var graphViewWrapper = new VisualElement(); + graphViewWrapper.style.flexGrow = 1; + graphViewWrapper.style.flexDirection = FlexDirection.Column; + graphViewWrapper.style.overflow = Overflow.Hidden; + _graphView = new ChapterGraphView(); _graphView.style.flexGrow = 1; - mainContainer.Add(_graphView); + graphViewWrapper.Add(_graphView); + + mainContainer.Add(graphViewWrapper); root.Add(mainContainer); From 85a3fc9e14b7a2a0eab5d7ddda5ee63e3b0a34c3 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 15 Jul 2026 15:13:56 +0800 Subject: [PATCH 11/47] =?UTF-8?q?feat(frameAnima):=20=E5=8A=A8=E7=94=BB?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=89=8D=E5=9B=9B=E4=B8=AA=E9=98=B6=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Editor/FrameAnimation.meta | 8 + .../AibisDream.FrameAnimation.Editor.asmdef | 19 + ...bisDream.FrameAnimation.Editor.asmdef.meta | 7 + .../FrameAnimation/AsepriteJsonParser.cs | 198 ++ .../FrameAnimation/AsepriteJsonParser.cs.meta | 11 + Assets/Editor/FrameAnimation/AssemblyInfo.cs | 3 + .../FrameAnimation/AssemblyInfo.cs.meta | 11 + .../FrameAnimationEditorDialogs.cs | 307 +++ .../FrameAnimationEditorDialogs.cs.meta | 11 + .../FrameAnimationEditorServices.cs | 744 +++++++ .../FrameAnimationEditorServices.cs.meta | 11 + .../FrameAnimationGraphAuthoringServices.cs | 539 +++++ ...ameAnimationGraphAuthoringServices.cs.meta | 2 + .../FrameAnimationGraphEditor.cs | 33 + .../FrameAnimationGraphEditor.cs.meta | 11 + .../FrameAnimationGraphEditorWindow.cs | 1948 +++++++++++++++++ .../FrameAnimationGraphEditorWindow.cs.meta | 11 + .../FrameAnimation/FrameAnimationGraphView.cs | 622 ++++++ .../FrameAnimationGraphView.cs.meta | 2 + .../FrameAnimationImportModels.cs | 261 +++ .../FrameAnimationImportModels.cs.meta | 11 + .../FrameAnimationImportSampleBuilder.cs | 335 +++ .../FrameAnimationImportSampleBuilder.cs.meta | 11 + .../FrameAnimationImportService.cs | 605 +++++ .../FrameAnimationImportService.cs.meta | 11 + .../FrameAnimationPlayerEditor.cs | 84 + .../FrameAnimationPlayerEditor.cs.meta | 11 + .../FrameAnimationRuntimeSampleBuilder.cs | 223 ++ ...FrameAnimationRuntimeSampleBuilder.cs.meta | 11 + .../FrameAnimationSpriteUtility.cs | 344 +++ .../FrameAnimationSpriteUtility.cs.meta | 11 + .../Editor/FrameAnimation/FrameClipEditor.cs | 60 + .../FrameAnimation/FrameClipEditor.cs.meta | 11 + Assets/GameContent/Test/FrameAnimation.meta | 8 + .../FrameAnimation/DirectSampleGraph.asset | 29 + .../DirectSampleGraph.asset.meta | 8 + .../Test/FrameAnimation/FlowSampleGraph.asset | 55 + .../FrameAnimation/FlowSampleGraph.asset.meta | 8 + .../Test/FrameAnimation/Idle.asset | 87 + .../Test/FrameAnimation/Idle.asset.meta | 8 + .../Test/FrameAnimation/Import.meta | 8 + .../Import/FrameAnimationGraph.asset | 775 +++++++ .../Import/FrameAnimationGraph.asset.meta | 8 + .../Test/FrameAnimation/Import/中文Array.json | 69 + .../FrameAnimation/Import/中文Array.json.meta | 7 + .../FrameAnimation/Import/中文Object.json | 67 + .../Import/中文Object.json.meta | 7 + .../FrameAnimation/Import/中文自动切图.png | 3 + .../Import/中文自动切图.png.meta | 232 ++ .../Test/FrameAnimation/Import/中文预切图.png | 3 + .../FrameAnimation/Import/中文预切图.png.meta | 232 ++ .../FrameAnimation/Import/火山像素版.json | 639 ++++++ .../Import/火山像素版.json.meta | 7 + .../Test/FrameAnimation/Import/火山像素版.png | 3 + .../FrameAnimation/Import/火山像素版.png.meta | 1772 +++++++++++++++ .../Test/FrameAnimation/Intro.asset | 43 + .../Test/FrameAnimation/Intro.asset.meta | 8 + .../LiberationSans SDF - Fallback.asset | 45 +- Assets/Scenes/FrameAnimationRuntimeTest.unity | 553 +++++ .../FrameAnimationRuntimeTest.unity.meta | 7 + Assets/Scenes/梦境.unity | 1 - Assets/Scripts/FrameAnimation.meta | 8 + Assets/Scripts/FrameAnimation/Runtime.meta | 8 + .../AibisDream.FrameAnimation.Runtime.asmdef | 16 + ...isDream.FrameAnimation.Runtime.asmdef.meta | 7 + .../FrameAnimation/Runtime/AssemblyInfo.cs | 5 + .../Runtime/AssemblyInfo.cs.meta | 11 + .../Runtime/FrameAnimationData.cs | 401 ++++ .../Runtime/FrameAnimationData.cs.meta | 11 + .../Runtime/FrameAnimationGraph.cs | 196 ++ .../Runtime/FrameAnimationGraph.cs.meta | 11 + .../Runtime/FrameAnimationGraphTopology.cs | 142 ++ .../FrameAnimationGraphTopology.cs.meta | 2 + .../Runtime/FrameAnimationPlaybackHandle.cs | 96 + .../FrameAnimationPlaybackHandle.cs.meta | 11 + .../Runtime/FrameAnimationPlaybackSession.cs | 220 ++ .../FrameAnimationPlaybackSession.cs.meta | 11 + .../Runtime/FrameAnimationPlayer.cs | 414 ++++ .../Runtime/FrameAnimationPlayer.cs.meta | 11 + .../Runtime/FrameAnimationResolver.cs | 274 +++ .../Runtime/FrameAnimationResolver.cs.meta | 11 + .../Runtime/FrameAnimationTarget.cs | 80 + .../Runtime/FrameAnimationTarget.cs.meta | 11 + .../Runtime/FrameAnimationTypes.cs | 127 ++ .../Runtime/FrameAnimationTypes.cs.meta | 11 + .../Runtime/FrameAnimationValidation.cs | 541 +++++ .../Runtime/FrameAnimationValidation.cs.meta | 11 + .../FrameAnimation/Runtime/FrameClip.cs | 119 + .../FrameAnimation/Runtime/FrameClip.cs.meta | 11 + .../Scripts/UI/Components/DreamTerminalUI.cs | 185 +- Assets/Tests.meta | 8 + Assets/Tests/FrameAnimation.meta | 8 + Assets/Tests/FrameAnimation/EditMode.meta | 8 + ...Dream.FrameAnimation.Tests.EditMode.asmdef | 24 + ....FrameAnimation.Tests.EditMode.asmdef.meta | 7 + .../EditMode/FrameAnimationCoreTests.cs | 258 +++ .../EditMode/FrameAnimationCoreTests.cs.meta | 11 + .../FrameAnimationEditorWorkspaceTests.cs | 227 ++ ...FrameAnimationEditorWorkspaceTests.cs.meta | 2 + .../FrameAnimationGraphAuthoringTests.cs | 187 ++ .../FrameAnimationGraphAuthoringTests.cs.meta | 2 + .../EditMode/FrameAnimationImportTests.cs | 249 +++ .../FrameAnimationImportTests.cs.meta | 11 + Assets/Tests/FrameAnimation/PlayMode.meta | 8 + ...Dream.FrameAnimation.Tests.PlayMode.asmdef | 21 + ....FrameAnimation.Tests.PlayMode.asmdef.meta | 7 + .../PlayMode/FrameAnimationPlayerTests.cs | 293 +++ .../FrameAnimationPlayerTests.cs.meta | 11 + 108 files changed, 15448 insertions(+), 35 deletions(-) create mode 100644 Assets/Editor/FrameAnimation.meta create mode 100644 Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef create mode 100644 Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef.meta create mode 100644 Assets/Editor/FrameAnimation/AsepriteJsonParser.cs create mode 100644 Assets/Editor/FrameAnimation/AsepriteJsonParser.cs.meta create mode 100644 Assets/Editor/FrameAnimation/AssemblyInfo.cs create mode 100644 Assets/Editor/FrameAnimation/AssemblyInfo.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphView.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphView.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationImportModels.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationImportModels.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationImportSampleBuilder.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationImportSampleBuilder.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationImportService.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationImportService.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPlayerEditor.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPlayerEditor.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationRuntimeSampleBuilder.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationRuntimeSampleBuilder.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationSpriteUtility.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationSpriteUtility.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameClipEditor.cs create mode 100644 Assets/Editor/FrameAnimation/FrameClipEditor.cs.meta create mode 100644 Assets/GameContent/Test/FrameAnimation.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/DirectSampleGraph.asset create mode 100644 Assets/GameContent/Test/FrameAnimation/DirectSampleGraph.asset.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/FlowSampleGraph.asset create mode 100644 Assets/GameContent/Test/FrameAnimation/FlowSampleGraph.asset.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Idle.asset create mode 100644 Assets/GameContent/Test/FrameAnimation/Idle.asset.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/FrameAnimationGraph.asset create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/FrameAnimationGraph.asset.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文Array.json create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文Array.json.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文Object.json create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文Object.json.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文自动切图.png create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文自动切图.png.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文预切图.png create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/中文预切图.png.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/火山像素版.json create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/火山像素版.json.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/火山像素版.png create mode 100644 Assets/GameContent/Test/FrameAnimation/Import/火山像素版.png.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Intro.asset create mode 100644 Assets/GameContent/Test/FrameAnimation/Intro.asset.meta create mode 100644 Assets/Scenes/FrameAnimationRuntimeTest.unity create mode 100644 Assets/Scenes/FrameAnimationRuntimeTest.unity.meta create mode 100644 Assets/Scripts/FrameAnimation.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/AibisDream.FrameAnimation.Runtime.asmdef create mode 100644 Assets/Scripts/FrameAnimation/Runtime/AibisDream.FrameAnimation.Runtime.asmdef.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/AssemblyInfo.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/AssemblyInfo.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationData.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationData.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationGraph.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationGraph.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationGraphTopology.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationGraphTopology.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationPlaybackHandle.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationPlaybackHandle.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationPlaybackSession.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationPlaybackSession.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationPlayer.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationPlayer.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationResolver.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationResolver.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationTarget.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationTarget.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationTypes.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationTypes.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationValidation.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameAnimationValidation.cs.meta create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameClip.cs create mode 100644 Assets/Scripts/FrameAnimation/Runtime/FrameClip.cs.meta create mode 100644 Assets/Tests.meta create mode 100644 Assets/Tests/FrameAnimation.meta create mode 100644 Assets/Tests/FrameAnimation/EditMode.meta create mode 100644 Assets/Tests/FrameAnimation/EditMode/AibisDream.FrameAnimation.Tests.EditMode.asmdef create mode 100644 Assets/Tests/FrameAnimation/EditMode/AibisDream.FrameAnimation.Tests.EditMode.asmdef.meta create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationCoreTests.cs create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationCoreTests.cs.meta create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationEditorWorkspaceTests.cs create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationEditorWorkspaceTests.cs.meta create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationGraphAuthoringTests.cs create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationGraphAuthoringTests.cs.meta create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationImportTests.cs create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationImportTests.cs.meta create mode 100644 Assets/Tests/FrameAnimation/PlayMode.meta create mode 100644 Assets/Tests/FrameAnimation/PlayMode/AibisDream.FrameAnimation.Tests.PlayMode.asmdef create mode 100644 Assets/Tests/FrameAnimation/PlayMode/AibisDream.FrameAnimation.Tests.PlayMode.asmdef.meta create mode 100644 Assets/Tests/FrameAnimation/PlayMode/FrameAnimationPlayerTests.cs create mode 100644 Assets/Tests/FrameAnimation/PlayMode/FrameAnimationPlayerTests.cs.meta diff --git a/Assets/Editor/FrameAnimation.meta b/Assets/Editor/FrameAnimation.meta new file mode 100644 index 000000000..ea98cbebf --- /dev/null +++ b/Assets/Editor/FrameAnimation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9e244d3d62dec3f4f881f7e681da8c03 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef b/Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef new file mode 100644 index 000000000..8a5bae64f --- /dev/null +++ b/Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef @@ -0,0 +1,19 @@ +{ + "name": "AibisDream.FrameAnimation.Editor", + "rootNamespace": "AibisDream.FrameAnimation.Editor", + "references": [ + "AibisDream.FrameAnimation.Runtime", + "Unity.2D.Sprite.Editor" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} diff --git a/Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef.meta b/Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef.meta new file mode 100644 index 000000000..692deda26 --- /dev/null +++ b/Assets/Editor/FrameAnimation/AibisDream.FrameAnimation.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d1ffe139ca2417941a09835467d1e442 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/AsepriteJsonParser.cs b/Assets/Editor/FrameAnimation/AsepriteJsonParser.cs new file mode 100644 index 000000000..32803a79b --- /dev/null +++ b/Assets/Editor/FrameAnimation/AsepriteJsonParser.cs @@ -0,0 +1,198 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json.Linq; +using UnityEngine; + +namespace AibisDream.FrameAnimation.Editor +{ + internal static class AsepriteJsonParser + { + public static bool TryParse( + string json, + string sourceId, + out AsepriteSourceDocument document, + out FrameAnimationImportIssue issue) + { + document = null; + issue = null; + try + { + if (string.IsNullOrWhiteSpace(json)) + { + issue = Error(FrameAnimationImportIssueCode.JsonInvalid, sourceId, "Aseprite JSON 为空。"); + return false; + } + + var root = JObject.Parse(json); + var framesToken = root["frames"]; + if (framesToken == null || + (framesToken.Type != JTokenType.Object && framesToken.Type != JTokenType.Array)) + { + issue = Error(FrameAnimationImportIssueCode.FramesMissing, sourceId, "JSON 缺少 Object 或 Array 格式的 frames。"); + return false; + } + + var frames = ParseFrames(framesToken); + var meta = root["meta"] as JObject; + var size = ParseSize(meta?["size"]); + var imageName = meta?.Value("image") ?? string.Empty; + var tags = ParseTags(meta?["frameTags"]); + document = new AsepriteSourceDocument(frames, tags, size, imageName); + return true; + } + catch (Exception exception) + { + issue = Error( + FrameAnimationImportIssueCode.JsonInvalid, + sourceId, + $"Aseprite JSON 解析失败:{exception.Message}"); + return false; + } + } + + public static bool TryExpandTag( + AsepriteSourceTag tag, + int frameCount, + string sourceId, + out IReadOnlyList indices, + out FrameAnimationImportIssue issue) + { + indices = Array.Empty(); + issue = null; + if (tag == null || tag.From < 0 || tag.To < tag.From || tag.To >= frameCount) + { + issue = Error( + FrameAnimationImportIssueCode.TagRangeInvalid, + sourceId, + $"Tag '{tag?.Name}' 的范围 {tag?.From}..{tag?.To} 无效。"); + return false; + } + + var result = new List(); + switch ((tag.Direction ?? string.Empty).ToLowerInvariant()) + { + case "forward": + AddAscending(result, tag.From, tag.To); + break; + case "reverse": + AddDescending(result, tag.To, tag.From); + break; + case "pingpong": + AddAscending(result, tag.From, tag.To); + AddDescending(result, tag.To - 1, tag.From + 1); + break; + case "pingpong_reverse": + AddDescending(result, tag.To, tag.From); + AddAscending(result, tag.From + 1, tag.To - 1); + break; + default: + issue = Error( + FrameAnimationImportIssueCode.TagDirectionInvalid, + sourceId, + $"Tag '{tag.Name}' 使用了不支持的 direction '{tag.Direction}'。"); + return false; + } + + indices = result; + return true; + } + + private static List ParseFrames(JToken token) + { + var frames = new List(); + if (token is JObject objectFrames) + { + foreach (var property in objectFrames.Properties()) + { + frames.Add(ParseFrame(property.Name, property.Value)); + } + } + else + { + foreach (var item in (JArray)token) + { + frames.Add(ParseFrame(item.Value("filename") ?? string.Empty, item)); + } + } + return frames; + } + + private static AsepriteSourceFrame ParseFrame(string frameName, JToken token) + { + return new AsepriteSourceFrame( + frameName, + ParseRect(token["frame"]), + token.Value("duration") ?? 0, + token.Value("rotated") ?? false, + token.Value("trimmed") ?? false, + ParseRect(token["spriteSourceSize"]), + ParseSize(token["sourceSize"])); + } + + private static List ParseTags(JToken token) + { + var tags = new List(); + if (!(token is JArray array)) + { + return tags; + } + + foreach (var item in array) + { + tags.Add(new AsepriteSourceTag( + item.Value("name") ?? string.Empty, + item.Value("from") ?? -1, + item.Value("to") ?? -1, + item.Value("direction") ?? string.Empty)); + } + return tags; + } + + private static RectInt ParseRect(JToken token) + { + return token == null + ? default + : new RectInt( + token.Value("x") ?? 0, + token.Value("y") ?? 0, + token.Value("w") ?? 0, + token.Value("h") ?? 0); + } + + private static Vector2Int ParseSize(JToken token) + { + return token == null + ? default + : new Vector2Int(token.Value("w") ?? 0, token.Value("h") ?? 0); + } + + private static void AddAscending(List target, int from, int to) + { + for (var index = from; index <= to; index++) + { + target.Add(index); + } + } + + private static void AddDescending(List target, int from, int to) + { + for (var index = from; index >= to; index--) + { + target.Add(index); + } + } + + private static FrameAnimationImportIssue Error( + FrameAnimationImportIssueCode code, + string sourceId, + string message) + { + return new FrameAnimationImportIssue( + FrameAnimationValidationSeverity.Error, + code, + sourceId, + sourceId, + message); + } + } +} diff --git a/Assets/Editor/FrameAnimation/AsepriteJsonParser.cs.meta b/Assets/Editor/FrameAnimation/AsepriteJsonParser.cs.meta new file mode 100644 index 000000000..998c3ac8b --- /dev/null +++ b/Assets/Editor/FrameAnimation/AsepriteJsonParser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a21095473b1495440acab244f9e470c6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/AssemblyInfo.cs b/Assets/Editor/FrameAnimation/AssemblyInfo.cs new file mode 100644 index 000000000..9b37c4ef1 --- /dev/null +++ b/Assets/Editor/FrameAnimation/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("AibisDream.FrameAnimation.Tests.EditMode")] diff --git a/Assets/Editor/FrameAnimation/AssemblyInfo.cs.meta b/Assets/Editor/FrameAnimation/AssemblyInfo.cs.meta new file mode 100644 index 000000000..f1b416002 --- /dev/null +++ b/Assets/Editor/FrameAnimation/AssemblyInfo.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8edeae42e1831084cbf05db9d9e5d1e2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs b/Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs new file mode 100644 index 000000000..fab2e06b7 --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs @@ -0,0 +1,307 @@ +using System; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AibisDream.FrameAnimation.Editor +{ + internal sealed class FrameAnimationTextInputWindow : EditorWindow + { + private string label; + private string value; + private string warning; + private Func validate; + private Action confirm; + private Vector2 scroll; + + public static void Show( + string title, + string label, + string initialValue, + string warning, + Func validate, + Action confirm) + { + var window = CreateInstance(); + window.titleContent = new GUIContent(title); + window.label = label; + window.value = initialValue ?? string.Empty; + window.warning = warning ?? string.Empty; + window.validate = validate; + window.confirm = confirm; + window.minSize = new Vector2(460f, 220f); + window.maxSize = new Vector2(700f, 420f); + window.ShowUtility(); + } + + private void OnGUI() + { + scroll = EditorGUILayout.BeginScrollView(scroll); + EditorGUILayout.LabelField(label, EditorStyles.boldLabel); + GUI.SetNextControlName("FrameAnimationTextInput"); + value = EditorGUILayout.TextField(value); + if (!string.IsNullOrEmpty(warning)) + { + EditorGUILayout.HelpBox(warning, MessageType.Warning); + } + var error = validate?.Invoke(value) ?? string.Empty; + if (!string.IsNullOrEmpty(error)) + { + EditorGUILayout.HelpBox(error, MessageType.Error); + } + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("取消", GUILayout.Width(90f))) + { + Close(); + } + using (new EditorGUI.DisabledScope(!string.IsNullOrEmpty(error))) + { + if (GUILayout.Button("确认", GUILayout.Width(90f))) + { + var callback = confirm; + var result = value; + Close(); + callback?.Invoke(result); + } + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.EndScrollView(); + } + + private void OnEnable() + { + EditorApplication.delayCall += FocusInput; + } + + private void FocusInput() + { + if (this != null) + { + Focus(); + EditorGUI.FocusTextInControl("FrameAnimationTextInput"); + } + } + } + + internal sealed class FrameAnimationManualClipWindow : EditorWindow + { + private FrameAnimationGraph graph; + private FrameClip source; + private string id = "NewClip"; + private string displayName = "New Clip"; + private bool external; + private Action completed; + + public static void Show( + FrameAnimationGraph graph, + FrameClip source, + Action completed) + { + var window = CreateInstance(); + window.titleContent = new GUIContent(source == null ? "Create Manual Clip" : "Copy As Manual Clip"); + window.graph = graph; + window.source = source; + window.completed = completed; + var baseId = source != null ? source.Id + "_Manual" : "NewClip"; + window.id = MakeUniqueId(graph, baseId); + window.displayName = source != null ? source.DisplayName + " Manual" : window.id; + window.minSize = new Vector2(460f, 260f); + window.maxSize = new Vector2(700f, 420f); + window.ShowUtility(); + } + + private void OnGUI() + { + EditorGUILayout.LabelField(source == null ? "创建 Manual Clip" : "复制为 Manual Clip", EditorStyles.boldLabel); + id = EditorGUILayout.TextField("ID", id); + displayName = EditorGUILayout.TextField("Display Name", displayName); + external = EditorGUILayout.ToggleLeft("保存为外部独立 .asset(默认保存为 Graph sub-asset)", external); + var error = FrameAnimationAssetOperations.IsPlayableIdAvailable(graph, id) + ? string.Empty + : "ID 为空或与当前 Graph 的 Clip / Flow 冲突。"; + if (!string.IsNullOrEmpty(error)) + { + EditorGUILayout.HelpBox(error, MessageType.Error); + } + if (source != null) + { + EditorGUILayout.HelpBox( + "帧表将深拷贝,但 Sprite 仍复用原资源;ImportSource 关联会被清除。", + MessageType.Info); + } + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("取消", GUILayout.Width(90f))) + { + Close(); + } + using (new EditorGUI.DisabledScope(!string.IsNullOrEmpty(error))) + { + if (GUILayout.Button("创建", GUILayout.Width(90f))) + { + Create(); + } + } + EditorGUILayout.EndHorizontal(); + } + + private void Create() + { + var path = string.Empty; + if (external) + { + path = EditorUtility.SaveFilePanelInProject( + "保存外部 Manual Clip", + id, + "asset", + "请选择 Assets 下的保存位置。"); + if (string.IsNullOrEmpty(path)) + { + return; + } + } + + var succeeded = source == null + ? FrameAnimationAssetOperations.CreateManualClip(graph, id, displayName, path, out var result, out var error) + : FrameAnimationAssetOperations.CopyToManual(graph, source, id, displayName, path, out result, out error); + if (!succeeded) + { + EditorUtility.DisplayDialog("操作失败", error, "确定"); + return; + } + var callback = completed; + Close(); + callback?.Invoke(result); + } + + private static string MakeUniqueId(FrameAnimationGraph graph, string baseId) + { + var candidate = baseId; + var suffix = 2; + while (!FrameAnimationAssetOperations.IsPlayableIdAvailable(graph, candidate)) + { + candidate = baseId + suffix++; + } + return candidate; + } + } + + internal sealed class FrameAnimationExistingClipWindow : EditorWindow + { + private FrameAnimationGraph graph; + private FrameClip clip; + private Action completed; + + public static void Show(FrameAnimationGraph graph, Action completed) + { + var window = CreateInstance(); + window.titleContent = new GUIContent("Add Existing Manual Clip"); + window.graph = graph; + window.completed = completed; + window.minSize = new Vector2(460f, 180f); + window.maxSize = new Vector2(640f, 260f); + window.ShowUtility(); + } + + private void OnGUI() + { + EditorGUILayout.LabelField("添加外部 Manual Clip", EditorStyles.boldLabel); + clip = (FrameClip)EditorGUILayout.ObjectField("FrameClip", clip, typeof(FrameClip), false); + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("取消", GUILayout.Width(90f))) + { + Close(); + } + using (new EditorGUI.DisabledScope(clip == null)) + { + if (GUILayout.Button("添加", GUILayout.Width(90f))) + { + if (!FrameAnimationAssetOperations.AddExistingManualClip(graph, clip, out var error)) + { + EditorUtility.DisplayDialog("添加失败", error, "确定"); + return; + } + var callback = completed; + var result = clip; + Close(); + callback?.Invoke(result); + } + } + EditorGUILayout.EndHorizontal(); + } + } + + internal sealed class FrameAnimationFlowWindow : EditorWindow + { + private FrameAnimationGraph graph; + private AnimationNode entry; + private string id; + private string displayName; + private Action completed; + + internal static void Show( + FrameAnimationGraph graph, + AnimationNode entry, + Action completed) + { + var window = CreateInstance(); + window.titleContent = new GUIContent("Create Animation Flow"); + window.graph = graph; + window.entry = entry; + window.id = FrameAnimationGraphMutationService.MakeUniqueFlowId(graph, entry); + window.displayName = window.id; + window.completed = completed; + window.minSize = new Vector2(460f, 230f); + window.maxSize = new Vector2(700f, 360f); + window.ShowUtility(); + } + + private void OnGUI() + { + EditorGUILayout.LabelField("从选中节点创建 Flow", EditorStyles.boldLabel); + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.TextField("Entry Node", entry?.DisplayName ?? string.Empty); + } + id = EditorGUILayout.TextField("ID", id); + displayName = EditorGUILayout.TextField("Display Name", displayName); + var idError = FrameAnimationAssetOperations.IsPlayableIdAvailable(graph, id) + ? string.Empty + : "ID 为空或与当前 Graph 中的 Clip / Flow 冲突。"; + var owner = graph?.Flows.FirstOrDefault(flow => flow != null && flow.EntryNodeId == entry?.InternalId); + if (owner != null) + { + idError = $"该节点已是 Flow '{owner.Id}' 的入口。"; + } + if (!string.IsNullOrEmpty(idError)) + { + EditorGUILayout.HelpBox(idError, MessageType.Error); + } + GUILayout.FlexibleSpace(); + EditorGUILayout.BeginHorizontal(); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("取消", GUILayout.Width(90f))) Close(); + using (new EditorGUI.DisabledScope(!string.IsNullOrEmpty(idError))) + { + if (GUILayout.Button("创建", GUILayout.Width(90f))) + { + if (!FrameAnimationGraphMutationService.CreateFlow( + graph, entry, id, displayName, out var flow, out var error)) + { + EditorUtility.DisplayDialog("创建 Flow 失败", error, "确定"); + return; + } + var callback = completed; + Close(); + callback?.Invoke(flow); + } + } + EditorGUILayout.EndHorizontal(); + } + } +} diff --git a/Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs.meta b/Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs.meta new file mode 100644 index 000000000..a0aec5932 --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationEditorDialogs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c8f58e7b80263c24087a98874796e91d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs b/Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs new file mode 100644 index 000000000..53ca236e8 --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs @@ -0,0 +1,744 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AibisDream.FrameAnimation.Editor +{ + internal enum FrameAnimationEditorSelectionKind + { + None, + Graph, + Clip, + Flow, + Source, + Node, + Edge + } + + internal readonly struct FrameAnimationEditorSelection + { + public FrameAnimationEditorSelectionKind Kind { get; } + public object Value { get; } + + public FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind kind, object value) + { + Kind = kind; + Value = value; + } + } + + internal enum FrameAnimationClipFilter + { + All, + Manual, + Imported, + Normal, + Missing, + Referenced, + Unused + } + + internal enum FrameAnimationClipSort + { + Name, + Source, + FrameCount, + Duration, + Missing, + ReferenceCount + } + + internal static class FrameAnimationAssetReferenceIndex + { + public static IReadOnlyList FindGraphsReferencing(FrameClip clip) + { + if (clip == null) + { + return Array.Empty(); + } + + return AssetDatabase.FindAssets("t:FrameAnimationGraph") + .Select(guid => AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid))) + .Where(graph => graph != null && graph.Clips.Any(item => item == clip)) + .Distinct() + .OrderBy(graph => AssetDatabase.GetAssetPath(graph), StringComparer.Ordinal) + .ToArray(); + } + } + + internal static class FrameAnimationResourceQuery + { + public static IReadOnlyList QueryClips( + FrameAnimationGraph graph, + string search, + FrameAnimationClipFilter filter, + FrameAnimationClipSort sort) + { + if (graph == null) + { + return Array.Empty(); + } + + var sourceNames = graph.ImportSources.Where(source => source != null) + .GroupBy(source => source.InternalId ?? string.Empty) + .ToDictionary(group => group.Key, group => group.First().DisplayName ?? string.Empty); + var query = graph.Clips.Where(clip => clip != null && MatchesSearch(clip, sourceNames, search)); + query = filter switch + { + FrameAnimationClipFilter.Manual => query.Where(clip => !clip.IsImported), + FrameAnimationClipFilter.Imported => query.Where(clip => clip.IsImported), + FrameAnimationClipFilter.Normal => query.Where(clip => !clip.IsImported || !clip.ImportInfo.IsMissingFromSource), + FrameAnimationClipFilter.Missing => query.Where(clip => clip.IsImported && clip.ImportInfo.IsMissingFromSource), + FrameAnimationClipFilter.Referenced => query.Where(clip => ReferenceCount(graph, clip) > 0), + FrameAnimationClipFilter.Unused => query.Where(clip => ReferenceCount(graph, clip) == 0), + _ => query + }; + + IOrderedEnumerable ordered = sort switch + { + FrameAnimationClipSort.Source => query.OrderBy(clip => SourceName(clip, sourceNames), StringComparer.Ordinal), + FrameAnimationClipSort.FrameCount => query.OrderBy(clip => clip.FrameCount), + FrameAnimationClipSort.Duration => query.OrderBy(clip => clip.TotalDurationMs), + FrameAnimationClipSort.Missing => query.OrderBy(clip => clip.IsImported && clip.ImportInfo.IsMissingFromSource ? 1 : 0), + FrameAnimationClipSort.ReferenceCount => query.OrderBy(clip => ReferenceCount(graph, clip)), + _ => query.OrderBy(clip => clip.DisplayName ?? clip.Id, StringComparer.Ordinal) + }; + return ordered.ThenBy(clip => clip.Id, StringComparer.Ordinal) + .ThenBy(clip => AssetDatabase.GetAssetPath(clip), StringComparer.Ordinal) + .ToArray(); + } + + public static int ReferenceCount(FrameAnimationGraph graph, FrameClip clip) + { + return graph?.Nodes.Count(node => node != null && node.ClipId == clip?.Id) ?? 0; + } + + public static string SourceName( + FrameClip clip, + IReadOnlyDictionary sourceNames = null) + { + if (clip == null || !clip.IsImported) + { + return "Manual"; + } + var sourceId = clip.ImportInfo?.ImportSourceId; + if (sourceNames != null && !string.IsNullOrEmpty(sourceId) && + sourceNames.TryGetValue(sourceId, out var name)) + { + return name; + } + return sourceId ?? string.Empty; + } + + private static bool MatchesSearch( + FrameClip clip, + IReadOnlyDictionary sourceNames, + string search) + { + if (string.IsNullOrWhiteSpace(search)) + { + return true; + } + return Contains(clip.Id, search) || Contains(clip.DisplayName, search) || + Contains(clip.ImportInfo?.SourceTagName, search) || + Contains(SourceName(clip, sourceNames), search); + } + + private static bool Contains(string value, string search) + { + return !string.IsNullOrEmpty(value) && value.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0; + } + } + + internal static class FrameAnimationAssetOperations + { + public static bool IsPlayableIdAvailable( + FrameAnimationGraph graph, + string id, + FrameClip exceptClip = null, + AnimationFlow exceptFlow = null) + { + return graph != null && !string.IsNullOrWhiteSpace(id) && + graph.Clips.All(clip => clip == null || clip == exceptClip || clip.Id != id) && + graph.Flows.All(flow => flow == null || flow == exceptFlow || flow.Id != id); + } + + public static bool CreateManualClip( + FrameAnimationGraph graph, + string id, + string displayName, + string externalPath, + out FrameClip clip, + out string error) + { + clip = null; + error = string.Empty; + if (!IsPlayableIdAvailable(graph, id)) + { + error = "Clip id 为空或与现有 Clip / Flow 冲突。"; + return false; + } + + Undo.IncrementCurrentGroup(); + var group = Undo.GetCurrentGroup(); + Undo.SetCurrentGroupName("Create Manual Frame Clip"); + try + { + Undo.RecordObject(graph, "Add Manual Frame Clip"); + clip = ScriptableObject.CreateInstance(); + clip.name = id; + clip.Configure(id, string.IsNullOrWhiteSpace(displayName) ? id : displayName, + Array.Empty(), 1f, + graph.Settings.NewManualClipDefaultEndBehavior); + if (string.IsNullOrWhiteSpace(externalPath)) + { + AssetDatabase.AddObjectToAsset(clip, graph); + } + else + { + AssetDatabase.CreateAsset(clip, externalPath); + } + Undo.RegisterCreatedObjectUndo(clip, "Create Manual Frame Clip"); + graph.AddClip(clip); + EditorUtility.SetDirty(graph); + EditorUtility.SetDirty(clip); + AssetDatabase.SaveAssets(); + Undo.CollapseUndoOperations(group); + return true; + } + catch (Exception exception) + { + Undo.RevertAllDownToGroup(group); + clip = null; + error = exception.Message; + return false; + } + } + + public static bool AddExistingManualClip( + FrameAnimationGraph graph, + FrameClip clip, + out string error) + { + error = string.Empty; + if (graph == null || clip == null) + { + error = "Graph 或 Clip 为空。"; + return false; + } + if (clip.IsImported || AssetDatabase.IsSubAsset(clip) || + string.IsNullOrEmpty(AssetDatabase.GetAssetPath(clip))) + { + error = "只能添加独立 .asset 形式的 Manual Clip。"; + return false; + } + if (graph.Clips.Contains(clip)) + { + error = "当前 Graph 已引用该 Clip。"; + return false; + } + if (!IsPlayableIdAvailable(graph, clip.Id)) + { + error = $"playable id '{clip.Id}' 与当前 Graph 中的 Clip / Flow 冲突。"; + return false; + } + + Undo.RecordObject(graph, "Add Existing Manual Frame Clip"); + graph.AddClip(clip); + EditorUtility.SetDirty(graph); + return true; + } + + public static bool CopyToManual( + FrameAnimationGraph graph, + FrameClip source, + string id, + string displayName, + string externalPath, + out FrameClip copy, + out string error) + { + copy = null; + error = string.Empty; + if (source == null || !IsPlayableIdAvailable(graph, id)) + { + error = "来源为空,或新 id 与现有 Clip / Flow 冲突。"; + return false; + } + + Undo.IncrementCurrentGroup(); + var group = Undo.GetCurrentGroup(); + Undo.SetCurrentGroupName("Copy Frame Clip As Manual"); + try + { + Undo.RecordObject(graph, "Add Manual Frame Clip Copy"); + copy = ScriptableObject.CreateInstance(); + copy.name = id; + copy.Configure(id, + string.IsNullOrWhiteSpace(displayName) ? source.DisplayName : displayName, + source.Frames.Select(frame => frame == null + ? null + : new FrameAnimationFrame(frame.Sprite, frame.DurationMs, frame.FrameName, frame.SourceIndex)), + source.Speed, + source.DefaultEndBehavior); + if (string.IsNullOrWhiteSpace(externalPath)) + { + AssetDatabase.AddObjectToAsset(copy, graph); + } + else + { + AssetDatabase.CreateAsset(copy, externalPath); + } + Undo.RegisterCreatedObjectUndo(copy, "Create Manual Frame Clip Copy"); + graph.AddClip(copy); + EditorUtility.SetDirty(graph); + EditorUtility.SetDirty(copy); + AssetDatabase.SaveAssets(); + Undo.CollapseUndoOperations(group); + return true; + } + catch (Exception exception) + { + Undo.RevertAllDownToGroup(group); + copy = null; + error = exception.Message; + return false; + } + } + + public static bool RenameClip( + FrameAnimationGraph graph, + FrameClip clip, + string newId, + out string error) + { + error = string.Empty; + if (graph == null || clip == null || !graph.Clips.Contains(clip)) + { + error = "Clip 不属于当前 Graph。"; + return false; + } + var owners = FrameAnimationAssetReferenceIndex.FindGraphsReferencing(clip); + if (!AssetDatabase.IsSubAsset(clip) && owners.Count > 1) + { + error = "外部 Manual Clip 被多个 Graph 共享,禁止重命名:" + + string.Join(", ", owners.Select(owner => owner.name)); + return false; + } + if (!IsPlayableIdAvailable(graph, newId, clip)) + { + error = "新 id 为空或与现有 Clip / Flow 冲突。"; + return false; + } + + var oldId = clip.Id; + Undo.IncrementCurrentGroup(); + var group = Undo.GetCurrentGroup(); + Undo.SetCurrentGroupName("Rename Frame Clip"); + Undo.RecordObject(graph, "Update Frame Clip References"); + Undo.RecordObject(clip, "Rename Frame Clip"); + clip.SetId(newId); + foreach (var node in graph.Nodes.Where(node => node != null && node.ClipId == oldId)) + { + node.SetClipId(newId); + } + if (graph.Settings.DefaultPlayableId == oldId) + { + graph.Settings.SetDefaultPlayableId(newId); + } + EditorUtility.SetDirty(graph); + EditorUtility.SetDirty(clip); + Undo.CollapseUndoOperations(group); + return true; + } + + public static bool RenameFlow( + FrameAnimationGraph graph, + AnimationFlow flow, + string newId, + out string error) + { + error = string.Empty; + if (graph == null || flow == null || !graph.Flows.Contains(flow) || + !IsPlayableIdAvailable(graph, newId, exceptFlow: flow)) + { + error = "Flow 不属于当前 Graph,或新 id 与现有 Clip / Flow 冲突。"; + return false; + } + + var oldId = flow.Id; + Undo.RecordObject(graph, "Rename Animation Flow"); + flow.SetId(newId); + if (graph.Settings.DefaultPlayableId == oldId) + { + graph.Settings.SetDefaultPlayableId(newId); + } + foreach (var data in graph.EditorData.FlowEditorData.Where(data => data != null && data.FlowId == oldId)) + { + data.SetFlowId(newId); + } + EditorUtility.SetDirty(graph); + return true; + } + + public static bool RenameGraph(FrameAnimationGraph graph, string newId, out string error) + { + error = string.Empty; + if (graph == null || string.IsNullOrWhiteSpace(newId)) + { + error = "Graph id 不能为空。"; + return false; + } + Undo.RecordObject(graph, "Rename Frame Animation Graph"); + graph.SetId(newId); + EditorUtility.SetDirty(graph); + return true; + } + + public static bool RemoveClip(FrameAnimationGraph graph, FrameClip clip, out string error) + { + if (!CanRemoveClip(graph, clip, out error)) + { + return false; + } + + Undo.IncrementCurrentGroup(); + var group = Undo.GetCurrentGroup(); + Undo.SetCurrentGroupName("Remove Frame Clip"); + Undo.RecordObject(graph, "Remove Frame Clip Reference"); + graph.RemoveClip(clip); + if (AssetDatabase.IsSubAsset(clip) && AssetDatabase.GetAssetPath(clip) == AssetDatabase.GetAssetPath(graph)) + { + Undo.DestroyObjectImmediate(clip); + } + EditorUtility.SetDirty(graph); + AssetDatabase.SaveAssets(); + Undo.CollapseUndoOperations(group); + return true; + } + + public static bool CanRemoveClip(FrameAnimationGraph graph, FrameClip clip, out string error) + { + error = string.Empty; + if (graph == null || clip == null || !graph.Clips.Contains(clip)) + { + error = "Clip 不属于当前 Graph。"; + return false; + } + var nodeCount = graph.Nodes.Count(node => node != null && node.ClipId == clip.Id); + if (nodeCount > 0) + { + error = $"Clip 仍被 {nodeCount} 个 AnimationNode 引用。"; + return false; + } + if (graph.Settings.DefaultPlayableId == clip.Id) + { + error = "Clip 仍被 defaultPlayableId 引用。"; + return false; + } + return true; + } + + public static bool RemoveFlow(FrameAnimationGraph graph, AnimationFlow flow, out string error) + { + if (!CanRemoveFlow(graph, flow, out error)) + { + return false; + } + Undo.RecordObject(graph, "Remove Animation Flow"); + graph.RemoveFlow(flow); + graph.EditorData.RemoveFlowData(flow.Id); + EditorUtility.SetDirty(graph); + return true; + } + + public static bool CanRemoveFlow(FrameAnimationGraph graph, AnimationFlow flow, out string error) + { + error = string.Empty; + if (graph == null || flow == null || !graph.Flows.Contains(flow)) + { + error = "Flow 不属于当前 Graph。"; + return false; + } + if (graph.Settings.DefaultPlayableId == flow.Id) + { + error = "Flow 仍被 defaultPlayableId 引用。"; + return false; + } + return true; + } + + public static bool RemoveSource( + FrameAnimationGraph graph, + FrameAnimationImportSource source, + out string error) + { + error = string.Empty; + if (graph == null || source == null || !graph.ImportSources.Contains(source)) + { + error = "ImportSource 不属于当前 Graph。"; + return false; + } + var clips = graph.Clips.Where(clip => clip != null && + clip.ImportInfo?.ImportSourceId == source.InternalId).ToArray(); + if (clips.Length > 0) + { + error = "ImportSource 仍关联 Imported Clip:" + string.Join(", ", clips.Select(clip => clip.Id)); + return false; + } + Undo.RecordObject(graph, "Remove Frame Animation ImportSource"); + graph.RemoveImportSource(source); + EditorUtility.SetDirty(graph); + return true; + } + } + + internal sealed class FrameAnimationEditorIssue + { + public FrameAnimationValidationSeverity Severity { get; } + public string Code { get; } + public FrameAnimationEditorSelection Selection { get; } + public string Message { get; } + public string Suggestion { get; } + + public FrameAnimationEditorIssue( + FrameAnimationValidationSeverity severity, + string code, + FrameAnimationEditorSelection selection, + string message, + string suggestion) + { + Severity = severity; + Code = code ?? string.Empty; + Selection = selection; + Message = message ?? string.Empty; + Suggestion = suggestion ?? string.Empty; + } + } + + internal static class FrameAnimationEditorValidationService + { + public static IReadOnlyList Validate( + FrameAnimationGraph graph, + bool includeImports, + out FrameAnimationImportPreview importPreview) + { + importPreview = null; + if (graph == null) + { + return Array.Empty(); + } + + var issues = FrameAnimationGraphValidator.Validate(graph).Issues + .Select(issue => new FrameAnimationEditorIssue( + issue.Severity, + issue.Code.ToString(), + Locate(graph, issue.TargetType, issue.TargetId), + issue.Message, + Suggestion(issue.Code))) + .ToList(); + + foreach (var duplicate in graph.Clips.Where(clip => clip != null) + .GroupBy(clip => clip).Where(group => group.Count() > 1)) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Error, + "DuplicateClipReference", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Clip, duplicate.Key), + $"Graph 重复引用 Clip '{duplicate.Key.Id}'。", + "移除重复的 Clip 引用。")); + } + + var graphPath = AssetDatabase.GetAssetPath(graph); + foreach (var clip in graph.Clips.Where(clip => clip != null)) + { + if (AssetDatabase.IsSubAsset(clip) && AssetDatabase.GetAssetPath(clip) != graphPath) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Error, + "ForeignSubAssetClip", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Clip, clip), + $"Clip '{clip.Id}' 是其他资产的 sub-asset。", + "移除该引用,并复制为当前 Graph 的 Manual Clip。")); + } + if (clip.IsImported && (!AssetDatabase.IsSubAsset(clip) || AssetDatabase.GetAssetPath(clip) != graphPath)) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Error, + "ImportedClipOwnership", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Clip, clip), + $"Imported Clip '{clip.Id}' 不是当前 Graph 的 sub-asset。", + "删除非法引用并从对应 ImportSource 重新刷新。")); + } + } + + foreach (var node in graph.Nodes.Where(node => node != null)) + { + var clip = graph.Clips.SingleOrDefault(item => item != null && item.Id == node.ClipId); + if (clip?.ImportInfo?.IsMissingFromSource == true) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Error, + "NodeReferencesMissingClip", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Node, node), + $"Node '{node.InternalId}' 引用了 Missing Clip '{clip.Id}'。", + "恢复源 Tag、修改节点引用或删除该节点。")); + } + } + + var nodeIds = new HashSet(graph.Nodes.Where(node => node != null) + .Select(node => node.InternalId)); + foreach (var node in graph.Nodes.Where(node => node != null && + graph.EditorData.NodeEditorData.All(data => data == null || data.NodeId != node.InternalId))) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Warning, + "EditorDataMissing", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Node, node), + $"Node '{node.InternalId}' 缺少画布位置数据。", + "打开 Graph Editor 初始化位置,或执行自动布局。")); + } + foreach (var data in graph.EditorData.NodeEditorData.Where(data => data != null && + !nodeIds.Contains(data.NodeId))) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Warning, + "EditorDataOrphan", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Graph, graph), + $"存在孤立的 NodeEditorData '{data.NodeId}'。", + "该数据不会影响运行时;确认无引用后可由后续维护工具清理。")); + } + foreach (var duplicate in graph.EditorData.NodeEditorData.Where(data => data != null) + .GroupBy(data => data.NodeId).Where(group => group.Count() > 1)) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Error, + "EditorDataDuplicate", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Graph, graph), + $"NodeEditorData '{duplicate.Key}' 重复。", + "保留一条对应位置数据并移除重复项。")); + } + + var flowIds = new HashSet(graph.Flows.Where(flow => flow != null).Select(flow => flow.Id)); + foreach (var flow in graph.Flows.Where(flow => flow != null && + graph.EditorData.FlowEditorData.All(data => data == null || data.FlowId != flow.Id))) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Warning, + "FlowEditorDataMissing", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Flow, flow), + $"Flow '{flow.Id}' 缺少画布颜色数据。", + "打开 Graph Editor 初始化 Flow 颜色。")); + } + foreach (var data in graph.EditorData.FlowEditorData.Where(data => data != null && + !flowIds.Contains(data.FlowId))) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Warning, + "FlowEditorDataOrphan", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Graph, graph), + $"存在孤立的 FlowEditorData '{data.FlowId}'。", + "确认 Flow 已删除后可由后续维护工具清理。")); + } + foreach (var duplicate in graph.EditorData.FlowEditorData.Where(data => data != null) + .GroupBy(data => data.FlowId).Where(group => group.Count() > 1)) + { + issues.Add(new FrameAnimationEditorIssue( + FrameAnimationValidationSeverity.Error, + "FlowEditorDataDuplicate", + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Graph, graph), + $"FlowEditorData '{duplicate.Key}' 重复。", + "保留一条对应颜色数据并移除重复项。")); + } + + if (!includeImports) + { + return issues; + } + + importPreview = FrameAnimationImportService.PreviewAll(graph); + foreach (var sourcePreview in importPreview.Sources) + { + foreach (var importIssue in sourcePreview.Issues) + { + issues.Add(new FrameAnimationEditorIssue( + importIssue.Severity, + importIssue.Code.ToString(), + new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Source, sourcePreview.Source), + importIssue.Message, + "打开对应 ImportSource,修复来源设置后重新 Preview。")); + } + } + return issues; + } + + private static FrameAnimationEditorSelection Locate( + FrameAnimationGraph graph, + FrameAnimationValidationTargetType type, + string id) + { + return type switch + { + FrameAnimationValidationTargetType.Clip => new FrameAnimationEditorSelection( + FrameAnimationEditorSelectionKind.Clip, graph.Clips.FirstOrDefault(clip => clip != null && clip.Id == id)), + FrameAnimationValidationTargetType.Flow => new FrameAnimationEditorSelection( + FrameAnimationEditorSelectionKind.Flow, graph.Flows.FirstOrDefault(flow => flow != null && flow.Id == id)), + FrameAnimationValidationTargetType.Node => new FrameAnimationEditorSelection( + FrameAnimationEditorSelectionKind.Node, graph.Nodes.FirstOrDefault(node => node != null && node.InternalId == id)), + FrameAnimationValidationTargetType.Edge => new FrameAnimationEditorSelection( + FrameAnimationEditorSelectionKind.Edge, graph.Edges.FirstOrDefault(edge => edge != null && edge.InternalId == id)), + FrameAnimationValidationTargetType.ImportSource => new FrameAnimationEditorSelection( + FrameAnimationEditorSelectionKind.Source, graph.ImportSources.FirstOrDefault(source => source != null && source.InternalId == id)), + _ => new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Graph, graph) + }; + } + + private static string Suggestion(FrameAnimationValidationCode code) + { + return code switch + { + FrameAnimationValidationCode.PlayableIdEmpty => "使用正式 Rename 命令设置唯一 playable id。", + FrameAnimationValidationCode.PlayableIdDuplicate => "重命名冲突的 Clip 或 Flow。", + FrameAnimationValidationCode.ClipFramesEmpty => "为 Manual Clip 添加帧,或刷新 Imported Clip 来源。", + FrameAnimationValidationCode.FrameDurationInvalid => "将 durationMs 修改为大于 0 的整数。", + FrameAnimationValidationCode.DefaultPlayableInvalid => "在 Graph 属性中选择有效的默认 Clip 或 Flow。", + FrameAnimationValidationCode.ImportedClipMissingFromSource => "恢复源 Tag,或确认没有引用后删除 Missing Clip。", + _ => "打开问题对象并修复对应字段或引用。" + }; + } + } + + internal static class FrameAnimationWorkspaceState + { + private const string Prefix = "AibisDream.FrameAnimation.Workspace."; + + public static string Key(FrameAnimationGraph graph, string name) + { + var graphPath = graph != null ? AssetDatabase.GetAssetPath(graph) : string.Empty; + var graphGuid = string.IsNullOrEmpty(graphPath) ? "none" : AssetDatabase.AssetPathToGUID(graphPath); + var project = Hash128.Compute(Application.dataPath).ToString(); + return Prefix + project + "." + graphGuid + "." + name; + } + + public static float GetFloat(FrameAnimationGraph graph, string name, float fallback) => + EditorPrefs.GetFloat(Key(graph, name), fallback); + + public static void SetFloat(FrameAnimationGraph graph, string name, float value) => + EditorPrefs.SetFloat(Key(graph, name), value); + + public static string GetString(FrameAnimationGraph graph, string name, string fallback) => + EditorPrefs.GetString(Key(graph, name), fallback); + + public static void SetString(FrameAnimationGraph graph, string name, string value) => + EditorPrefs.SetString(Key(graph, name), value ?? string.Empty); + + public static bool GetBool(FrameAnimationGraph graph, string name, bool fallback) => + EditorPrefs.GetBool(Key(graph, name), fallback); + + public static void SetBool(FrameAnimationGraph graph, string name, bool value) => + EditorPrefs.SetBool(Key(graph, name), value); + } +} diff --git a/Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs.meta b/Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs.meta new file mode 100644 index 000000000..3f10e911a --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationEditorServices.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2643ad174ef237e43b98400d60c4a201 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs b/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs new file mode 100644 index 000000000..bd562cbe7 --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs @@ -0,0 +1,539 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using UnityEditor; +using UnityEngine; + +namespace AibisDream.FrameAnimation.Editor +{ + internal sealed class FrameAnimationGraphImpact + { + public IReadOnlyList Flows { get; } + public int LostNodeCount { get; } + + internal FrameAnimationGraphImpact(IReadOnlyList flows, int lostNodeCount) + { + Flows = flows ?? Array.Empty(); + LostNodeCount = lostNodeCount; + } + } + + internal static class FrameAnimationGraphImpactAnalyzer + { + public static FrameAnimationGraphImpact AnalyzeEdgeRemoval( + FrameAnimationGraph graph, + IEnumerable edges) + { + var removed = new HashSet((edges ?? Array.Empty()).Where(edge => edge != null)); + return Analyze(graph, Array.Empty(), removed); + } + + public static FrameAnimationGraphImpact AnalyzeNodeRemoval( + FrameAnimationGraph graph, + IEnumerable nodes) + { + var removedNodes = new HashSet((nodes ?? Array.Empty()).Where(node => node != null)); + var removedIds = new HashSet(removedNodes.Select(node => node.InternalId)); + var removedEdges = new HashSet(graph.Edges.Where(edge => edge != null && + (removedIds.Contains(edge.FromNodeId) || removedIds.Contains(edge.ToNodeId)))); + return Analyze(graph, removedNodes, removedEdges); + } + + public static FrameAnimationGraphImpact AnalyzeRemoval( + FrameAnimationGraph graph, + IEnumerable nodes, + IEnumerable edges) + { + if (graph == null) + { + return new FrameAnimationGraphImpact(Array.Empty(), 0); + } + var removedNodes = new HashSet((nodes ?? Array.Empty()) + .Where(node => node != null)); + var removedIds = new HashSet(removedNodes.Select(node => node.InternalId)); + var removedEdges = new HashSet((edges ?? Array.Empty()) + .Where(edge => edge != null)); + removedEdges.UnionWith(graph.Edges.Where(edge => edge != null && + (removedIds.Contains(edge.FromNodeId) || removedIds.Contains(edge.ToNodeId)))); + return Analyze(graph, removedNodes, removedEdges); + } + + private static FrameAnimationGraphImpact Analyze( + FrameAnimationGraph graph, + IReadOnlyCollection removedNodes, + IReadOnlyCollection removedEdges) + { + if (graph == null) + { + return new FrameAnimationGraphImpact(Array.Empty(), 0); + } + var topology = new FrameAnimationGraphTopology(graph); + var removedNodeIds = new HashSet(removedNodes.Select(node => node.InternalId)); + var affected = new List(); + var lost = new HashSet(); + foreach (var flow in graph.Flows.Where(flow => flow != null)) + { + var before = topology.GetReachable(flow.EntryNodeId).Nodes + .Where(node => node != null).Select(node => node.InternalId).ToHashSet(); + var after = ReachableWithout(graph, flow.EntryNodeId, removedNodeIds, removedEdges); + var flowLost = before.Where(nodeId => !after.Contains(nodeId)).ToArray(); + if (flowLost.Length > 0) + { + affected.Add(flow); + lost.UnionWith(flowLost); + } + } + return new FrameAnimationGraphImpact( + affected.OrderBy(flow => flow.Id, StringComparer.Ordinal).ToArray(), + lost.Count); + } + + private static HashSet ReachableWithout( + FrameAnimationGraph graph, + string entry, + HashSet removedNodeIds, + IReadOnlyCollection removedEdges) + { + var result = new HashSet(); + if (removedNodeIds.Contains(entry ?? string.Empty)) + { + return result; + } + var outgoing = graph.Edges.Where(edge => edge != null && !removedEdges.Contains(edge)) + .GroupBy(edge => edge.FromNodeId ?? string.Empty) + .ToDictionary(group => group.Key, group => group.ToArray()); + var queue = new Queue(); + queue.Enqueue(entry ?? string.Empty); + while (queue.Count > 0) + { + var id = queue.Dequeue(); + if (removedNodeIds.Contains(id) || !result.Add(id)) + { + continue; + } + if (outgoing.TryGetValue(id, out var edges)) + { + foreach (var edge in edges) + { + queue.Enqueue(edge.ToNodeId ?? string.Empty); + } + } + } + return result; + } + } + + internal static class FrameAnimationGraphMutationService + { + private static readonly Color[] FlowColors = + { + new Color(0.24f, 0.65f, 1f), new Color(0.42f, 0.8f, 0.42f), + new Color(1f, 0.62f, 0.24f), new Color(0.82f, 0.42f, 0.9f), + new Color(1f, 0.38f, 0.52f), new Color(0.25f, 0.82f, 0.78f) + }; + + public static bool CreateNode( + FrameAnimationGraph graph, + FrameClip clip, + Vector2 position, + out AnimationNode node, + out string error) + { + node = null; + error = string.Empty; + if (graph == null || clip == null || !graph.Clips.Contains(clip)) + { + error = "只能为当前 Graph 中的 FrameClip 创建节点。"; + return false; + } + Undo.RecordObject(graph, "Create Frame Animation Node"); + node = new AnimationNode(clip.Id, + string.IsNullOrWhiteSpace(clip.DisplayName) ? clip.Id : clip.DisplayName); + graph.AddNode(node); + graph.EditorData.GetOrCreateNodeData(node.InternalId, position).SetPosition(position); + Dirty(graph); + return true; + } + + public static bool TryConnect( + FrameAnimationGraph graph, + AnimationNode from, + AnimationNode to, + out AnimationEdge edge, + out string error) + { + edge = null; + if (!CanConnect(graph, from, to, out error)) + { + return false; + } + Undo.RecordObject(graph, "Connect Frame Animation Nodes"); + edge = new AnimationEdge(from.InternalId, to.InternalId); + graph.AddEdge(edge); + Dirty(graph); + return true; + } + + public static bool CanConnect( + FrameAnimationGraph graph, + AnimationNode from, + AnimationNode to, + out string error) + { + error = string.Empty; + if (graph == null || from == null || to == null || + graph.Nodes.Count(node => node == from) != 1 || graph.Nodes.Count(node => node == to) != 1) + { + error = "连接两端必须唯一属于当前 Graph。"; + return false; + } + if (from == to || from.InternalId == to.InternalId) + { + error = "节点不允许连接到自身。"; + return false; + } + var topology = new FrameAnimationGraphTopology(graph); + if (topology.GetOutgoing(from.InternalId).Count > 0) + { + error = "第一版每个节点最多只能有一个后继。"; + return false; + } + if (from.EndBehaviorOverride.HasValue) + { + error = "该节点已设置终点结束行为,请先清除覆盖。"; + return false; + } + if (graph.Edges.Any(existing => existing != null && + existing.FromNodeId == from.InternalId && existing.ToNodeId == to.InternalId)) + { + error = "该连接已经存在。"; + return false; + } + if (topology.WouldCreateCycle(from.InternalId, to.InternalId)) + { + error = "该连接会形成自连接或多节点环路。"; + return false; + } + return true; + } + + public static void SetNodeDisplayName(FrameAnimationGraph graph, AnimationNode node, string value) + { + Undo.RecordObject(graph, "Rename Frame Animation Node"); + node.SetDisplayName(value); + Dirty(graph); + } + + public static void SetNodeClip(FrameAnimationGraph graph, AnimationNode node, FrameClip clip) + { + Undo.RecordObject(graph, "Set Frame Animation Node Clip"); + node.SetClipId(clip != null ? clip.Id : string.Empty); + Dirty(graph); + } + + public static void SetNodeSpeed(FrameAnimationGraph graph, AnimationNode node, float? value) + { + Undo.RecordObject(graph, "Set Frame Animation Node Speed"); + node.SetSpeedOverride(value); + Dirty(graph); + } + + public static bool SetNodeEndBehavior( + FrameAnimationGraph graph, + AnimationNode node, + FrameClipEndBehavior? value, + bool removeOutgoing, + out string error) + { + error = string.Empty; + var outgoing = graph.Edges.Where(edge => edge != null && edge.FromNodeId == node.InternalId).ToArray(); + if (value.HasValue && outgoing.Length > 0 && !removeOutgoing) + { + error = "节点仍有后继 Edge。"; + return false; + } + Undo.RecordObject(graph, "Set Frame Animation Node End Behavior"); + if (value.HasValue) + { + foreach (var edge in outgoing) + { + graph.RemoveEdge(edge); + } + } + node.SetEndBehaviorOverride(value); + Dirty(graph); + return true; + } + + public static void RemoveEdges(FrameAnimationGraph graph, IEnumerable edges) + { + var items = (edges ?? Array.Empty()).Where(edge => edge != null).Distinct().ToArray(); + if (graph == null || items.Length == 0) + { + return; + } + Undo.RecordObject(graph, "Disconnect Frame Animation Nodes"); + foreach (var edge in items) + { + graph.RemoveEdge(edge); + } + Dirty(graph); + } + + public static bool RemoveNodes( + FrameAnimationGraph graph, + IEnumerable nodes, + bool deleteEntryFlows, + out string error) + { + return RemoveNodesAndEdges( + graph, nodes, Array.Empty(), deleteEntryFlows, out error); + } + + public static bool RemoveNodesAndEdges( + FrameAnimationGraph graph, + IEnumerable nodes, + IEnumerable additionalEdges, + bool deleteEntryFlows, + out string error) + { + error = string.Empty; + if (graph == null) + { + error = "Graph 已失效。"; + return false; + } + var items = (nodes ?? Array.Empty()).Where(node => node != null).Distinct().ToArray(); + var extraEdges = (additionalEdges ?? Array.Empty()) + .Where(edge => edge != null).Distinct().ToArray(); + var ids = new HashSet(items.Select(node => node.InternalId)); + var entryFlows = graph.Flows.Where(flow => flow != null && ids.Contains(flow.EntryNodeId)).ToArray(); + if (entryFlows.Length > 0 && !deleteEntryFlows) + { + error = "删除项包含 Flow 入口节点。"; + return false; + } + Undo.RecordObject(graph, "Delete Frame Animation Graph Elements"); + foreach (var edge in graph.Edges.Where(edge => edge != null && + (ids.Contains(edge.FromNodeId) || ids.Contains(edge.ToNodeId) || extraEdges.Contains(edge))).ToArray()) + { + graph.RemoveEdge(edge); + } + foreach (var flow in entryFlows) + { + graph.RemoveFlow(flow); + graph.EditorData.RemoveFlowData(flow.Id); + if (graph.Settings.DefaultPlayableId == flow.Id) + { + graph.Settings.SetDefaultPlayableId(string.Empty); + } + } + foreach (var node in items) + { + graph.RemoveNode(node); + graph.EditorData.RemoveNodeData(node.InternalId); + } + Dirty(graph); + return true; + } + + public static string MakeUniqueFlowId(FrameAnimationGraph graph, AnimationNode node) + { + var root = (string.IsNullOrWhiteSpace(node?.DisplayName) ? "Animation" : node.DisplayName) + "Flow"; + var candidate = root; + var suffix = 2; + while (!FrameAnimationAssetOperations.IsPlayableIdAvailable(graph, candidate)) + { + candidate = root + suffix++; + } + return candidate; + } + + public static bool CreateFlow( + FrameAnimationGraph graph, + AnimationNode entry, + string id, + string displayName, + out AnimationFlow flow, + out string error) + { + flow = null; + error = string.Empty; + if (graph == null || entry == null || !graph.Nodes.Contains(entry)) + { + error = "Flow 入口必须属于当前 Graph。"; + return false; + } + var owner = graph.Flows.FirstOrDefault(existing => existing != null && existing.EntryNodeId == entry.InternalId); + if (owner != null) + { + error = $"该节点已是 Flow '{owner.Id}' 的入口。"; + return false; + } + if (!FrameAnimationAssetOperations.IsPlayableIdAvailable(graph, id)) + { + error = "Flow id 为空或与 Clip / Flow 冲突。"; + return false; + } + Undo.RecordObject(graph, "Create Animation Flow"); + flow = new AnimationFlow(id, string.IsNullOrWhiteSpace(displayName) ? id : displayName, entry.InternalId); + graph.AddFlow(flow); + graph.EditorData.GetOrCreateFlowData(flow.Id, FlowColors[(graph.Flows.Count - 1) % FlowColors.Length]); + Dirty(graph); + return true; + } + + public static bool SetFlowEntry( + FrameAnimationGraph graph, + AnimationFlow flow, + AnimationNode entry, + out string error) + { + error = string.Empty; + if (graph == null || flow == null || entry == null || + !graph.Flows.Contains(flow) || !graph.Nodes.Contains(entry)) + { + error = "Flow 或入口节点不属于当前 Graph。"; + return false; + } + var owner = graph.Flows.FirstOrDefault(existing => existing != null && existing != flow && + existing.EntryNodeId == entry.InternalId); + if (owner != null) + { + error = $"该节点已是 Flow '{owner.Id}' 的入口。"; + return false; + } + Undo.RecordObject(graph, "Set Animation Flow Entry"); + flow.SetEntryNodeId(entry.InternalId); + Dirty(graph); + return true; + } + + public static void SetFlowColor(FrameAnimationGraph graph, AnimationFlow flow, Color value) + { + if (graph == null || flow == null) + { + return; + } + Undo.RecordObject(graph, "Set Animation Flow Color"); + graph.EditorData.GetOrCreateFlowData(flow.Id, value).SetColor(value); + Dirty(graph); + } + + public static bool EnsureEditorData(FrameAnimationGraph graph) + { + if (graph == null) + { + return false; + } + var missingNodes = graph.Nodes.Where(node => node != null && + graph.EditorData.NodeEditorData.All(data => data == null || data.NodeId != node.InternalId)).ToArray(); + var missingFlows = graph.Flows.Where(flow => flow != null && + graph.EditorData.FlowEditorData.All(data => data == null || data.FlowId != flow.Id)).ToArray(); + if (missingNodes.Length == 0 && missingFlows.Length == 0) + { + return false; + } + Undo.RecordObject(graph, "Initialize Frame Animation Graph Layout"); + for (var index = 0; index < missingNodes.Length; index++) + { + var position = new Vector2((index % 4) * 300f, (index / 4) * 180f); + graph.EditorData.GetOrCreateNodeData(missingNodes[index].InternalId, position); + } + for (var index = 0; index < missingFlows.Length; index++) + { + graph.EditorData.GetOrCreateFlowData(missingFlows[index].Id, + FlowColors[(graph.Flows.ToList().IndexOf(missingFlows[index]) + FlowColors.Length) % FlowColors.Length]); + } + Dirty(graph); + return true; + } + + public static Vector2 GetNodePosition(FrameAnimationGraph graph, AnimationNode node) + { + return graph?.EditorData.NodeEditorData.FirstOrDefault(data => + data != null && data.NodeId == node?.InternalId)?.Position ?? Vector2.zero; + } + + public static void SetNodePositions( + FrameAnimationGraph graph, + IReadOnlyDictionary positions, + string undoName) + { + if (graph == null || positions == null || positions.Count == 0) + { + return; + } + Undo.RecordObject(graph, undoName); + foreach (var pair in positions) + { + graph.EditorData.GetOrCreateNodeData(pair.Key.InternalId, pair.Value).SetPosition(pair.Value); + } + Dirty(graph); + } + + private static void Dirty(FrameAnimationGraph graph) + { + EditorUtility.SetDirty(graph); + } + } + + internal static class FrameAnimationGraphLayoutService + { + public static IReadOnlyDictionary Calculate( + FrameAnimationGraph graph, + IEnumerable scope) + { + var source = scope ?? (graph != null + ? graph.Nodes + : (IEnumerable)Array.Empty()); + var nodes = source.Where(node => node != null).Distinct() + .GroupBy(node => node.InternalId ?? string.Empty) + .Select(group => group.First()).ToArray(); + if (graph == null || nodes.Length == 0) + { + return new Dictionary(); + } + var ids = new HashSet(nodes.Select(node => node.InternalId)); + var edges = graph.Edges.Where(edge => edge != null && ids.Contains(edge.FromNodeId) && ids.Contains(edge.ToNodeId)).ToArray(); + var incoming = nodes.ToDictionary(node => node.InternalId, _ => 0); + foreach (var edge in edges) + { + incoming[edge.ToNodeId]++; + } + var ranks = nodes.ToDictionary(node => node.InternalId, _ => 0); + var queue = new Queue(nodes.Where(node => incoming[node.InternalId] == 0) + .OrderBy(node => node.InternalId, StringComparer.Ordinal)); + var processed = new HashSet(); + while (queue.Count > 0) + { + var node = queue.Dequeue(); + if (!processed.Add(node.InternalId)) continue; + foreach (var edge in edges.Where(edge => edge.FromNodeId == node.InternalId)) + { + ranks[edge.ToNodeId] = Math.Max(ranks[edge.ToNodeId], ranks[node.InternalId] + 1); + incoming[edge.ToNodeId]--; + if (incoming[edge.ToNodeId] == 0) + { + queue.Enqueue(nodes.First(item => item.InternalId == edge.ToNodeId)); + } + } + } + var oldPositions = nodes.ToDictionary(node => node, + node => FrameAnimationGraphMutationService.GetNodePosition(graph, node)); + var originX = oldPositions.Values.Min(position => position.x); + var originY = oldPositions.Values.Min(position => position.y); + var result = new Dictionary(); + foreach (var group in nodes.GroupBy(node => ranks[node.InternalId]).OrderBy(group => group.Key)) + { + var ordered = group.OrderBy(node => oldPositions[node].y) + .ThenBy(node => node.InternalId, StringComparer.Ordinal).ToArray(); + for (var index = 0; index < ordered.Length; index++) + { + result[ordered[index]] = new Vector2(originX + group.Key * 300f, originY + index * 180f); + } + } + return result; + } + } +} diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs.meta b/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs.meta new file mode 100644 index 000000000..1add36e3d --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b397ed96c5b44df89626f866c32e03dd diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs new file mode 100644 index 000000000..a9a4c99fe --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs @@ -0,0 +1,33 @@ +using UnityEditor; +using UnityEngine; + +namespace AibisDream.FrameAnimation.Editor +{ + [CustomEditor(typeof(FrameAnimationGraph))] + public sealed class FrameAnimationGraphEditor : UnityEditor.Editor + { + public override void OnInspectorGUI() + { + var graph = (FrameAnimationGraph)target; + EditorGUILayout.LabelField("FrameAnimationGraph", EditorStyles.boldLabel); + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.TextField("ID", graph.Id); + EditorGUILayout.TextField("Display Name", graph.DisplayName); + EditorGUILayout.IntField("Clips", graph.Clips.Count); + EditorGUILayout.IntField("Nodes", graph.Nodes.Count); + EditorGUILayout.IntField("Edges", graph.Edges.Count); + EditorGUILayout.IntField("Flows", graph.Flows.Count); + EditorGUILayout.IntField("Import Sources", graph.ImportSources.Count); + EditorGUILayout.TextField("Default Playable", graph.Settings?.DefaultPlayableId ?? string.Empty); + } + EditorGUILayout.HelpBox( + "Graph 的资源、来源、重命名和删除操作只能在主工作台中执行。", + MessageType.Info); + if (GUILayout.Button("Open Frame Animation Graph Editor")) + { + FrameAnimationGraphEditorWindow.Open(graph); + } + } + } +} diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs.meta b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs.meta new file mode 100644 index 000000000..13479ff4f --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 74f3b50c2650607499ea1c82a282f00f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs new file mode 100644 index 000000000..85e254869 --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs @@ -0,0 +1,1948 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.Callbacks; +using UnityEditor.UIElements; +using UnityEditorInternal; +using UnityEngine; +using UnityEngine.UIElements; + +namespace AibisDream.FrameAnimation.Editor +{ + public sealed class FrameAnimationGraphEditorWindow : EditorWindow + { + private enum ResourceTab { Clips, Flows, Sources } + private enum BottomTab { ImportDiff, Validation } + private enum ValidationKindFilter { All, Graph, Clip, Flow, Source, Node, Edge } + + private sealed class BrowserEntry + { + public bool IsHeader; + public string Label; + public FrameAnimationEditorSelection Selection; + } + + private const string LastGraphGuidKey = "AibisDream.FrameAnimation.Workspace.LastGraphGuid"; + + [SerializeField] private FrameAnimationGraph graph; + private ObjectField graphField; + private Label dirtyLabel; + private Label canvasLabel; + private FrameAnimationGraphView graphView; + private PopupField flowFocusField; + private string focusedFlowId = string.Empty; + private IReadOnlyList multiSelectedNodes = Array.Empty(); + private AnimationNode lastSelectedNode; + private Vector2 browserDragStart; + private bool browserDragPending; + private ListView resourceList; + private readonly List browserEntries = new List(); + private ToolbarSearchField searchField; + private EnumField filterField; + private EnumField sortField; + private IMGUIContainer propertyContainer; + private IMGUIContainer bottomContainer; + private VisualElement leftPanel; + private VisualElement rightPanel; + private VisualElement bottomPanel; + private ResourceTab resourceTab; + private BottomTab bottomTab; + private FrameAnimationClipFilter clipFilter; + private FrameAnimationClipSort clipSort; + private FrameAnimationEditorSelection selection; + private FrameAnimationImportPreview importPreview; + private IReadOnlyList validationIssues = Array.Empty(); + private bool bottomCollapsed; + private bool showErrors = true; + private bool showWarnings = true; + private bool showInfo = true; + private ValidationKindFilter validationKindFilter; + private double validateAt = -1d; + private SerializedObject clipSerializedObject; + private FrameClip frameListClip; + private ReorderableList frameList; + + [MenuItem("Window/Aibis Dream/Frame Animation Graph Editor")] + public static void ShowWindow() + { + var window = GetWindow(); + window.titleContent = new GUIContent("Frame Animation Graph"); + window.minSize = new Vector2(1050f, 650f); + if (window.graph == null) + { + window.RestoreLastGraph(); + } + window.Show(); + } + + public static void Open(FrameAnimationGraph targetGraph) + { + ShowWindow(); + var window = GetWindow(); + window.SetGraph(targetGraph); + window.Focus(); + } + + private void CreateGUI() + { + rootVisualElement.Clear(); + rootVisualElement.style.flexDirection = FlexDirection.Column; + BuildToolbar(); + BuildMainArea(); + BuildBottomArea(); + RestoreLastGraph(); + SetGraph(graph); + RestoreWorkspaceState(); + RestoreSelection(); + RefreshBrowser(); + RefreshFlowChoices(); + RefreshGraphView(); + } + + private void OnEnable() + { + Undo.undoRedoPerformed += OnProjectDataChanged; + EditorApplication.projectChanged += OnProjectDataChanged; + } + + private void OnDisable() + { + Undo.undoRedoPerformed -= OnProjectDataChanged; + EditorApplication.projectChanged -= OnProjectDataChanged; + SaveWorkspaceState(); + } + + private void Update() + { + if (validateAt > 0d && EditorApplication.timeSinceStartup >= validateAt) + { + validateAt = -1d; + validationIssues = FrameAnimationEditorValidationService.Validate(graph, false, out _); + bottomContainer?.MarkDirtyRepaint(); + RefreshBrowser(); + RefreshGraphView(); + } + UpdateDirtyLabel(); + } + + private void BuildToolbar() + { + var toolbar = new Toolbar(); + graphField = new ObjectField("Graph") + { + objectType = typeof(FrameAnimationGraph), + allowSceneObjects = false + }; + graphField.style.width = 330f; + graphField.RegisterValueChangedCallback(evt => SetGraph(evt.newValue as FrameAnimationGraph)); + toolbar.Add(graphField); + toolbar.Add(new ToolbarButton(CreateGraph) { text = "Create" }); + toolbar.Add(new ToolbarButton(SaveGraph) { text = "Save" }); + dirtyLabel = new Label(); + dirtyLabel.style.marginLeft = 6f; + toolbar.Add(dirtyLabel); + toolbar.Add(new ToolbarSpacer { style = { flexGrow = 1f } }); + toolbar.Add(new ToolbarButton(PreviewAllImports) { text = "Preview Imports" }); + toolbar.Add(new ToolbarButton(RefreshAllImports) { text = "Refresh All" }); + toolbar.Add(new ToolbarButton(ValidateFull) { text = "Validate" }); + rootVisualElement.Add(toolbar); + } + + private void BuildMainArea() + { + var main = new VisualElement + { + style = + { + flexDirection = FlexDirection.Row, + flexGrow = 1f, + overflow = Overflow.Hidden + } + }; + + leftPanel = BuildLeftPanel(); + main.Add(leftPanel); + main.Add(CreateVerticalResizer(leftPanel, 220f, 520f, "LeftWidth")); + + var canvas = new VisualElement + { + style = + { + flexGrow = 1f, + minWidth = 280f, + flexDirection = FlexDirection.Column, + backgroundColor = new StyleColor(new Color(0.13f, 0.13f, 0.13f)) + } + }; + var canvasToolbar = new Toolbar(); + canvasToolbar.Add(new ToolbarButton(ShowAllNodes) { text = "Show All" }); + flowFocusField = new PopupField(new List { "Show All" }, 0) + { + style = { minWidth = 170f } + }; + flowFocusField.RegisterValueChangedCallback(evt => + { + if (evt.newValue == "Show All") + { + SetFocusedFlow(string.Empty); + } + else + { + var flow = graph?.Flows.FirstOrDefault(item => item != null && + FlowChoiceLabel(item) == evt.newValue); + SetFocusedFlow(flow?.Id ?? string.Empty); + } + }); + canvasToolbar.Add(flowFocusField); + canvasToolbar.Add(new ToolbarButton(() => graphView?.FrameSelection()) { text = "Frame Selection" }); + canvasToolbar.Add(new ToolbarButton(() => graphView?.FrameCurrentFlow(focusedFlowId)) { text = "Frame Flow" }); + canvasToolbar.Add(new ToolbarButton(AutoLayoutCanvas) { text = "Auto Layout" }); + canvasToolbar.Add(new ToolbarButton(CreateFlowFromCanvasSelection) { text = "Create Flow" }); + canvas.Add(canvasToolbar); + graphView = new FrameAnimationGraphView(); + graphView.SelectionRequested += value => SetSelection(value, false); + graphView.MultiSelectionChanged += nodes => + { + multiSelectedNodes = nodes ?? Array.Empty(); + propertyContainer?.MarkDirtyRepaint(); + }; + graphView.CreateFlowRequested += ShowCreateFlow; + graphView.GraphChanged += OnCanvasGraphChanged; + graphView.NotificationRequested += message => ShowNotification(new GUIContent(message)); + canvas.Add(graphView); + canvasLabel = new Label("选择或创建 FrameAnimationGraph") + { + pickingMode = PickingMode.Ignore, + style = + { + position = Position.Absolute, + left = 20f, + right = 20f, + top = 80f, + unityTextAlign = TextAnchor.MiddleCenter, + whiteSpace = WhiteSpace.Normal, + fontSize = 13f + } + }; + canvas.Add(canvasLabel); + main.Add(canvas); + + rightPanel = new VisualElement + { + style = + { + width = 360f, + minWidth = 260f, + maxWidth = 650f, + flexShrink = 0f, + flexDirection = FlexDirection.Column + } + }; + rightPanel.Add(CreatePanelHeader("Properties")); + propertyContainer = new IMGUIContainer(DrawSelectionProperties) { style = { flexGrow = 1f } }; + rightPanel.Add(propertyContainer); + main.Add(CreateVerticalResizer(rightPanel, 260f, 650f, "RightWidth", resizeFromLeft: true)); + main.Add(rightPanel); + rootVisualElement.Add(main); + } + + private VisualElement BuildLeftPanel() + { + var panel = new VisualElement + { + style = + { + width = 330f, + minWidth = 220f, + maxWidth = 520f, + flexShrink = 0f, + flexDirection = FlexDirection.Column + } + }; + var tabs = new Toolbar(); + tabs.Add(new ToolbarButton(() => SetResourceTab(ResourceTab.Clips)) { text = "Clips" }); + tabs.Add(new ToolbarButton(() => SetResourceTab(ResourceTab.Flows)) { text = "Flows" }); + tabs.Add(new ToolbarButton(() => SetResourceTab(ResourceTab.Sources)) { text = "Sources" }); + panel.Add(tabs); + searchField = new ToolbarSearchField(); + searchField.RegisterValueChangedCallback(_ => + { + SaveWorkspaceState(); + RefreshBrowser(); + }); + panel.Add(searchField); + var controls = new VisualElement { style = { flexDirection = FlexDirection.Row } }; + filterField = new EnumField(FrameAnimationClipFilter.All) { style = { flexGrow = 1f } }; + filterField.RegisterValueChangedCallback(evt => + { + clipFilter = (FrameAnimationClipFilter)evt.newValue; + SaveWorkspaceState(); + RefreshBrowser(); + }); + sortField = new EnumField(FrameAnimationClipSort.Name) { style = { flexGrow = 1f } }; + sortField.RegisterValueChangedCallback(evt => + { + clipSort = (FrameAnimationClipSort)evt.newValue; + SaveWorkspaceState(); + RefreshBrowser(); + }); + controls.Add(filterField); + controls.Add(sortField); + panel.Add(controls); + + resourceList = new ListView(browserEntries, 38f, MakeBrowserItem, BindBrowserItem) + { + selectionType = SelectionType.Single, + style = { flexGrow = 1f } + }; + resourceList.selectionChanged += OnBrowserSelectionChanged; + resourceList.itemsChosen += chosen => + { + var entry = chosen.Cast().FirstOrDefault(item => !item.IsHeader); + if (entry != null) + { + SetSelection(entry.Selection); + } + }; + panel.Add(resourceList); + + var actions = new VisualElement { style = { flexDirection = FlexDirection.Row } }; + actions.Add(new Button(CreateManualClip) { text = "New Manual" }); + actions.Add(new Button(AddExistingClip) { text = "Add Existing" }); + actions.Add(new Button(AddSource) { text = "Add Source" }); + panel.Add(actions); + return panel; + } + + private void BuildBottomArea() + { + bottomPanel = new VisualElement + { + style = + { + height = 230f, + minHeight = 28f, + maxHeight = 520f, + flexShrink = 0f, + borderTopWidth = 1f, + borderTopColor = new StyleColor(Color.black) + } + }; + var toolbar = new Toolbar(); + toolbar.Add(new ToolbarButton(() => SetBottomTab(BottomTab.ImportDiff)) { text = "Import Diff" }); + toolbar.Add(new ToolbarButton(() => SetBottomTab(BottomTab.Validation)) { text = "Validation" }); + toolbar.Add(new ToolbarSpacer { style = { flexGrow = 1f } }); + toolbar.Add(new ToolbarButton(ToggleBottom) { text = "Collapse / Expand" }); + bottomPanel.Add(toolbar); + bottomContainer = new IMGUIContainer(DrawBottomPanel) { style = { flexGrow = 1f } }; + bottomPanel.Add(bottomContainer); + var resizer = CreateHorizontalResizer(bottomPanel, 120f, 520f, "BottomHeight"); + rootVisualElement.Add(resizer); + rootVisualElement.Add(bottomPanel); + } + + private static VisualElement CreatePanelHeader(string text) + { + return new Label(text) + { + style = + { + unityFontStyleAndWeight = FontStyle.Bold, + paddingLeft = 8f, + paddingTop = 7f, + paddingBottom = 7f, + borderBottomWidth = 1f, + borderBottomColor = new StyleColor(Color.black) + } + }; + } + + private VisualElement MakeBrowserItem() + { + var label = new Label + { + style = + { + whiteSpace = WhiteSpace.Normal, + paddingLeft = 6f, + paddingTop = 3f, + paddingBottom = 3f + } + }; + label.RegisterCallback(evt => + { + if (evt.button == 0 && label.userData is BrowserEntry entry && + entry.Selection.Kind == FrameAnimationEditorSelectionKind.Clip && !entry.IsHeader) + { + browserDragPending = true; + browserDragStart = evt.position; + } + }); + label.RegisterCallback(evt => + { + if (!browserDragPending || Vector2.Distance(browserDragStart, evt.position) < 5f || + !(label.userData is BrowserEntry entry) || !(entry.Selection.Value is FrameClip clip)) + { + return; + } + browserDragPending = false; + DragAndDrop.PrepareStartDrag(); + DragAndDrop.SetGenericData(FrameAnimationGraphView.ClipDragKey, clip); + DragAndDrop.objectReferences = new UnityEngine.Object[] { clip }; + DragAndDrop.StartDrag($"Create Node: {clip.Id}"); + }); + label.RegisterCallback(_ => browserDragPending = false); + return label; + } + + private void BindBrowserItem(VisualElement element, int index) + { + var label = (Label)element; + if (index < 0 || index >= browserEntries.Count) + { + label.text = string.Empty; + return; + } + var entry = browserEntries[index]; + label.userData = entry; + label.text = entry.Label; + label.style.unityFontStyleAndWeight = entry.IsHeader ? FontStyle.Bold : FontStyle.Normal; + label.style.color = entry.IsHeader ? new Color(0.7f, 0.8f, 1f) : Color.white; + } + + private void OnBrowserSelectionChanged(IEnumerable values) + { + var entry = values.Cast().FirstOrDefault(); + if (entry != null && !entry.IsHeader) + { + SetSelection(entry.Selection); + } + } + + private void SetGraph(FrameAnimationGraph value) + { + if (graph == value && graphField != null) + { + graphField.SetValueWithoutNotify(graph); + } + else + { + SaveGraph(); + SaveWorkspaceState(); + graph = value; + selection = graph != null + ? new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Graph, graph) + : default; + importPreview = null; + validationIssues = Array.Empty(); + multiSelectedNodes = Array.Empty(); + lastSelectedNode = null; + frameListClip = null; + frameList = null; + clipSerializedObject = null; + RestoreWorkspaceState(); + RestoreSelection(); + if (graph != null && FrameAnimationGraphMutationService.EnsureEditorData(graph)) + { + ShowNotification(new GUIContent("已初始化缺失的节点布局数据,可使用 Undo 撤销。")); + } + } + + graphField?.SetValueWithoutNotify(graph); + if (graph != null) + { + var path = AssetDatabase.GetAssetPath(graph); + EditorPrefs.SetString(LastGraphGuidKey, AssetDatabase.AssetPathToGUID(path)); + } + RefreshBrowser(); + RefreshFlowChoices(); + RefreshGraphView(); + RefreshCanvasSummary(); + propertyContainer?.MarkDirtyRepaint(); + bottomContainer?.MarkDirtyRepaint(); + } + + private void RestoreLastGraph() + { + if (graph != null) + { + return; + } + var guid = EditorPrefs.GetString(LastGraphGuidKey, string.Empty); + if (!string.IsNullOrEmpty(guid)) + { + graph = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(guid)); + } + } + + private void SetResourceTab(ResourceTab tab) + { + resourceTab = tab; + SaveWorkspaceState(); + RefreshBrowser(); + } + + private void SetBottomTab(BottomTab tab) + { + bottomTab = tab; + bottomCollapsed = false; + ApplyBottomState(); + SaveWorkspaceState(); + } + + private void SetSelection(FrameAnimationEditorSelection value, bool locateOnCanvas = true) + { + selection = value; + if (value.Kind == FrameAnimationEditorSelectionKind.Node && value.Value is AnimationNode node) + { + lastSelectedNode = node; + } + if (value.Kind == FrameAnimationEditorSelectionKind.Flow && value.Value is AnimationFlow flow) + { + SetFocusedFlow(flow.Id); + } + frameListClip = null; + frameList = null; + clipSerializedObject = null; + propertyContainer?.MarkDirtyRepaint(); + RefreshCanvasSummary(); + SaveWorkspaceState(); + if (locateOnCanvas && (value.Kind == FrameAnimationEditorSelectionKind.Node || + value.Kind == FrameAnimationEditorSelectionKind.Edge)) + { + if (!SelectionBelongsToFocusedFlow(value)) + { + SetFocusedFlow(string.Empty); + } + graphView?.SelectAndFrame(value); + } + } + + private void RefreshBrowser() + { + if (resourceList == null) + { + return; + } + browserEntries.Clear(); + if (graph != null) + { + switch (resourceTab) + { + case ResourceTab.Clips: + BuildClipEntries(); + break; + case ResourceTab.Flows: + BuildFlowEntries(); + break; + case ResourceTab.Sources: + BuildSourceEntries(); + break; + } + } + filterField.style.display = resourceTab == ResourceTab.Clips ? DisplayStyle.Flex : DisplayStyle.None; + sortField.style.display = resourceTab == ResourceTab.Clips ? DisplayStyle.Flex : DisplayStyle.None; + resourceList.Rebuild(); + } + + private void BuildClipEntries() + { + var clips = FrameAnimationResourceQuery.QueryClips( + graph, searchField?.value, clipFilter, clipSort); + var grouped = string.IsNullOrWhiteSpace(searchField?.value) && clipSort == FrameAnimationClipSort.Source; + if (!grouped) + { + foreach (var clip in clips) + { + AddClipEntry(clip); + } + return; + } + + var sources = graph.ImportSources.Where(source => source != null) + .GroupBy(source => source.InternalId ?? string.Empty) + .ToDictionary(group => group.Key, group => group.First().DisplayName); + foreach (var group in clips.GroupBy(clip => FrameAnimationResourceQuery.SourceName(clip, sources))) + { + browserEntries.Add(new BrowserEntry { IsHeader = true, Label = group.Key }); + foreach (var clip in group) + { + AddClipEntry(clip); + } + } + } + + private void AddClipEntry(FrameClip clip) + { + var source = clip.IsImported + ? FrameAnimationResourceQuery.SourceName(clip, + graph.ImportSources.Where(item => item != null) + .GroupBy(item => item.InternalId ?? string.Empty) + .ToDictionary(group => group.Key, group => group.First().DisplayName)) + "/" + + clip.ImportInfo.SourceTagName + : "Manual"; + var missing = clip.IsImported && clip.ImportInfo.IsMissingFromSource ? " [MISSING]" : string.Empty; + var refs = FrameAnimationResourceQuery.ReferenceCount(graph, clip); + browserEntries.Add(new BrowserEntry + { + Label = $"{clip.DisplayName} ({clip.Id}){missing}{IssueMarker(FrameAnimationEditorSelectionKind.Clip, clip)}\n" + + $"{clip.FrameCount} frames {clip.TotalDurationMs} ms {source} refs:{refs}", + Selection = new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Clip, clip) + }); + } + + private void BuildFlowEntries() + { + var search = searchField?.value; + foreach (var flow in graph.Flows.Where(flow => flow != null && + (string.IsNullOrWhiteSpace(search) || Contains(flow.Id, search) || Contains(flow.DisplayName, search))) + .OrderBy(flow => flow.DisplayName, StringComparer.Ordinal).ThenBy(flow => flow.Id, StringComparer.Ordinal)) + { + browserEntries.Add(new BrowserEntry + { + Label = $"{flow.DisplayName} ({flow.Id}){IssueMarker(FrameAnimationEditorSelectionKind.Flow, flow)}\nentry: {flow.EntryNodeId}", + Selection = new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Flow, flow) + }); + } + } + + private void BuildSourceEntries() + { + var search = searchField?.value; + foreach (var source in graph.ImportSources.Where(source => source != null && + (string.IsNullOrWhiteSpace(search) || Contains(source.DisplayName, search) || Contains(source.InternalId, search))) + .OrderBy(source => source.DisplayName, StringComparer.Ordinal) + .ThenBy(source => source.InternalId, StringComparer.Ordinal)) + { + var count = graph.Clips.Count(clip => clip != null && clip.ImportInfo?.ImportSourceId == source.InternalId); + browserEntries.Add(new BrowserEntry + { + Label = $"{source.DisplayName}{IssueMarker(FrameAnimationEditorSelectionKind.Source, source)}\n" + + $"clips:{count} {(source.IsEnabled ? "Enabled" : "Disabled")} {(source.ManageSpriteSlicing ? "Writable" : "ReadOnly")}", + Selection = new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Source, source) + }); + } + } + + private static bool Contains(string value, string search) => + !string.IsNullOrEmpty(value) && value.IndexOf(search, StringComparison.OrdinalIgnoreCase) >= 0; + + private void RefreshGraphView() + { + graphView?.Bind(graph, validationIssues, focusedFlowId); + } + + private void OnCanvasGraphChanged() + { + ScheduleLightValidation(); + RefreshBrowser(); + RefreshFlowChoices(); + RefreshCanvasSummary(); + propertyContainer?.MarkDirtyRepaint(); + EditorApplication.delayCall += () => + { + if (this != null) + { + RefreshGraphView(); + } + }; + } + + private static string FlowChoiceLabel(AnimationFlow flow) => $"{flow.DisplayName} ({flow.Id})"; + + private void RefreshFlowChoices() + { + if (flowFocusField == null) + { + return; + } + var choices = new List { "Show All" }; + if (graph != null) + { + choices.AddRange(graph.Flows.Where(flow => flow != null) + .OrderBy(flow => flow.DisplayName, StringComparer.Ordinal) + .ThenBy(flow => flow.Id, StringComparer.Ordinal) + .Select(FlowChoiceLabel)); + } + flowFocusField.choices = choices; + var focused = graph?.Flows.FirstOrDefault(flow => flow != null && flow.Id == focusedFlowId); + flowFocusField.SetValueWithoutNotify(focused != null ? FlowChoiceLabel(focused) : "Show All"); + } + + private void SetFocusedFlow(string flowId) + { + focusedFlowId = graph?.Flows.Any(flow => flow != null && flow.Id == flowId) == true + ? flowId + : string.Empty; + RefreshFlowChoices(); + graphView?.SetFocusedFlow(focusedFlowId); + SaveWorkspaceState(); + } + + private void ShowAllNodes() + { + SetFocusedFlow(string.Empty); + graphView?.FrameAll(); + } + + private bool SelectionBelongsToFocusedFlow(FrameAnimationEditorSelection value) + { + if (graph == null || string.IsNullOrEmpty(focusedFlowId)) + { + return true; + } + var flow = graph.Flows.FirstOrDefault(item => item != null && item.Id == focusedFlowId); + if (flow == null) + { + return false; + } + var reachable = new FrameAnimationGraphTopology(graph).GetReachable(flow.EntryNodeId); + return value.Value switch + { + AnimationNode node => reachable.Nodes.Contains(node), + AnimationEdge edge => reachable.Edges.Contains(edge), + _ => true + }; + } + + private void CreateFlowFromCanvasSelection() + { + var nodes = graphView?.SelectedNodes ?? Array.Empty(); + if (nodes.Count != 1) + { + ShowNotification(new GUIContent("创建 Flow 必须且只能选中一个节点。")); + return; + } + ShowCreateFlow(nodes[0]); + } + + private void ShowCreateFlow(AnimationNode entry) + { + if (graph == null || entry == null || !graph.Nodes.Contains(entry)) + { + ShowNotification(new GUIContent("Flow 入口节点已失效。")); + return; + } + FrameAnimationFlowWindow.Show(graph, entry, flow => + { + SetFocusedFlow(flow.Id); + SetSelection(new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Flow, flow), false); + OnCanvasGraphChanged(); + }); + } + + private void AutoLayoutCanvas() + { + if (graph == null) + { + return; + } + IReadOnlyList scope; + var selected = graphView?.SelectedNodes ?? Array.Empty(); + if (selected.Count >= 2) + { + scope = selected; + } + else if (!string.IsNullOrEmpty(focusedFlowId)) + { + var flow = graph.Flows.FirstOrDefault(item => item != null && item.Id == focusedFlowId); + scope = flow != null + ? new FrameAnimationGraphTopology(graph).GetReachable(flow.EntryNodeId).Nodes + : Array.Empty(); + } + else + { + scope = graph.Nodes.Where(node => node != null).ToArray(); + } + var positions = FrameAnimationGraphLayoutService.Calculate(graph, scope); + FrameAnimationGraphMutationService.SetNodePositions(graph, positions, "Auto Layout Frame Animation Graph"); + graphView?.ApplyCalculatedPositions(positions); + ScheduleLightValidation(); + } + + private string IssueMarker(FrameAnimationEditorSelectionKind kind, object value) + { + var matching = validationIssues.Where(issue => + issue.Selection.Kind == kind && ReferenceEquals(issue.Selection.Value, value)).ToArray(); + if (matching.Any(issue => issue.Severity == FrameAnimationValidationSeverity.Error)) + { + return " [E]"; + } + return matching.Length > 0 ? " [W]" : string.Empty; + } + + private void RefreshCanvasSummary() + { + if (canvasLabel == null) + { + return; + } + if (graph == null) + { + canvasLabel.text = "选择或创建 FrameAnimationGraph"; + canvasLabel.style.display = DisplayStyle.Flex; + return; + } + canvasLabel.style.display = graph.Nodes.Count == 0 ? DisplayStyle.Flex : DisplayStyle.None; + var located = selection.Kind == FrameAnimationEditorSelectionKind.None + ? "Graph" + : selection.Kind + ": " + SelectionName(selection); + canvasLabel.text = + $"右键或从 Clips 拖入以创建节点\n\n{graph.DisplayName} ({graph.Id})\n" + + $"Clips {graph.Clips.Count} Nodes {graph.Nodes.Count} Edges {graph.Edges.Count} Flows {graph.Flows.Count}\n\n" + + $"当前定位:{located}"; + } + + private static string SelectionName(FrameAnimationEditorSelection selected) + { + return selected.Value switch + { + FrameClip clip => clip.Id, + AnimationFlow flow => flow.Id, + FrameAnimationImportSource source => source.DisplayName, + AnimationNode node => node.InternalId, + AnimationEdge edge => edge.InternalId, + FrameAnimationGraph selectedGraph => selectedGraph.Id, + _ => string.Empty + }; + } + + private void DrawSelectionProperties() + { + if (graph == null) + { + EditorGUILayout.HelpBox("请选择 FrameAnimationGraph。", MessageType.Info); + return; + } + + if (multiSelectedNodes.Count > 1) + { + EditorGUILayout.LabelField("Multiple Nodes", EditorStyles.boldLabel); + EditorGUILayout.LabelField("Selected", multiSelectedNodes.Count.ToString()); + EditorGUILayout.HelpBox("第四阶段不提供批量属性编辑。可以对选中节点执行自动布局或安全删除。", MessageType.Info); + if (GUILayout.Button("Auto Layout Selected Nodes")) + { + var positions = FrameAnimationGraphLayoutService.Calculate(graph, multiSelectedNodes); + FrameAnimationGraphMutationService.SetNodePositions( + graph, positions, "Auto Layout Selected Frame Animation Nodes"); + graphView?.ApplyCalculatedPositions(positions); + } + if (GUILayout.Button("Delete Selected Nodes")) + { + graphView?.RequestDeleteNodes(multiSelectedNodes); + } + return; + } + + EditorGUI.BeginChangeCheck(); + switch (selection.Kind) + { + case FrameAnimationEditorSelectionKind.Clip: + DrawClipProperties(selection.Value as FrameClip); + break; + case FrameAnimationEditorSelectionKind.Flow: + DrawFlowProperties(selection.Value as AnimationFlow); + break; + case FrameAnimationEditorSelectionKind.Source: + DrawSourceProperties(selection.Value as FrameAnimationImportSource); + break; + case FrameAnimationEditorSelectionKind.Node: + DrawNodeProperties(selection.Value as AnimationNode); + break; + case FrameAnimationEditorSelectionKind.Edge: + DrawEdgeProperties(selection.Value as AnimationEdge); + break; + default: + DrawGraphProperties(); + break; + } + if (EditorGUI.EndChangeCheck()) + { + ScheduleLightValidation(); + RefreshBrowser(); + RefreshCanvasSummary(); + } + } + + private void DrawGraphProperties() + { + var serialized = new SerializedObject(graph); + serialized.Update(); + EditorGUILayout.LabelField("Graph", EditorStyles.boldLabel); + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.PropertyField(serialized.FindProperty("id")); + } + EditorGUILayout.PropertyField(serialized.FindProperty("displayName")); + EditorGUILayout.LabelField("Clips", graph.Clips.Count.ToString()); + EditorGUILayout.LabelField("Flows", graph.Flows.Count.ToString()); + EditorGUILayout.LabelField("Sources", graph.ImportSources.Count.ToString()); + DrawDefaultPlayablePopup(); + var currentEndBehavior = graph.Settings.NewManualClipDefaultEndBehavior; + var nextEndBehavior = (FrameClipEndBehavior)EditorGUILayout.EnumPopup( + "New Manual End Behavior", currentEndBehavior); + if (nextEndBehavior != currentEndBehavior) + { + Undo.RecordObject(graph, "Set New Manual Clip End Behavior"); + graph.Settings.SetNewManualClipDefaultEndBehavior(nextEndBehavior); + EditorUtility.SetDirty(graph); + } + if (serialized.ApplyModifiedProperties()) + { + EditorUtility.SetDirty(graph); + } + if (GUILayout.Button("Rename Graph ID")) + { + ShowRenameGraph(); + } + } + + private void DrawDefaultPlayablePopup() + { + var ids = new List { string.Empty }; + ids.AddRange(graph.Clips.Where(clip => clip != null).Select(clip => clip.Id)); + ids.AddRange(graph.Flows.Where(flow => flow != null).Select(flow => flow.Id)); + var labels = ids.Select(id => string.IsNullOrEmpty(id) ? "" : id).ToArray(); + var current = Mathf.Max(0, ids.IndexOf(graph.Settings.DefaultPlayableId)); + var next = EditorGUILayout.Popup("Default Playable", current, labels); + if (next != current) + { + Undo.RecordObject(graph, "Set Default Frame Animation Playable"); + graph.Settings.SetDefaultPlayableId(ids[next]); + EditorUtility.SetDirty(graph); + } + } + + private void DrawClipProperties(FrameClip clip) + { + if (clip == null) + { + EditorGUILayout.HelpBox("Clip 已失效。", MessageType.Warning); + return; + } + EnsureFrameList(clip); + clipSerializedObject.Update(); + EditorGUILayout.LabelField(clip.IsImported ? "Imported Clip" : "Manual Clip", EditorStyles.boldLabel); + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.PropertyField(clipSerializedObject.FindProperty("id")); + } + EditorGUILayout.PropertyField(clipSerializedObject.FindProperty("displayName")); + EditorGUILayout.PropertyField(clipSerializedObject.FindProperty("speed")); + EditorGUILayout.PropertyField(clipSerializedObject.FindProperty("defaultEndBehavior")); + EditorGUILayout.LabelField("Frame Count", clip.FrameCount.ToString()); + EditorGUILayout.LabelField("Total Duration", clip.TotalDurationMs + " ms"); + EditorGUILayout.LabelField("Storage", AssetDatabase.IsSubAsset(clip) ? "Graph sub-asset" : "External .asset"); + var owners = FrameAnimationAssetReferenceIndex.FindGraphsReferencing(clip); + if (!AssetDatabase.IsSubAsset(clip) && owners.Count > 1) + { + EditorGUILayout.HelpBox("共享外部 Manual Clip:" + string.Join(", ", owners.Select(owner => owner.name)), MessageType.Warning); + } + if (clip.IsImported) + { + EditorGUILayout.LabelField("Source Tag", clip.ImportInfo.SourceTagName); + EditorGUILayout.LabelField("Missing", clip.ImportInfo.IsMissingFromSource ? "Yes" : "No"); + } + if (clipSerializedObject.ApplyModifiedProperties()) + { + EditorUtility.SetDirty(clip); + } + + if (!clip.IsImported) + { + frameList.DoLayoutList(); + if (frameList.index >= 0 && GUILayout.Button("Duplicate Selected Frame")) + { + DuplicateFrame(clipSerializedObject.FindProperty("frames"), frameList.index); + clipSerializedObject.ApplyModifiedProperties(); + EditorUtility.SetDirty(clip); + } + } + if (clip.IsImported) + { + using (new EditorGUI.DisabledScope(true)) + { + frameList.DoLayoutList(); + } + if (GUILayout.Button("Locate ImportSource")) + { + var source = graph.ImportSources.FirstOrDefault(item => item != null && item.InternalId == clip.ImportInfo.ImportSourceId); + SetSelection(new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Source, source)); + SetResourceTab(ResourceTab.Sources); + } + if (GUILayout.Button("Copy As Manual Clip")) + { + FrameAnimationManualClipWindow.Show(graph, clip, copied => + { + RefreshBrowser(); + SetSelection(new FrameAnimationEditorSelection(FrameAnimationEditorSelectionKind.Clip, copied)); + }); + } + } + + if (GUILayout.Button("Rename Clip ID")) + { + ShowRenameClip(clip); + } + if (GUILayout.Button("Locate Node References")) + { + LocateClipReferences(clip); + } + if (GUILayout.Button(AssetDatabase.IsSubAsset(clip) ? "Delete Clip Sub-Asset" : "Remove Clip Reference")) + { + ConfirmRemoveClip(clip); + } + } + + private void EnsureFrameList(FrameClip clip) + { + if (frameListClip == clip && frameList != null) + { + return; + } + frameListClip = clip; + clipSerializedObject = new SerializedObject(clip); + var frames = clipSerializedObject.FindProperty("frames"); + frameList = new ReorderableList(clipSerializedObject, frames, !clip.IsImported, true, !clip.IsImported, !clip.IsImported) + { + elementHeight = 72f, + drawHeaderCallback = rect => EditorGUI.LabelField(rect, "Frames (frameName/sourceIndex are read-only)"), + drawElementCallback = (rect, index, active, focused) => DrawFrameElement(frames, rect, index), + onAddCallback = list => AddFrame(frames), + onRemoveCallback = list => + { + ReorderableList.defaultBehaviours.DoRemoveButton(list); + clipSerializedObject.ApplyModifiedProperties(); + EditorUtility.SetDirty(clip); + }, + onReorderCallback = _ => + { + clipSerializedObject.ApplyModifiedProperties(); + EditorUtility.SetDirty(clip); + } + }; + } + + private static void DrawFrameElement(SerializedProperty frames, Rect rect, int index) + { + if (index < 0 || index >= frames.arraySize) + { + return; + } + var element = frames.GetArrayElementAtIndex(index); + rect.y += 2f; + var line = EditorGUIUtility.singleLineHeight; + EditorGUI.PropertyField(new Rect(rect.x, rect.y, rect.width, line), element.FindPropertyRelative("sprite"), new GUIContent($"#{index} Sprite")); + EditorGUI.PropertyField(new Rect(rect.x, rect.y + line + 2f, rect.width, line), element.FindPropertyRelative("durationMs")); + using (new EditorGUI.DisabledScope(true)) + { + var half = (rect.width - 4f) * 0.5f; + EditorGUI.PropertyField(new Rect(rect.x, rect.y + (line + 2f) * 2f, half, line), element.FindPropertyRelative("frameName")); + EditorGUI.PropertyField(new Rect(rect.x + half + 4f, rect.y + (line + 2f) * 2f, half, line), element.FindPropertyRelative("sourceIndex")); + } + } + + private void AddFrame(SerializedProperty frames) + { + var index = frames.arraySize; + frames.InsertArrayElementAtIndex(index); + var element = frames.GetArrayElementAtIndex(index); + element.FindPropertyRelative("sprite").objectReferenceValue = null; + element.FindPropertyRelative("durationMs").intValue = 100; + element.FindPropertyRelative("frameName").stringValue = string.Empty; + element.FindPropertyRelative("sourceIndex").intValue = -1; + clipSerializedObject.ApplyModifiedProperties(); + frameList.index = index; + EditorUtility.SetDirty(frameListClip); + } + + private static void DuplicateFrame(SerializedProperty frames, int index) + { + if (index >= 0 && index < frames.arraySize) + { + frames.InsertArrayElementAtIndex(index); + } + } + + private void DrawFlowProperties(AnimationFlow flow) + { + var index = graph.Flows.ToList().IndexOf(flow); + if (index < 0) + { + EditorGUILayout.HelpBox("Flow 已失效。", MessageType.Warning); + return; + } + var serialized = new SerializedObject(graph); + serialized.Update(); + var property = serialized.FindProperty("flows").GetArrayElementAtIndex(index); + EditorGUILayout.LabelField("Animation Flow", EditorStyles.boldLabel); + using (new EditorGUI.DisabledScope(true)) + { + EditorGUILayout.PropertyField(property.FindPropertyRelative("id")); + EditorGUILayout.PropertyField(property.FindPropertyRelative("entryNodeId")); + } + EditorGUILayout.PropertyField(property.FindPropertyRelative("displayName")); + EditorGUILayout.PropertyField(property.FindPropertyRelative("hasEndBehaviorOverride")); + if (property.FindPropertyRelative("hasEndBehaviorOverride").boolValue) + { + EditorGUILayout.PropertyField(property.FindPropertyRelative("endBehaviorOverride")); + } + if (serialized.ApplyModifiedProperties()) + { + EditorUtility.SetDirty(graph); + } + var flowData = graph.EditorData.FlowEditorData.FirstOrDefault(data => data != null && data.FlowId == flow.Id); + var color = flowData?.Color ?? Color.white; + var nextColor = EditorGUILayout.ColorField("Canvas Color", color); + if (nextColor != color) + { + FrameAnimationGraphMutationService.SetFlowColor(graph, flow, nextColor); + RefreshGraphView(); + } + EditorGUILayout.LabelField("Entry Candidate", + lastSelectedNode != null && graph.Nodes.Contains(lastSelectedNode) + ? $"{lastSelectedNode.DisplayName} ({lastSelectedNode.InternalId})" + : " + + + + + + + + +
+ 节点预览 + +
+ + Graph 已载入 + + + +
+
+ + +
+ +
+
+ Peipei_FrameAnimationGraph / Global Graph + + + + 100% +
+
+
+ +
+
+
中键/空白拖动平移 · 滚轮缩放 · 拖动节点调整位置
+
+
+ +
+ + +
+ +
+
+ + + + 1 Error · 2 Warning · 1 Info + +
+
+
+
+ + +
+ + + +
+
+

建议演示路线

用 3–5 分钟向策划和美术说明完整工作流。
+
+
+
1
集中浏览资源
切换 Clips / Flows / Sources,查看导入来源、时长和引用状态。
+
2
聚焦与播放 Flow
选择 WakeUpToIdle,展示共享 Idle 节点与图上直接预览。
+
3
独立检查 Clip
选择 Blink,逐帧、拖动时间轴并调整预览速度。
+
4
刷新与定位问题
模拟来源刷新,再从 Validation 点击定位 Missing 和旋转帧问题。
+
+
+
+
+
+ + + + From 53a4fc86c44ee56423ee65bc7c2348cc153ce645 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Wed, 15 Jul 2026 15:14:55 +0800 Subject: [PATCH 14/47] =?UTF-8?q?feat:=20=E8=AE=BE=E7=BD=AE=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=EF=BC=8C=E6=96=B9=E4=BE=BF=E8=B7=91=E5=8D=95=E5=85=83?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ProjectSettings/ProjectSettings.asset | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index b7cba66fd..ff83c82a6 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -77,7 +77,7 @@ PlayerSettings: androidFullscreenMode: 1 defaultIsNativeResolution: 1 macRetinaSupport: 1 - runInBackground: 0 + runInBackground: 1 captureSingleScreen: 1 muteOtherAudioSources: 0 Prepare IOS For Recording: 0 From 69315f86f99cde15e0f81338b6a0ada3afe08c16 Mon Sep 17 00:00:00 2001 From: Ovid Date: Wed, 15 Jul 2026 22:06:02 +0800 Subject: [PATCH 15/47] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=9E=AF=E6=A0=91?= =?UTF-8?q?=E5=A4=A7=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RawResources/Art/梦境素材/梦境图片/D2S枯树-Large.png.meta | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/RawResources/Art/梦境素材/梦境图片/D2S枯树-Large.png.meta b/Assets/RawResources/Art/梦境素材/梦境图片/D2S枯树-Large.png.meta index a23518f36..4d674ccf9 100644 --- a/Assets/RawResources/Art/梦境素材/梦境图片/D2S枯树-Large.png.meta +++ b/Assets/RawResources/Art/梦境素材/梦境图片/D2S枯树-Large.png.meta @@ -48,7 +48,7 @@ TextureImporter: spriteMeshType: 1 alignment: 0 spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 40 + spritePixelsToUnits: 21.5 spriteBorder: {x: 0, y: 0, z: 0, w: 0} spriteGenerateFallbackPhysicsShape: 1 alphaUsage: 1 From 60200afe9bc5d6b1d597ac3887d330cf4f05fc2c Mon Sep 17 00:00:00 2001 From: Ovid Date: Thu, 16 Jul 2026 02:15:57 +0800 Subject: [PATCH 16/47] =?UTF-8?q?debug=EF=BC=9A=E4=BA=91=E7=9A=84=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=90=8D=E5=BC=95=E7=94=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Yarn/FP/FP_Day2_sleep/FP_Day2_sleep.yarn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Assets/Yarn/FP/FP_Day2_sleep/FP_Day2_sleep.yarn b/Assets/Yarn/FP/FP_Day2_sleep/FP_Day2_sleep.yarn index adf54fc58..0507c4c84 100644 --- a/Assets/Yarn/FP/FP_Day2_sleep/FP_Day2_sleep.yarn +++ b/Assets/Yarn/FP/FP_Day2_sleep/FP_Day2_sleep.yarn @@ -745,10 +745,10 @@ girl: 但是你连我——也不要了吗——! <> 轻飘飘地... #line:0a6d6a5 -<> +<> <> -<> +<> <> girl: 不管发生了什么——! <> From 46602803dcfeb62763d14acb0d6e6cdf62c605a7 Mon Sep 17 00:00:00 2001 From: Ding Yuntian <1491671119@qq.com> Date: Thu, 16 Jul 2026 18:49:12 +0800 Subject: [PATCH 17/47] =?UTF-8?q?feat:=20=E5=8A=A8=E7=94=BB=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E7=AC=AC=E4=BA=94=E9=98=B6=E6=AE=B5=EF=BC=88=E6=9C=AA?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FrameAnimationGraphAuthoringServices.cs | 64 ++ .../FrameAnimationGraphEditor.uss | 72 ++ .../FrameAnimationGraphEditor.uss.meta | 9 + .../FrameAnimationGraphEditorWindow.cs | 616 ++++++++++++++++-- .../FrameAnimation/FrameAnimationGraphView.cs | 144 +++- .../FrameAnimation/FrameAnimationPreview.cs | 593 +++++++++++++++++ .../FrameAnimationPreview.cs.meta | 2 + .../FrameAnimationPreviewElement.cs | 163 +++++ .../FrameAnimationPreviewElement.cs.meta | 2 + .../FrameAnimationPreviewSampleBuilder.cs | 142 ++++ ...FrameAnimationPreviewSampleBuilder.cs.meta | 2 + .../Import/FrameAnimationGraph.asset | 39 +- .../Test/FrameAnimation/Preview.meta | 8 + .../Preview/PreviewSampleGraph.asset | 243 +++++++ .../Preview/PreviewSampleGraph.asset.meta | 8 + .../Runtime/FrameAnimationPlaybackSession.cs | 64 +- .../Runtime/FrameAnimationResolver.cs | 53 ++ .../FrameAnimationGraphAuthoringTests.cs | 134 ++++ .../EditMode/FrameAnimationPreviewTests.cs | 248 +++++++ .../FrameAnimationPreviewTests.cs.meta | 2 + Docs/帧动画系统第五阶段手动测试.md | 79 +++ Docs/帧动画系统第五阶段手动测试.md.meta | 7 + Docs/帧动画系统第四阶段手动测试.md | 13 +- 23 files changed, 2591 insertions(+), 116 deletions(-) create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPreview.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPreview.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPreviewElement.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPreviewElement.cs.meta create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPreviewSampleBuilder.cs create mode 100644 Assets/Editor/FrameAnimation/FrameAnimationPreviewSampleBuilder.cs.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Preview.meta create mode 100644 Assets/GameContent/Test/FrameAnimation/Preview/PreviewSampleGraph.asset create mode 100644 Assets/GameContent/Test/FrameAnimation/Preview/PreviewSampleGraph.asset.meta create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationPreviewTests.cs create mode 100644 Assets/Tests/FrameAnimation/EditMode/FrameAnimationPreviewTests.cs.meta create mode 100644 Docs/帧动画系统第五阶段手动测试.md create mode 100644 Docs/帧动画系统第五阶段手动测试.md.meta diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs b/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs index bd562cbe7..aa2216769 100644 --- a/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphAuthoringServices.cs @@ -6,6 +6,70 @@ using UnityEngine; namespace AibisDream.FrameAnimation.Editor { + internal static class FrameAnimationFlowFocusPolicy + { + public static AnimationFlow FindFocusedFlow(FrameAnimationGraph graph, string focusedFlowId) + { + return graph?.Flows.FirstOrDefault(flow => flow != null && flow.Id == focusedFlowId); + } + + public static bool Contains( + FrameAnimationGraph graph, + string focusedFlowId, + FrameAnimationEditorSelection selection) + { + var flow = FindFocusedFlow(graph, focusedFlowId); + if (flow == null) + { + return false; + } + var reachable = new FrameAnimationGraphTopology(graph).GetReachable(flow.EntryNodeId); + return selection.Value switch + { + AnimationNode node => reachable.Nodes.Contains(node), + AnimationEdge edge => reachable.Edges.Contains(edge), + AnimationFlow selectedFlow => selectedFlow == flow, + _ => false + }; + } + + public static bool ShouldExitForSelection( + FrameAnimationGraph graph, + string focusedFlowId, + FrameAnimationEditorSelection selection) + { + if (string.IsNullOrEmpty(focusedFlowId)) + { + return false; + } + return selection.Kind switch + { + FrameAnimationEditorSelectionKind.None => false, + FrameAnimationEditorSelectionKind.Flow => false, + FrameAnimationEditorSelectionKind.Node => !Contains(graph, focusedFlowId, selection), + FrameAnimationEditorSelectionKind.Edge => !Contains(graph, focusedFlowId, selection), + _ => true + }; + } + + public static bool ShouldExitForSelectionSet( + FrameAnimationGraph graph, + string focusedFlowId, + IEnumerable selections) + { + if (string.IsNullOrEmpty(focusedFlowId)) + { + return false; + } + var items = (selections ?? Array.Empty()).ToArray(); + return items.Length > 0 && items.Any(item => + (item.Kind == FrameAnimationEditorSelectionKind.Node || + item.Kind == FrameAnimationEditorSelectionKind.Edge) + ? !Contains(graph, focusedFlowId, item) + : ShouldExitForSelection(graph, focusedFlowId, item)); + } + } + internal sealed class FrameAnimationGraphImpact { public IReadOnlyList Flows { get; } diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss new file mode 100644 index 000000000..0bfb16281 --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss @@ -0,0 +1,72 @@ +.fa-preview { + position: relative; + overflow: hidden; + border-left-width: 1px; + border-right-width: 1px; + border-top-width: 1px; + border-bottom-width: 1px; + border-left-color: rgb(25, 25, 25); + border-right-color: rgb(25, 25, 25); + border-top-color: rgb(25, 25, 25); + border-bottom-color: rgb(25, 25, 25); +} + +.fa-preview__image { + position: absolute; +} + +.fa-preview__empty { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + -unity-text-align: middle-center; + color: rgb(190, 190, 190); +} + +.fa-node__preview { + height: 82px; + margin-top: 5px; +} + +.fa-node--preview-current { + border-left-color: rgb(55, 174, 240); + border-right-color: rgb(55, 174, 240); + border-top-color: rgb(55, 174, 240); + border-bottom-color: rgb(55, 174, 240); +} + +.fa-node--preview-passed { + border-left-color: rgb(83, 154, 113); +} + +.fa-node--preview-upcoming { + opacity: 0.72; +} + +.fa-clip-preview-panel { + flex-shrink: 0; + padding-left: 6px; + padding-right: 6px; + padding-top: 4px; + padding-bottom: 5px; + border-bottom-width: 1px; + border-bottom-color: rgb(28, 28, 28); +} + +.fa-clip-preview-panel .fa-preview { + height: 190px; + margin-bottom: 4px; +} + +.fa-preview-controls { + flex-direction: row; + align-items: center; +} + +.fa-preview-status { + font-size: 10px; + color: rgb(185, 185, 185); + margin-top: 2px; +} diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss.meta b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss.meta new file mode 100644 index 000000000..37c3f50ed --- /dev/null +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditor.uss.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a38dd39c699e42348667cc1264ea9076 +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs index 85e254869..e556ccf70 100644 --- a/Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs +++ b/Assets/Editor/FrameAnimation/FrameAnimationGraphEditorWindow.cs @@ -33,6 +33,8 @@ namespace AibisDream.FrameAnimation.Editor private Label canvasLabel; private FrameAnimationGraphView graphView; private PopupField flowFocusField; + private Label flowFocusStatusLabel; + private ToolbarButton exitFlowFocusButton; private string focusedFlowId = string.Empty; private IReadOnlyList multiSelectedNodes = Array.Empty(); private AnimationNode lastSelectedNode; @@ -64,6 +66,21 @@ namespace AibisDream.FrameAnimation.Editor private SerializedObject clipSerializedObject; private FrameClip frameListClip; private ReorderableList frameList; + private readonly FrameAnimationPreviewCoordinator previewCoordinator = new FrameAnimationPreviewCoordinator(); + private readonly List previewTimelineSliders = new List(); + private readonly List