diff --git a/Assets/AddressableAssetsData/link.xml.meta b/Assets/AddressableAssetsData/link.xml.meta index 95a7269cb..4ac107c87 100644 --- a/Assets/AddressableAssetsData/link.xml.meta +++ b/Assets/AddressableAssetsData/link.xml.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 87ea248de149a8d40b85e0ce5f5eeec4 +guid: 5d3996fd36180b946afca2fae36c4121 TextScriptImporter: externalObjects: {} userData: diff --git a/Assets/Editor/Window.meta b/Assets/Editor/Window.meta new file mode 100644 index 000000000..74b2fefc0 --- /dev/null +++ b/Assets/Editor/Window.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: beb49cd6b9bf57e4eb6e1ebd5dc252e8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Window/AnimationClipData.cs b/Assets/Editor/Window/AnimationClipData.cs new file mode 100644 index 000000000..10e632702 --- /dev/null +++ b/Assets/Editor/Window/AnimationClipData.cs @@ -0,0 +1,132 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace AibisDream.SystemEditor +{ + // 帧数据 + [Serializable] + public class FrameData + { + public string name; + public int x; + public int y; + public int width; + public int height; + public float duration; // 毫秒 + } + + // 动画片段数据 + [Serializable] + public class AnimationData + { + public string name; + public List frameIndices; + public bool loop; + public float? frameDuration; // 可选的,覆盖全局frameDuration + public int? sampleRate; // 可选的,覆盖全局sampleRate + } + + // Aseprite JSON格式的数据结构 + [Serializable] + public class AsepriteFrameInfo + { + public AsepriteFrameRect frame; + public bool rotated; + public bool trimmed; + public AsepriteFrameRect spriteSourceSize; + public AsepriteSize sourceSize; + public float duration; // 毫秒 + } + + [Serializable] + public class AsepriteFrameRect + { + public int x; + public int y; + public int w; + public int h; + } + + [Serializable] + public class AsepriteSize + { + public int w; + public int h; + } + + [Serializable] + public class AsepriteFrameTag + { + public string name; + public int from; + public int to; + public string direction; + } + + [Serializable] + public class AsepriteMeta + { + public string app; + public string version; + public string image; + public string format; + public AsepriteSize size; + public string scale; + public List frameTags; + public List layers; + public List slices; + } + + // Aseprite JSON的包装类(因为Unity JsonUtility不支持Dictionary) + [Serializable] + public class AsepriteFrameEntry + { + public string key; + public AsepriteFrameInfo value; + } + + [Serializable] + public class AsepriteJsonData + { + public AsepriteMeta meta; + // frames将通过手动解析处理 + } + + // 手动JSON格式的数据结构 + [Serializable] + public class ManualLayout + { + public int rows; + public int columns; + public int? frameCount; // 可选 + public string direction; // "horizontal" 或 "vertical" + } + + [Serializable] + public class ManualJsonData + { + public string type; + public ManualLayout layout; + public float frameDuration; // 毫秒 + public int sampleRate; + public List animations; + } + + // 统一的内部数据格式 + public class ProcessedAnimationData + { + public List frames; + public List animations; + } + + public class ProcessedAnimationClip + { + public string name; + public List frameIndices; + public bool loop; + public float frameDuration; // 毫秒(已应用覆盖逻辑) + public int sampleRate; // 已应用覆盖逻辑 + } +} + diff --git a/Assets/Editor/Window/AnimationClipData.cs.meta b/Assets/Editor/Window/AnimationClipData.cs.meta new file mode 100644 index 000000000..8241aa66b --- /dev/null +++ b/Assets/Editor/Window/AnimationClipData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5cd60e41866d0ec418dfc6fdce37a8ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Window/AnimationClipGenerator.cs b/Assets/Editor/Window/AnimationClipGenerator.cs new file mode 100644 index 000000000..95beca911 --- /dev/null +++ b/Assets/Editor/Window/AnimationClipGenerator.cs @@ -0,0 +1,133 @@ +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace AibisDream.SystemEditor +{ + public class AnimationClipGenerator : EditorWindow + { + private Texture2D selectedTexture; + private TextAsset selectedJson; + private DefaultAsset outputFolder; + private string outputPath = ""; + + // 动画类型选项 + private enum AnimationTargetType + { + SpriteRenderer, // Sprite动画 + Image // UIImage动画 + } + private AnimationTargetType animationType = AnimationTargetType.SpriteRenderer; + + [MenuItem("Tools/Animation Clip Generator")] + public static void ShowWindow() + { + GetWindow("Animation Clip Generator"); + } + + private void OnGUI() + { + GUILayout.Label("Animation Clip Generator", EditorStyles.boldLabel); + EditorGUILayout.Space(); + + // 图片文件选择 + EditorGUILayout.LabelField("图片文件 (PNG/JPG)", EditorStyles.boldLabel); + selectedTexture = (Texture2D)EditorGUILayout.ObjectField( + "Texture", selectedTexture, typeof(Texture2D), false); + + EditorGUILayout.Space(); + + // JSON文件选择 + EditorGUILayout.LabelField("JSON文件", EditorStyles.boldLabel); + selectedJson = (TextAsset)EditorGUILayout.ObjectField( + "JSON", selectedJson, typeof(TextAsset), false); + + EditorGUILayout.Space(); + + // 动画类型选择 + EditorGUILayout.LabelField("动画类型", EditorStyles.boldLabel); + animationType = (AnimationTargetType)EditorGUILayout.EnumPopup( + "Animation Type", animationType); + EditorGUILayout.HelpBox( + animationType == AnimationTargetType.SpriteRenderer + ? "生成用于SpriteRenderer的动画(绑定到m_Sprite属性)" + : "生成用于Unity UI Image的动画(绑定到m_Sprite属性)", + MessageType.Info); + + EditorGUILayout.Space(); + + // 输出目录选择 + EditorGUILayout.LabelField("输出目录", EditorStyles.boldLabel); + outputFolder = (DefaultAsset)EditorGUILayout.ObjectField( + "Output Folder", outputFolder, typeof(DefaultAsset), false); + + // 显示输出路径 + if (outputFolder != null) + { + outputPath = AssetDatabase.GetAssetPath(outputFolder); + EditorGUILayout.HelpBox($"输出路径: {outputPath}", MessageType.Info); + } + else + { + outputPath = ""; + } + + EditorGUILayout.Space(); + + // 生成按钮 + GUI.enabled = selectedTexture != null && selectedJson != null && outputFolder != null; + if (GUILayout.Button("生成 AnimationClip", GUILayout.Height(30))) + { + GenerateAnimationClips(); + } + GUI.enabled = true; + + EditorGUILayout.Space(); + + // 说明信息 + EditorGUILayout.HelpBox( + "使用说明:\n" + + "1. 选择PNG或JPG图片文件\n" + + "2. 选择JSON文件(Aseprite格式或手动格式)\n" + + "3. 选择输出目录\n" + + "4. 点击生成按钮\n\n" + + "注意: 如果图片的SpriteMode是Single,工具会自动根据JSON切图。", + MessageType.Info); + } + + private void GenerateAnimationClips() + { + if (selectedTexture == null || selectedJson == null || outputFolder == null) + { + EditorUtility.DisplayDialog("错误", "请选择图片文件、JSON文件和输出目录", "确定"); + return; + } + + string texturePath = AssetDatabase.GetAssetPath(selectedTexture); + string jsonPath = AssetDatabase.GetAssetPath(selectedJson); + + // 验证文件扩展名 + string textureExt = Path.GetExtension(texturePath).ToLower(); + if (textureExt != ".png" && textureExt != ".jpg" && textureExt != ".jpeg") + { + EditorUtility.DisplayDialog("错误", "图片文件必须是PNG或JPG格式", "确定"); + return; + } + + try + { + bool isImageAnimation = animationType == AnimationTargetType.Image; + AnimationClipGeneratorCore.GenerateClips(texturePath, jsonPath, outputPath, isImageAnimation); + EditorUtility.DisplayDialog("成功", $"AnimationClip已生成到: {outputPath}", "确定"); + + // 刷新资源数据库 + AssetDatabase.Refresh(); + } + catch (System.Exception e) + { + EditorUtility.DisplayDialog("错误", $"生成失败: {e.Message}", "确定"); + Debug.LogError(e); + } + } + } +} \ No newline at end of file diff --git a/Assets/Editor/Window/AnimationClipGenerator.cs.meta b/Assets/Editor/Window/AnimationClipGenerator.cs.meta new file mode 100644 index 000000000..51948033f --- /dev/null +++ b/Assets/Editor/Window/AnimationClipGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7472aae8191639b47af5d9ba115b39b5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Editor/Window/AnimationClipGeneratorCore.cs b/Assets/Editor/Window/AnimationClipGeneratorCore.cs new file mode 100644 index 000000000..54cfb35f8 --- /dev/null +++ b/Assets/Editor/Window/AnimationClipGeneratorCore.cs @@ -0,0 +1,603 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using UnityEditor; +using UnityEditor.U2D.Sprites; +using UnityEngine; + +namespace AibisDream.SystemEditor +{ + public static class AnimationClipGeneratorCore + { + // 检查SpriteMode + public static SpriteImportMode CheckSpriteMode(string texturePath) + { + TextureImporter textureImporter = AssetImporter.GetAtPath(texturePath) as TextureImporter; + if (textureImporter == null) + { + throw new Exception($"无法加载纹理导入器: {texturePath}"); + } + return textureImporter.spriteImportMode; + } + + // 解析Aseprite JSON + public static ProcessedAnimationData ParseAsepriteJson(string jsonPath, string texturePath) + { + string jsonContent = File.ReadAllText(jsonPath); + + // Unity的JsonUtility不支持Dictionary,需要手动解析frames对象 + // 使用SimpleJSON或手动解析 + ProcessedAnimationData result = ParseAsepriteJsonManual(jsonContent); + + if (result.frames == null || result.frames.Count == 0) + { + throw new Exception("无效的Aseprite JSON格式:无法解析frames"); + } + + return result; + } + + private static ProcessedAnimationData ParseAsepriteJsonManual(string jsonContent) + { + List frames = new List(); + List animations = new List(); + + try + { + // 解析meta部分 + int metaStart = jsonContent.IndexOf("\"meta\":"); + if (metaStart == -1) + { + throw new Exception("找不到meta部分"); + } + + // 找到meta对象的结束位置 + int metaBraceStart = jsonContent.IndexOf('{', metaStart); + int metaBraceEnd = FindMatchingBrace(jsonContent, metaBraceStart); + string metaJson = jsonContent.Substring(metaBraceStart, metaBraceEnd - metaBraceStart + 1); + + // 移除可能的尾随逗号 + metaJson = metaJson.TrimEnd(',', ' ', '\n', '\r'); + + AsepriteMeta meta = JsonUtility.FromJson(metaJson); + + // 解析frameTags + if (meta.frameTags != null) + { + foreach (var tag in meta.frameTags) + { + List frameIndices = new List(); + int start = tag.from; + int end = tag.to; + + if (tag.direction == "forward" || tag.direction == "pingpong" || string.IsNullOrEmpty(tag.direction)) + { + for (int i = start; i <= end; i++) + { + frameIndices.Add(i); + } + } + else if (tag.direction == "reverse") + { + for (int i = end; i >= start; i--) + { + frameIndices.Add(i); + } + } + + animations.Add(new ProcessedAnimationClip + { + name = tag.name, + frameIndices = frameIndices, + loop = true, + frameDuration = 0, + sampleRate = 100 + }); + } + } + + // 解析frames对象 - 使用正则表达式或手动解析 + int framesStart = jsonContent.IndexOf("\"frames\":"); + if (framesStart == -1) + { + throw new Exception("找不到frames部分"); + } + + // 找到frames对象的开始和结束 + int framesBraceStart = jsonContent.IndexOf('{', framesStart); + int framesBraceEnd = FindMatchingBrace(jsonContent, framesBraceStart); + string framesContent = jsonContent.Substring(framesBraceStart + 1, framesBraceEnd - framesBraceStart - 1); + + // 解析每个帧条目 + ParseFramesContent(framesContent, frames); + + // 按名称排序帧(确保顺序正确) + frames = frames.OrderBy(f => ExtractFrameNumber(f.name)).ThenBy(f => f.name).ToList(); + } + catch (Exception e) + { + throw new Exception($"解析Aseprite JSON失败: {e.Message}\n{e.StackTrace}"); + } + + return new ProcessedAnimationData + { + frames = frames, + animations = animations + }; + } + + private static void ParseFramesContent(string framesContent, List frames) + { + int pos = 0; + while (pos < framesContent.Length) + { + // 跳过空白字符和逗号 + while (pos < framesContent.Length && (char.IsWhiteSpace(framesContent[pos]) || framesContent[pos] == ',')) + pos++; + + if (pos >= framesContent.Length) break; + + // 查找帧名称(在引号中) + if (framesContent[pos] != '"') + { + pos++; + continue; + } + + int nameStart = pos + 1; + int nameEnd = framesContent.IndexOf('"', nameStart); + if (nameEnd == -1) break; + + string frameName = framesContent.Substring(nameStart, nameEnd - nameStart); + pos = nameEnd + 1; + + // 跳过冒号和空白 + while (pos < framesContent.Length && (char.IsWhiteSpace(framesContent[pos]) || framesContent[pos] == ':')) + pos++; + + if (pos >= framesContent.Length) break; + + // 查找帧数据对象 + if (framesContent[pos] != '{') + { + continue; + } + + int dataStart = pos; + int dataEnd = FindMatchingBrace(framesContent, dataStart); + if (dataEnd == -1) break; + + string frameDataJson = framesContent.Substring(dataStart, dataEnd - dataStart + 1); + pos = dataEnd + 1; + + try + { + AsepriteFrameInfo frameInfo = JsonUtility.FromJson(frameDataJson); + if (frameInfo.frame != null) + { + frames.Add(new FrameData + { + name = frameName, + x = frameInfo.frame.x, + y = frameInfo.frame.y, + width = frameInfo.frame.w, + height = frameInfo.frame.h, + duration = frameInfo.duration + }); + } + } + catch (Exception e) + { + Debug.LogWarning($"解析帧数据失败: {frameName}, 错误: {e.Message}"); + } + } + } + + private static int ExtractFrameNumber(string frameName) + { + // 尝试从帧名称中提取数字(例如 "调酒妹侧头 0.aseprite" -> 0) + int lastSpace = frameName.LastIndexOf(' '); + if (lastSpace >= 0 && lastSpace < frameName.Length - 1) + { + string numberPart = frameName.Substring(lastSpace + 1); + int dotIndex = numberPart.IndexOf('.'); + if (dotIndex > 0) + { + numberPart = numberPart.Substring(0, dotIndex); + } + + if (int.TryParse(numberPart, out int number)) + { + return number; + } + } + return int.MaxValue; // 如果无法解析,放在最后 + } + + private static int FindMatchingBrace(string str, int startIndex) + { + if (startIndex < 0 || startIndex >= str.Length) return -1; + + int braceCount = 0; + bool foundStart = false; + + for (int i = startIndex; i < str.Length; i++) + { + if (str[i] == '{') + { + braceCount++; + foundStart = true; + } + else if (str[i] == '}') + { + braceCount--; + if (braceCount == 0 && foundStart) + { + return i; + } + } + } + return -1; + } + + // 解析手动JSON + public static ProcessedAnimationData ParseManualJson(string jsonPath, string texturePath) + { + string jsonContent = File.ReadAllText(jsonPath); + ManualJsonData manualData = JsonUtility.FromJson(jsonContent); + + if (manualData.layout == null || manualData.animations == null) + { + throw new Exception("无效的手动JSON格式"); + } + + // 验证layout参数 + if (manualData.layout.rows <= 0 || manualData.layout.columns <= 0) + { + throw new Exception("rows和columns必须大于0"); + } + + // 读取图片尺寸 + TextureImporter textureImporter = AssetImporter.GetAtPath(texturePath) as TextureImporter; + if (textureImporter == null) + { + throw new Exception($"无法加载纹理导入器: {texturePath}"); + } + + Texture2D texture = AssetDatabase.LoadAssetAtPath(texturePath); + if (texture == null) + { + throw new Exception($"无法加载纹理: {texturePath}"); + } + + int imageWidth = texture.width; + int imageHeight = texture.height; + + // 计算sprite尺寸 + int spriteWidth = imageWidth / manualData.layout.columns; + int spriteHeight = imageHeight / manualData.layout.rows; + + // 验证图片尺寸能被行列数整除 + if (imageWidth % manualData.layout.columns != 0 || imageHeight % manualData.layout.rows != 0) + { + throw new Exception($"图片尺寸({imageWidth}x{imageHeight})无法被行列数({manualData.layout.columns}x{manualData.layout.rows})整除"); + } + + // 计算总帧数 + int totalFrames = manualData.layout.frameCount ?? (manualData.layout.rows * manualData.layout.columns); + if (totalFrames > manualData.layout.rows * manualData.layout.columns) + { + throw new Exception($"frameCount({totalFrames})不能超过rows*columns({manualData.layout.rows * manualData.layout.columns})"); + } + + // 生成帧数据 + List frames = new List(); + bool isHorizontal = manualData.layout.direction == "horizontal"; + + for (int frameIndex = 0; frameIndex < totalFrames; frameIndex++) + { + int row, column; + if (isHorizontal) + { + // 横向排列:按行扫描,从左到右,从上到下 + row = frameIndex / manualData.layout.columns; + column = frameIndex % manualData.layout.columns; + } + else + { + // 纵向排列:按列扫描,从上到下,从左到右 + column = frameIndex / manualData.layout.rows; + row = frameIndex % manualData.layout.rows; + } + + // Unity Y轴从下往上,需要转换 + int x = column * spriteWidth; + int y = (manualData.layout.rows - 1 - row) * spriteHeight; + + frames.Add(new FrameData + { + name = $"frame_{frameIndex}", + x = x, + y = y, + width = spriteWidth, + height = spriteHeight, + duration = manualData.frameDuration + }); + } + + // 处理动画片段 + List animations = new List(); + foreach (var anim in manualData.animations) + { + // 应用参数覆盖逻辑 + float frameDuration = anim.frameDuration ?? manualData.frameDuration; + int sampleRate = anim.sampleRate ?? manualData.sampleRate; + + animations.Add(new ProcessedAnimationClip + { + name = anim.name, + frameIndices = anim.frameIndices, + loop = anim.loop, + frameDuration = frameDuration, + sampleRate = sampleRate + }); + } + + return new ProcessedAnimationData + { + frames = frames, + animations = animations + }; + } + + // 根据JSON信息切图 + public static void SliceSprites(string texturePath, List frames) + { + TextureImporter textureImporter = AssetImporter.GetAtPath(texturePath) as TextureImporter; + if (textureImporter == null) + { + throw new Exception($"无法加载纹理导入器: {texturePath}"); + } + + // 设置spriteMode为Multiple + textureImporter.spriteImportMode = SpriteImportMode.Multiple; + + // 使用新的Sprite Editor Data Provider API (Unity 2020.2+) + var spriteDataProviderFactories = new SpriteDataProviderFactories(); + spriteDataProviderFactories.Init(); + var dataProvider = spriteDataProviderFactories.GetSpriteEditorDataProviderFromObject(textureImporter); + + if (dataProvider == null) + { + throw new Exception($"无法获取Sprite Editor Data Provider: {texturePath}"); + } + + dataProvider.InitSpriteEditorDataProvider(); + + // 创建SpriteRect数组 + var spriteRects = new SpriteRect[frames.Count]; + for (int i = 0; i < frames.Count; i++) + { + var frame = frames[i]; + spriteRects[i] = new SpriteRect + { + name = frame.name, + rect = new Rect(frame.x, frame.y, frame.width, frame.height), + pivot = new Vector2(0.5f, 0.5f), + alignment = SpriteAlignment.Center + }; + } + + dataProvider.SetSpriteRects(spriteRects); + dataProvider.Apply(); + + AssetDatabase.ImportAsset(texturePath, ImportAssetOptions.ForceUpdate); + } + + // 创建AnimationClip + public static AnimationClip CreateAnimationClip( + ProcessedAnimationClip animationData, + List frames, + Sprite[] sprites, + string outputPath, + bool isImageAnimation = false) + { + AnimationClip clip = new AnimationClip(); + clip.name = animationData.name; + + // 设置采样率 + AnimationClipSettings settings = AnimationUtility.GetAnimationClipSettings(clip); + clip.frameRate = animationData.sampleRate; + + // 创建Sprite关键帧 + List keyframes = new List(); + float currentTime = 0f; + + foreach (int frameIndex in animationData.frameIndices) + { + if (frameIndex < 0 || frameIndex >= sprites.Length) + { + Debug.LogWarning($"帧索引{frameIndex}超出范围,跳过"); + continue; + } + + Sprite sprite = sprites[frameIndex]; + if (sprite == null) + { + Debug.LogWarning($"帧索引{frameIndex}的Sprite为空,跳过"); + continue; + } + + // 使用帧的duration(如果是Aseprite格式)或动画的frameDuration(手动格式) + float frameDuration = frames[frameIndex].duration > 0 + ? frames[frameIndex].duration / 1000f // 毫秒转秒 + : animationData.frameDuration / 1000f; + + keyframes.Add(new ObjectReferenceKeyframe + { + time = currentTime, + value = sprite + }); + + currentTime += frameDuration; + } + + if (keyframes.Count == 0) + { + throw new Exception($"动画片段{animationData.name}没有有效的关键帧"); + } + + // 设置循环 + if (animationData.loop && keyframes.Count > 1) + { + // 添加最后一帧的重复,确保循环 + keyframes.Add(new ObjectReferenceKeyframe + { + time = currentTime, + value = keyframes[0].value + }); + } + + // 创建EditorCurveBinding - 根据动画类型选择不同的组件 + EditorCurveBinding curveBinding = new EditorCurveBinding + { + path = "", + type = isImageAnimation ? typeof(UnityEngine.UI.Image) : typeof(SpriteRenderer), + propertyName = "m_Sprite" + }; + + // 设置曲线 + AnimationUtility.SetObjectReferenceCurve(clip, curveBinding, keyframes.ToArray()); + + // 设置循环 + settings.loopTime = animationData.loop; + AnimationUtility.SetAnimationClipSettings(clip, settings); + + // 保存AnimationClip + string fullPath = Path.Combine(outputPath, $"{animationData.name}.anim"); + string assetPath = fullPath.Replace('\\', '/'); + if (!assetPath.StartsWith("Assets/")) + { + // 转换为相对路径 + string projectPath = Application.dataPath.Replace("Assets", ""); + if (assetPath.StartsWith(projectPath)) + { + assetPath = assetPath.Substring(projectPath.Length); + } + } + + AssetDatabase.CreateAsset(clip, assetPath); + AssetDatabase.SaveAssets(); + + return clip; + } + + // 主流程:生成AnimationClip + public static void GenerateClips(string texturePath, string jsonPath, string outputPath, bool isImageAnimation = false) + { + try + { + EditorUtility.DisplayProgressBar("生成AnimationClip", "检查SpriteMode...", 0f); + + // 检查SpriteMode + SpriteImportMode spriteMode = CheckSpriteMode(texturePath); + if (spriteMode == SpriteImportMode.Multiple) + { + Debug.Log("图片的SpriteMode已经是Multiple,将使用现有的Sprite切图"); + } + + EditorUtility.DisplayProgressBar("生成AnimationClip", "解析JSON...", 0.2f); + + // 判断JSON类型并解析 + ProcessedAnimationData processedData; + string jsonContent = File.ReadAllText(jsonPath); + + if (jsonContent.Contains("\"type\":\"manual\"") || jsonContent.Contains("\"type\": \"manual\"")) + { + // 手动格式 + processedData = ParseManualJson(jsonPath, texturePath); + } + else + { + // Aseprite格式 + processedData = ParseAsepriteJson(jsonPath, texturePath); + } + + EditorUtility.DisplayProgressBar("生成AnimationClip", "切图...", 0.4f); + + // 如果是Single模式,需要切图 + if (spriteMode == SpriteImportMode.Single) + { + SliceSprites(texturePath, processedData.frames); + // 重新加载以确保sprites可用 + AssetDatabase.Refresh(); + } + + EditorUtility.DisplayProgressBar("生成AnimationClip", "加载Sprites...", 0.6f); + + // 加载所有Sprites + Sprite[] allSpritesArray = AssetDatabase.LoadAllAssetsAtPath(texturePath) + .OfType() + .ToArray(); + + if (allSpritesArray.Length == 0) + { + throw new Exception("无法加载任何Sprite,请检查切图设置"); + } + + // 创建Sprite字典以便快速查找 + Dictionary spriteDict = allSpritesArray.ToDictionary(s => s.name, s => s); + + // 按照frames列表的顺序创建Sprite数组 + Sprite[] allSprites = new Sprite[processedData.frames.Count]; + for (int i = 0; i < processedData.frames.Count; i++) + { + string frameName = processedData.frames[i].name; + if (spriteDict.TryGetValue(frameName, out Sprite sprite)) + { + allSprites[i] = sprite; + } + else + { + Debug.LogWarning($"找不到名为{frameName}的Sprite"); + // 尝试使用索引查找 + if (i < allSpritesArray.Length) + { + allSprites[i] = allSpritesArray[i]; + } + } + } + + // 确保输出目录存在 + if (!Directory.Exists(outputPath)) + { + Directory.CreateDirectory(outputPath); + } + + EditorUtility.DisplayProgressBar("生成AnimationClip", "创建AnimationClip...", 0.8f); + + // 为每个动画片段创建AnimationClip + int animationCount = processedData.animations.Count; + for (int i = 0; i < animationCount; i++) + { + var anim = processedData.animations[i]; + EditorUtility.DisplayProgressBar("生成AnimationClip", + $"创建动画片段: {anim.name}", 0.8f + (i / (float)animationCount) * 0.2f); + + CreateAnimationClip(anim, processedData.frames, allSprites, outputPath, isImageAnimation); + } + + EditorUtility.ClearProgressBar(); + Debug.Log($"成功生成{animationCount}个AnimationClip到: {outputPath}"); + } + catch (Exception e) + { + EditorUtility.ClearProgressBar(); + Debug.LogError($"生成AnimationClip失败: {e.Message}"); + throw; + } + } + } +} + diff --git a/Assets/Editor/Window/AnimationClipGeneratorCore.cs.meta b/Assets/Editor/Window/AnimationClipGeneratorCore.cs.meta new file mode 100644 index 000000000..2ab2aef40 --- /dev/null +++ b/Assets/Editor/Window/AnimationClipGeneratorCore.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7abb40962ba935419bb10c937b8b2c7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java b/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java index 264c0260f..b03d1e5a8 100644 --- a/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java +++ b/Assets/Plugins/Android/com.unity3d.player/PrivacyActivity.java @@ -14,7 +14,7 @@ public class PrivacyActivity extends Activity implements DialogInterface.OnClick "

提示

" + "欢迎使用本游戏!在使用前,请您充分阅读并理解:
" + - "我们收集的信息:
" + + "Unity收集的信息:
" + "• 设备信息:Android ID、IMEI、Mac地址、设备型号、系统版本
" + "• 应用信息:应用安装列表
" + "• 传感器信息:触屏、重力、加速度传感器(用于横竖屏适配)

" + @@ -49,7 +49,7 @@ public class PrivacyActivity extends Activity implements DialogInterface.OnClick AlertDialog.Builder privacyDialog = new AlertDialog.Builder(this); privacyDialog.setCancelable(false); privacyDialog.setView(webView); - privacyDialog.setTitle("提示"); + privacyDialog.setTitle("隐私政策"); privacyDialog.setNegativeButton("拒绝", this); privacyDialog.setPositiveButton("同意", this); privacyDialog.create().show(); diff --git a/Assets/Plugins/CleanFlatUI/Prefabs/ProgressBar/ProgressbarGridCircularAuto/ProgressBarGridCircularAuto_Circle.prefab b/Assets/Plugins/CleanFlatUI/Prefabs/ProgressBar/ProgressbarGridCircularAuto/ProgressBarGridCircularAuto_Circle.prefab index 0a9149c3e..8b6dd5fa0 100644 --- a/Assets/Plugins/CleanFlatUI/Prefabs/ProgressBar/ProgressbarGridCircularAuto/ProgressBarGridCircularAuto_Circle.prefab +++ b/Assets/Plugins/CleanFlatUI/Prefabs/ProgressBar/ProgressbarGridCircularAuto/ProgressBarGridCircularAuto_Circle.prefab @@ -28,9 +28,9 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 906934881151681816} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -102,6 +102,7 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 3626414201918202723} - {fileID: 8740152890213018971} @@ -109,7 +110,6 @@ RectTransform: - {fileID: 906934881151681816} - {fileID: 2606495909476536426} m_Father: {fileID: 0} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -167,9 +167,9 @@ RectTransform: m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2606495908852442975} - m_RootOrder: 4 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -206,8 +206,8 @@ MonoBehaviour: m_Calls: [] m_text: 0% m_isRightToLeft: 0 - m_fontAsset: {fileID: 0} - m_sharedMaterial: {fileID: 0} + m_fontAsset: {fileID: 11400000, guid: ce7a5dae4e01a554ba14c36172700b78, type: 2} + m_sharedMaterial: {fileID: -8257615428076326078, guid: ce7a5dae4e01a554ba14c36172700b78, type: 2} m_fontSharedMaterials: [] m_fontMaterial: {fileID: 0} m_fontMaterials: [] @@ -226,7 +226,7 @@ MonoBehaviour: m_spriteAsset: {fileID: 0} m_tintAllSprites: 0 m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: 0 + m_TextStyleHashCode: -1183493901 m_overrideHtmlColors: 0 m_faceColor: serializedVersion: 2 @@ -257,7 +257,7 @@ MonoBehaviour: checkPaddingRequired: 0 m_isRichText: 1 m_parseCtrlCharacters: 1 - m_isOrthographic: 0 + m_isOrthographic: 1 m_isCullingEnabled: 0 m_horizontalMapping: 0 m_verticalMapping: 0 @@ -299,10 +299,10 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 5871060232494687734} m_Father: {fileID: 2606495908852442975} - m_RootOrder: 2 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -337,9 +337,9 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 6268492219012126774} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -410,9 +410,9 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2606495908852442975} - m_RootOrder: 0 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} @@ -445,10 +445,10 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: - {fileID: 8174416950032976404} m_Father: {fileID: 2606495908852442975} - m_RootOrder: 3 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0.5, y: 0.5} m_AnchorMax: {x: 0.5, y: 0.5} @@ -481,9 +481,9 @@ RectTransform: m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 2606495908852442975} - m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 1, y: 1} diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so.meta index 576695653..2644a3022 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmod.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: ARM64 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so.meta index 887061075..58dc4bbbe 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: ARM64 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so.meta index 1e01072f5..c853498c6 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudio.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: ARM64 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so.meta index a270ef9f7..67753ca39 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/arm64-v8a/libfmodstudioL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: ARM64 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so.meta index ce02e3386..91f9d5a37 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmod.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: ARMv7 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so.meta index 733e8349b..dcd451141 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: ARMv7 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so.meta index 9ca8e0853..76b3e5886 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudio.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: ARMv7 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so.meta index 880d06847..6d1e08b56 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/armeabi-v7a/libfmodstudioL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: ARMv7 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so.meta index f10f428e7..d4ccd7658 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmod.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: x86 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so.meta index 1de942c35..f951a9b01 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: x86 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so.meta index e8dec268d..6bb07b845 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudio.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: x86 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so.meta index 5aa83a4df..5baa94a0f 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86/libfmodstudioL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: x86 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so.meta index c29272c4d..53925698a 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmod.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: x86_64 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so.meta index 7168eefa5..ccf3aa19b 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: x86_64 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so.meta index 27f5643d8..e911fcf92 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudio.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 0 + enabled: 1 settings: CPU: x86_64 - first: diff --git a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so.meta b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so.meta index 94ae8d3d1..47975e9f5 100644 --- a/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so.meta +++ b/Assets/Plugins/FMOD/platforms/android/lib/x86_64/libfmodstudioL.so.meta @@ -14,7 +14,7 @@ PluginImporter: - first: Android: Android second: - enabled: 1 + enabled: 0 settings: CPU: x86_64 - first: diff --git a/Assets/Prefabs/Bubbles/Bubble.prefab b/Assets/Prefabs/Bubbles/Bubble.prefab index 79c4e9f27..3db8b2444 100644 --- a/Assets/Prefabs/Bubbles/Bubble.prefab +++ b/Assets/Prefabs/Bubbles/Bubble.prefab @@ -164,8 +164,7 @@ MonoBehaviour: databaseActions: {fileID: 11400000, guid: de78232a60d74f6459e57e5606304209, type: 2} defaultAppearancesTags: - step - defaultDisappearancesTags: - - fade + defaultDisappearancesTags: [] defaultBehaviorsTags: [] defaultTagsMode: 0 --- !u!114 &107040131454302588 diff --git a/Assets/Scenes/Persistence.unity b/Assets/Scenes/Persistence.unity index f0759a7cc..e5615d90e 100644 --- a/Assets/Scenes/Persistence.unity +++ b/Assets/Scenes/Persistence.unity @@ -14103,6 +14103,103 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 875421810} m_CullTransparentMesh: 1 +--- !u!1 &877404617 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 877404618} + - component: {fileID: 877404621} + - component: {fileID: 877404620} + - component: {fileID: 877404619} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &877404618 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877404617} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1662599903} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -3} + m_SizeDelta: {x: 182, y: 222} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!95 &877404619 +Animator: + serializedVersion: 5 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877404617} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: 4efe920582e4eb84eabc738f16624d2b, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &877404620 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877404617} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &877404621 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 877404617} + m_CullTransparentMesh: 1 --- !u!1 &903780131 GameObject: m_ObjectHideFlags: 0 @@ -14248,6 +14345,7 @@ RectTransform: m_Children: - {fileID: 961234236} - {fileID: 398371925} + - {fileID: 1662599903} m_Father: {fileID: 2091451641} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -14276,6 +14374,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: demoTimer: {fileID: 398371926} + loading: {fileID: 1662599902} --- !u!1 &927888433 GameObject: m_ObjectHideFlags: 0 @@ -16804,6 +16903,140 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1134033127} m_CullTransparentMesh: 1 +--- !u!1 &1145107390 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1145107391} + - component: {fileID: 1145107393} + - component: {fileID: 1145107392} + m_Layer: 5 + m_Name: Text (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1145107391 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1145107390} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1662599903} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: -116} + m_SizeDelta: {x: 200, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1145107392 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1145107390} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: Loading + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: ce7a5dae4e01a554ba14c36172700b78, type: 2} + m_sharedMaterial: {fileID: -8257615428076326078, guid: ce7a5dae4e01a554ba14c36172700b78, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 42 + m_fontSizeBase: 42 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 256 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} +--- !u!222 &1145107393 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1145107390} + m_CullTransparentMesh: 1 --- !u!1 &1153212192 GameObject: m_ObjectHideFlags: 0 @@ -23747,6 +23980,43 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: isLocked: 0 +--- !u!1 &1662599902 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1662599903} + m_Layer: 5 + m_Name: Loading + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &1662599903 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1662599902} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 877404618} + - {fileID: 1145107391} + m_Father: {fileID: 923998313} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} --- !u!1 &1689237971 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Game Loop/SceneLoader.cs b/Assets/Scripts/Game Loop/SceneLoader.cs index c4d60bd69..2c6e7441b 100644 --- a/Assets/Scripts/Game Loop/SceneLoader.cs +++ b/Assets/Scripts/Game Loop/SceneLoader.cs @@ -7,6 +7,7 @@ using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.SceneManagement; using DG.Tweening; +using AibisDream.UI; namespace AibisDream { @@ -52,6 +53,8 @@ namespace AibisDream // 场景转换参数 _isLoading = true; _sceneToLoad = targetScene; + + UIManager.Instance.GetPanel().ShowLoading(); // 在卸载场景前清理所有系统 if (!string.IsNullOrEmpty(_data.sceneName)) @@ -73,6 +76,8 @@ namespace AibisDream EnumEventSystem.Global.Send(EventEnum.SceneLoad, _sceneToLoad); _data.sceneName = _sceneToLoad; + + UIManager.Instance.GetPanel().HideLoading(); _isLoading = false; } } diff --git a/Assets/Scripts/UI/DialogUI/Bubbles/Bubble.cs b/Assets/Scripts/UI/DialogUI/Bubbles/Bubble.cs index d807b4b9b..215d73bf0 100644 --- a/Assets/Scripts/UI/DialogUI/Bubbles/Bubble.cs +++ b/Assets/Scripts/UI/DialogUI/Bubbles/Bubble.cs @@ -121,7 +121,7 @@ namespace AibisDream public void ShowLine(string line) { - _typewriter.TextAnimator.SetText(""); + _typewriter.ShowText(""); gameObject.SetActive(true); HandleLayout(line); _typewriter.ShowText(line); diff --git a/Assets/Scripts/UI/Panel/InfoPanel.cs b/Assets/Scripts/UI/Panel/InfoPanel.cs index 58ded1508..5c4fdff95 100644 --- a/Assets/Scripts/UI/Panel/InfoPanel.cs +++ b/Assets/Scripts/UI/Panel/InfoPanel.cs @@ -5,6 +5,7 @@ namespace AibisDream.UI public class InfoPanel : MonoBehaviour, IUIPanel { [SerializeField] private DemoTimer demoTimer; + [SerializeField] private GameObject loading; public void SetTimerActive(bool isOpen) { @@ -16,6 +17,16 @@ namespace AibisDream.UI demoTimer.totalTimeInSeconds = time; } + public void ShowLoading() + { + loading?.SetActive(true); + } + + public void HideLoading() + { + loading?.SetActive(false); + } + public void Show() { gameObject.SetActive(true); diff --git a/Assets/UI/Animation/Loading.meta b/Assets/UI/Animation/Loading.meta new file mode 100644 index 000000000..1a7eb7a52 --- /dev/null +++ b/Assets/UI/Animation/Loading.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f152992d42cac4e4fb88e562812b6013 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Animation/Loading/LOADING 罐头.png b/Assets/UI/Animation/Loading/LOADING 罐头.png new file mode 100644 index 000000000..ec1d508e2 --- /dev/null +++ b/Assets/UI/Animation/Loading/LOADING 罐头.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e0f907bfcf82469cb223557bb4b9823756e12a4891a4c7659f1c2fa7372328e +size 35242 diff --git a/Assets/UI/Animation/Loading/LOADING 罐头.png.meta b/Assets/UI/Animation/Loading/LOADING 罐头.png.meta new file mode 100644 index 000000000..7bd7b79db --- /dev/null +++ b/Assets/UI/Animation/Loading/LOADING 罐头.png.meta @@ -0,0 +1,505 @@ +fileFormatVersion: 2 +guid: 4af5cf244c618df42813f45ce20338ea +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 2 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 4096 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_0" + rect: + serializedVersion: 2 + x: 0 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 6e493e316235fe542a153d49c625f134 + internalID: 1719050414 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_1" + rect: + serializedVersion: 2 + x: 182 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 52cf602c8b89e284b83d131738790d0a + internalID: -1164775371 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_2" + rect: + serializedVersion: 2 + x: 364 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 774324f9c420dc049813cb468abc2594 + internalID: -1244389054 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_3" + rect: + serializedVersion: 2 + x: 546 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2f8c071d9d5fc9849a68a6e64f984b57 + internalID: -1957662414 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_4" + rect: + serializedVersion: 2 + x: 728 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 5b29d8093de8b4c4e9c0b66b82deb1ed + internalID: -386358468 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_5" + rect: + serializedVersion: 2 + x: 910 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d3dc6fe9812df3049bad7f19730fb6ca + internalID: -1287565805 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_6" + rect: + serializedVersion: 2 + x: 1092 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 4bf8ebffad0c6f44e9abb099429e3722 + internalID: -2040738244 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_7" + rect: + serializedVersion: 2 + x: 1274 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 3e080f56cdb5b8b48b4b1ccefabc8de9 + internalID: 1625432532 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_8" + rect: + serializedVersion: 2 + x: 1456 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 2360c3e26ec123b48ad8357e748b657d + internalID: 1848882051 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_9" + rect: + serializedVersion: 2 + x: 1638 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 8eab2dccbc20b3f4d9a5b0d9f995fc6f + internalID: -1381685395 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_10" + rect: + serializedVersion: 2 + x: 1820 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 92f5a9e142ea3ec4fae5990f3153dd34 + internalID: -641158983 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_11" + rect: + serializedVersion: 2 + x: 2002 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b37db88e2759412468c4b61d6238fd01 + internalID: -1931024059 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_12" + rect: + serializedVersion: 2 + x: 2184 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: d485e426994f5ca4c91c6b0256e63f35 + internalID: -1103357223 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_13" + rect: + serializedVersion: 2 + x: 2366 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: b377314d703afef4bbb2da26559342e0 + internalID: 596276626 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_14" + rect: + serializedVersion: 2 + x: 2548 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 9ef6d368720f1e14796cf8f3d991c4db + internalID: 766679972 + vertices: [] + indices: + edges: [] + weights: [] + - serializedVersion: 2 + name: "LOADING \u7F50\u5934_15" + rect: + serializedVersion: 2 + x: 2730 + y: 0 + width: 182 + height: 222 + alignment: 0 + pivot: {x: 0, y: 0} + border: {x: 0, y: 0, z: 0, w: 0} + outline: [] + physicsShape: [] + tessellationDetail: 0 + bones: [] + spriteID: 15c7470169f38ed4184bc11b865b772d + internalID: 908783198 + vertices: [] + indices: + edges: [] + weights: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: + "LOADING \u7F50\u5934_0": 1719050414 + "LOADING \u7F50\u5934_1": -1164775371 + "LOADING \u7F50\u5934_10": -641158983 + "LOADING \u7F50\u5934_11": -1931024059 + "LOADING \u7F50\u5934_12": -1103357223 + "LOADING \u7F50\u5934_13": 596276626 + "LOADING \u7F50\u5934_14": 766679972 + "LOADING \u7F50\u5934_15": 908783198 + "LOADING \u7F50\u5934_2": -1244389054 + "LOADING \u7F50\u5934_3": -1957662414 + "LOADING \u7F50\u5934_4": -386358468 + "LOADING \u7F50\u5934_5": -1287565805 + "LOADING \u7F50\u5934_6": -2040738244 + "LOADING \u7F50\u5934_7": 1625432532 + "LOADING \u7F50\u5934_8": 1848882051 + "LOADING \u7F50\u5934_9": -1381685395 + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Animation/Loading/Loading.controller b/Assets/UI/Animation/Loading/Loading.controller new file mode 100644 index 000000000..ef73489a3 --- /dev/null +++ b/Assets/UI/Animation/Loading/Loading.controller @@ -0,0 +1,72 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-6608008813301334011 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: New State + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: da64c7b441e509c4f8a07f47647dc313, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Loading + serializedVersion: 5 + m_AnimatorParameters: [] + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 3638069603095265619} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} +--- !u!1107 &3638069603095265619 +AnimatorStateMachine: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -6608008813301334011} + m_Position: {x: 390, y: 260, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -6608008813301334011} diff --git a/Assets/UI/Animation/Loading/Loading.controller.meta b/Assets/UI/Animation/Loading/Loading.controller.meta new file mode 100644 index 000000000..64dce4707 --- /dev/null +++ b/Assets/UI/Animation/Loading/Loading.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4efe920582e4eb84eabc738f16624d2b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Animation/Loading/LoadingAnimationConfig.json b/Assets/UI/Animation/Loading/LoadingAnimationConfig.json new file mode 100644 index 000000000..384532939 --- /dev/null +++ b/Assets/UI/Animation/Loading/LoadingAnimationConfig.json @@ -0,0 +1,20 @@ +{ + "type": "manual", + "layout": { + "rows": 1, + "columns": 17, + "frameCount": 16, + "direction": "horizontal" + }, + "frameDuration": 200, + "sampleRate": 60, + "animations": [ + { + "name": "loading", + "frameIndices": [ + 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 + ], + "loop": true + } + ] +} \ No newline at end of file diff --git a/Assets/UI/Animation/Loading/LoadingAnimationConfig.json.meta b/Assets/UI/Animation/Loading/LoadingAnimationConfig.json.meta new file mode 100644 index 000000000..1239607bb --- /dev/null +++ b/Assets/UI/Animation/Loading/LoadingAnimationConfig.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 16afd6b9dee930748902c25e1db009de +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Animation/Loading/loading.anim b/Assets/UI/Animation/Loading/loading.anim new file mode 100644 index 000000000..7b6f34f64 --- /dev/null +++ b/Assets/UI/Animation/Loading/loading.anim @@ -0,0 +1,120 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: loading + serializedVersion: 7 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - serializedVersion: 2 + curve: + - time: 0 + value: {fileID: 1719050414, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.1 + value: {fileID: -1164775371, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.2 + value: {fileID: -1244389054, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.3 + value: {fileID: -1957662414, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.4 + value: {fileID: -386358468, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.5 + value: {fileID: -1287565805, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.6 + value: {fileID: -2040738244, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.7 + value: {fileID: 1625432532, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.8 + value: {fileID: 1848882051, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 0.9 + value: {fileID: -1381685395, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 1 + value: {fileID: -641158983, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 1.1 + value: {fileID: -1931024059, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 1.2 + value: {fileID: -1103357223, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 1.3 + value: {fileID: 596276626, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 1.4 + value: {fileID: 766679972, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 1.5 + value: {fileID: 908783198, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - time: 1.6 + value: {fileID: 1719050414, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + attribute: m_Sprite + path: + classID: 114 + script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + flags: 2 + m_SampleRate: 120 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 2015549526 + script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + typeID: 114 + customType: 0 + isPPtrCurve: 1 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + pptrCurveMapping: + - {fileID: 1719050414, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -1164775371, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -1244389054, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -1957662414, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -386358468, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -1287565805, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -2040738244, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: 1625432532, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: 1848882051, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -1381685395, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -641158983, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -1931024059, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: -1103357223, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: 596276626, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: 766679972, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: 908783198, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + - {fileID: 1719050414, guid: 4af5cf244c618df42813f45ce20338ea, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1.6083333 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 1 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: [] diff --git a/Assets/UI/Animation/Loading/loading.anim.meta b/Assets/UI/Animation/Loading/loading.anim.meta new file mode 100644 index 000000000..8c68b5127 --- /dev/null +++ b/Assets/UI/Animation/Loading/loading.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: da64c7b441e509c4f8a07f47647dc313 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/UI/Art/新logo.png b/Assets/UI/Art/新logo.png new file mode 100644 index 000000000..1ed265e37 --- /dev/null +++ b/Assets/UI/Art/新logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88b038dfe4f027e162ebdcb0eb7855272e9e50757be78b3acf29250067461c78 +size 152589 diff --git a/Assets/UI/Art/新logo.png.meta b/Assets/UI/Art/新logo.png.meta new file mode 100644 index 000000000..20b51fa88 --- /dev/null +++ b/Assets/UI/Art/新logo.png.meta @@ -0,0 +1,153 @@ +fileFormatVersion: 2 +guid: 833416dc8493ff8419feeba7b287fd20 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index d0500fa9e..2f31d2ef5 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -13,8 +13,7 @@ PlayerSettings: useOnDemandResources: 0 accelerometerFrequency: 60 companyName: Tin Bird - productName: "\u7231\u4E0E\u673A\u5668\u4EBA\u7EF4\u4FEE\u6280\u672F All Our Broken - Parts" + productName: "\u7231\u4E0E\u673A\u5668\u4EBA\u7EF4\u4FEE\u6280\u672F" defaultCursor: {fileID: 0} cursorHotspot: {x: 0, y: 0} m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} @@ -134,7 +133,7 @@ PlayerSettings: vulkanEnableLateAcquireNextImage: 0 vulkanEnableCommandBufferRecycling: 1 loadStoreDebugModeEnabled: 0 - bundleVersion: 0.3.3.25-20251219-181200 + bundleVersion: 0.3.3.28-20251222-184826 preloadedAssets: - {fileID: 11400000, guid: 0fb2bc2476953fc43a74f0ab8879077c, type: 2} metroInputSource: 0 @@ -282,7 +281,7 @@ PlayerSettings: - m_BuildTarget: m_Icons: - serializedVersion: 2 - m_Icon: {fileID: 2800000, guid: afb29ffbb41ba6443839b478ece5e6cd, type: 3} + m_Icon: {fileID: 2800000, guid: 833416dc8493ff8419feeba7b287fd20, type: 3} m_Width: 128 m_Height: 128 m_Kind: 0