This commit is contained in:
Han
2025-05-07 14:34:14 +08:00
13 changed files with 282 additions and 84 deletions

View File

@@ -13,8 +13,7 @@ namespace Stary.Evo.Editor
{ {
public void OnEnable() public void OnEnable()
{ {
BuildPipelineViewer();
GetPackageVersion();
oldVersionX = packageVersionX; oldVersionX = packageVersionX;
oldVersionY = packageVersionY; oldVersionY = packageVersionY;
oldVersionZ = packageVersionZ; oldVersionZ = packageVersionZ;
@@ -120,6 +119,8 @@ namespace Stary.Evo.Editor
// [OnValueChanged("SetEncryptionServices")] // [OnValueChanged("SetEncryptionServices")]
// public Type encryption; // public Type encryption;
[HideLabel] public AbstractBuildPipelineViewer viewer; [HideLabel] public AbstractBuildPipelineViewer viewer;
[HideLabel] private Dictionary<EBuildPipeline, AbstractBuildPipelineViewer> _viewers; [HideLabel] private Dictionary<EBuildPipeline, AbstractBuildPipelineViewer> _viewers;

View File

@@ -28,6 +28,8 @@ namespace Stary.Evo.Editor
{ {
private static BuildAssetWindow window; private static BuildAssetWindow window;
[MenuItem("Evo/资源打包工具")] [MenuItem("Evo/资源打包工具")]
static void ShowWindows() static void ShowWindows()
{ {

View File

@@ -1,5 +1,6 @@
using System; using System;
using UnityEditor; using UnityEditor;
using UnityEngine;
using YooAsset; using YooAsset;
using YooAsset.Editor; using YooAsset.Editor;
@@ -44,7 +45,8 @@ namespace Stary.Evo.Editor
var buildResult = pipeline.Run(buildParameters, true); var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success) if (buildResult.Success)
{ {
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory); Debug.Log($"Build Success! 【{buildResult.OutputPackageDirectory}】");
//EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
base.ExecuteBuild(); base.ExecuteBuild();
} }

View File

@@ -2,13 +2,10 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading.Tasks;
using EditorFramework;
using HybridCLR.Editor; using HybridCLR.Editor;
using HybridCLR.Editor.Settings; using HybridCLR.Editor.Settings;
using Sirenix.OdinInspector; using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor; using Sirenix.OdinInspector.Editor;
using Sirenix.Utilities;
using Stary.Evo.InformationSave; using Stary.Evo.InformationSave;
using UnityEditor; using UnityEditor;
using UnityEditorInternal; using UnityEditorInternal;

View File

@@ -60,10 +60,15 @@ namespace Stary.Evo.Editor
{ {
this.dataSetting = dataSetting; this.dataSetting = dataSetting;
useAssetDependencyDBToggle = true; useAssetDependencyDBToggle = true;
SetUseAssetDependencyDB();
clearBuildCacheToggle = false; clearBuildCacheToggle = false;
SetBuildCacheToggle();
compression = ECompressOption.LZ4; compression = ECompressOption.LZ4;
SetCompression();
fileNameStyle = EFileNameStyle.BundleName; fileNameStyle = EFileNameStyle.BundleName;
SetFileNameStyle();
copyBuildinFileOption = EBuildinFileCopyOption.ClearAndCopyAll; copyBuildinFileOption = EBuildinFileCopyOption.ClearAndCopyAll;
SetCopyBuildinFileOption();
} }
#region AssetBuild #region AssetBuild

View File

@@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using HybridCLR.Editor;
using HybridCLR.Editor.Commands;
using HybridCLR.Editor.Settings;
using Sirenix.OdinInspector;
using Sirenix.OdinInspector.Editor;
using Stary.Evo.InformationSave;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;
using YooAsset.Editor;
namespace Stary.Evo.Editor
{
public class OneKeyBuildWindow : OdinEditorWindow
{
[MenuItem("Evo/(一键)打包工具")]
static void Init()
{
var window = (OneKeyBuildWindow)EditorWindow.GetWindow(typeof(OneKeyBuildWindow));
window.Show();
}
[ListDrawerSettings(DraggableItems = false, ShowFoldout = false, ShowPaging = false, ShowItemCount = false,
HideRemoveButton = true)]
public List<OneKeyBUildEntity> OneKeyBUildEntities = new List<OneKeyBUildEntity>();
protected override void Initialize()
{
base.Initialize();
var creatDomainAll = CreatAssetWindow.GetCreatDomainAll();
foreach (var domainEntity in creatDomainAll)
{
OneKeyBUildEntities.Add(new OneKeyBUildEntity()
{
DomainName = domainEntity.DomainName
});
}
}
[Button("(一键)标记选择资源",ButtonSizes.Large)]
public void OneClickMark()
{
//打dll
CompileDllCommand.CompileDllActiveBuildTarget();
//拷贝dll
MarkAdressable.AddHotfixAddressableDllAll(OneKeyBUildEntities);
//标记全部资源
MarkAdressable.AddMarkAll(OneKeyBUildEntities);
EditorUtility.DisplayDialog("提示", $"标记所有资源完成!", "确定");
}
[Button("(一键)打包选择资源",ButtonSizes.Large)]
public void OneClickBuild()
{
//打包
EditorTools.ClearUnityConsole();
foreach (var oneKeyBUildEntity in OneKeyBUildEntities)
{
if (oneKeyBUildEntity.isRaw)
{
BuildAssetDataSetting buildAssetDataSetting =
AssetDatabase.LoadAssetAtPath<BuildAssetDataSetting>(
$"Assets/Domain/{oneKeyBUildEntity.DomainName}/Conf/BuildAssetDataSetting.asset");
if (buildAssetDataSetting != null)
{
buildAssetDataSetting.environmentType = EnvironmentType.Release;
buildAssetDataSetting.SetEnvironmentType();
buildAssetDataSetting.viewer = new BuiltinBuildPipelineViewer(buildAssetDataSetting);
buildAssetDataSetting.viewer.clearBuildCacheToggle = true;
buildAssetDataSetting.viewer.SetBuildCacheToggle();
EditorApplication.delayCall += buildAssetDataSetting.viewer.ExecuteBuild;
}
else
{
Debug.LogError("BuildAssetDataSetting 不存在:" + oneKeyBUildEntity.DomainName);
}
}
}
EditorUtility.DisplayDialog("提示", $"开始打包资源!", "确定");
}
}
public struct OneKeyBUildEntity
{
[Title("是否打包", titleAlignment: TitleAlignments.Centered)] [HideLabel, HorizontalGroup("OneKeyBUildEntity")]
public bool isRaw;
[Title("包名", titleAlignment: TitleAlignments.Centered)]
[HideLabel, ReadOnly, HorizontalGroup("OneKeyBUildEntity")]
public string DomainName;
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 26f920eb9cb048179fdc641cfd92ed93
timeCreated: 1746583992

View File

@@ -1,5 +1,6 @@
using System; using System;
using UnityEditor; using UnityEditor;
using UnityEngine;
using YooAsset; using YooAsset;
using YooAsset.Editor; using YooAsset.Editor;
@@ -43,7 +44,8 @@ namespace Stary.Evo.Editor
var buildResult = pipeline.Run(buildParameters, true); var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success) if (buildResult.Success)
{ {
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory); Debug.Log($"Build Success! 【{buildResult.OutputPackageDirectory}】");
// EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
base.ExecuteBuild(); base.ExecuteBuild();
} }
} }

View File

@@ -1,5 +1,6 @@
using System; using System;
using UnityEditor; using UnityEditor;
using UnityEngine;
using YooAsset; using YooAsset;
using YooAsset.Editor; using YooAsset.Editor;
@@ -46,7 +47,8 @@ namespace Stary.Evo.Editor
var buildResult = pipeline.Run(buildParameters, true); var buildResult = pipeline.Run(buildParameters, true);
if (buildResult.Success) if (buildResult.Success)
{ {
EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory); Debug.Log($"Build Success! 【{buildResult.OutputPackageDirectory}】");
// EditorUtility.RevealInFinder(buildResult.OutputPackageDirectory);
base.ExecuteBuild(); base.ExecuteBuild();
} }
} }

View File

@@ -19,7 +19,6 @@ namespace Stary.Evo.Editor
private static string[] configNames = new[] { "DomainConfig" }; private static string[] configNames = new[] { "DomainConfig" };
public static string DomainRoot public static string DomainRoot
{ {
get { return Application.dataPath + "/Domain"; } get { return Application.dataPath + "/Domain"; }
@@ -51,13 +50,31 @@ namespace Stary.Evo.Editor
//[MenuItem("Evo/Hotfix/Addressable")] //[MenuItem("Evo/Hotfix/Addressable")]
public static void AddHotfixAddressableDll() public static void AddHotfixAddressableDll()
{ {
CopyDllHotUpdateAssembly(BuildAssetWindow.GetBuildPackageName(), $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes"); CopyDllHotUpdateAssembly(BuildAssetWindow.GetBuildPackageName(),
$"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes");
CopyDllStrippedAOTDllOutputRootDir($"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes"); CopyDllStrippedAOTDllOutputRootDir($"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes");
//EditorUtility.DisplayDialog("自动标记", "自动Hotfix成功", "确定"); //EditorUtility.DisplayDialog("自动标记", "自动Hotfix成功", "确定");
} }
public static void AddHotfixAddressableDllAll(List<OneKeyBUildEntity> oneKeyBUildEntities)
{
var DomainAll = CreatAssetWindow.GetCreatDomainAll();
foreach (var oneKeyBUildEntity in oneKeyBUildEntities)
{
if (oneKeyBUildEntity.isRaw)
{
CopyDllHotUpdateAssembly(oneKeyBUildEntity.DomainName, $"{DomainRoot}/{oneKeyBUildEntity.DomainName}/AddressableRes");
CopyDllStrippedAOTDllOutputRootDir($"{DomainRoot}/{oneKeyBUildEntity.DomainName}/AddressableRes");
}
}
//EditorUtility.DisplayDialog("自动标记", "自动Hotfix成功", "确定");
}
private static void CopyDllHotUpdateAssembly(string domain, string target) private static void CopyDllHotUpdateAssembly(string domain, string target)
{ {
//读取打包dll位置 //读取打包dll位置
@@ -108,34 +125,40 @@ namespace Stary.Evo.Editor
} }
} }
public static void AddMarkAll(List<OneKeyBUildEntity> oneKeyBUildEntities)
{
YooAsset.Editor.AssetBundleCollectorSettingData.ClearAll();
foreach (var oneKeyBUildEntity in oneKeyBUildEntities)
{
if (oneKeyBUildEntity.isRaw)
{
string configPath =
$"Assets/Domain/{oneKeyBUildEntity.DomainName}/Conf/HotfixMainResDomain.asset";
HotfixMainResDomain hotfixMainResDomain =
AssetDatabase.LoadAssetAtPath<HotfixMainResDomain>(configPath);
packageName = hotfixMainResDomain.hotfixMainResDomainEntity.domain;
Mark();
if (!oneKeyBUildEntity.DomainName.Equals("Main"))
CreateRes(packageName,
$"{DomainRoot}/{oneKeyBUildEntity.DomainName}/AddressableRes",
$"{DomainRoot}/{oneKeyBUildEntity.DomainName}/HotUpdate");
else
CreateRes(packageName,
$"{DomainRoot}/{oneKeyBUildEntity.DomainName}/AddressableRes",
$"{MainDomainRoot}/Script/Runtime/HotUpdate");
}
}
}
//[MenuItem("Evo/Hotfix/标记资源")] //[MenuItem("Evo/Hotfix/标记资源")]
public static void AddMark() public static void AddMark()
{ {
// //清空主包旧数据 // //清空主包旧数据
AssetBundleCollectorPackage assetBundleCollectorPackage = null; AssetBundleCollectorPackage assetBundleCollectorPackage = null;
// foreach (var package in AssetBundleCollectorSettingData.Setting.Packages)
// {
// if (package.PackageName == "Main")
// {
// assetBundleCollectorPackage = package;
// }
// }
// if (assetBundleCollectorPackage != null)
// {
// YooAsset.Editor.AssetBundleCollectorSettingData.RemovePackage(assetBundleCollectorPackage);
// }
// DomainRoot = DomainMainPath;
// packageName = "Main";
// Mark();
// CreateRes(packageName,
// $"{DomainRoot}/Main/AddressableRes",
// $"{DomainRoot}/Main/Script");
//copydll //copydll
if(!BuildAssetWindow.GetBuildPackageName().Equals("Main")) if (!BuildAssetWindow.GetBuildPackageName().Equals("Main"))
AddHotfixAddressableDll(); AddHotfixAddressableDll();
//清空用户旧数据 //清空用户旧数据
foreach (var package in AssetBundleCollectorSettingData.Setting.Packages) foreach (var package in AssetBundleCollectorSettingData.Setting.Packages)
@@ -145,19 +168,21 @@ namespace Stary.Evo.Editor
assetBundleCollectorPackage = package; assetBundleCollectorPackage = package;
} }
} }
if (assetBundleCollectorPackage != null) if (assetBundleCollectorPackage != null)
{ {
YooAsset.Editor.AssetBundleCollectorSettingData.RemovePackage(assetBundleCollectorPackage); YooAsset.Editor.AssetBundleCollectorSettingData.RemovePackage(assetBundleCollectorPackage);
} }
string configPath = string configPath =
$"Assets/Domain/{BuildAssetWindow.GetBuildPackageName()}/Conf/HotfixMainResDomain.asset"; $"Assets/Domain/{BuildAssetWindow.GetBuildPackageName()}/Conf/HotfixMainResDomain.asset";
HotfixMainResDomain hotfixMainResDomain = AssetDatabase.LoadAssetAtPath<HotfixMainResDomain>(configPath); HotfixMainResDomain hotfixMainResDomain = AssetDatabase.LoadAssetAtPath<HotfixMainResDomain>(configPath);
packageName = hotfixMainResDomain.hotfixMainResDomainEntity.domain; packageName = hotfixMainResDomain.hotfixMainResDomainEntity.domain;
Mark(); Mark();
if(!BuildAssetWindow.GetBuildPackageName().Equals("Main")) if (!BuildAssetWindow.GetBuildPackageName().Equals("Main"))
CreateRes(packageName, CreateRes(packageName,
$"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes", $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes",
$"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/HotUpdate"); $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/HotUpdate");
else else
CreateRes(packageName, CreateRes(packageName,
$"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes", $"{DomainRoot}/{BuildAssetWindow.GetBuildPackageName()}/AddressableRes",

View File

@@ -1,6 +1,6 @@
{ {
"name": "com.staryevo.main", "name": "com.staryevo.main",
"version": "1.0.22", "version": "1.0.30",
"displayName": "00.StaryEvo", "displayName": "00.StaryEvo",
"description": "This is an Framework package", "description": "This is an Framework package",
"unity": "2021.3", "unity": "2021.3",

View File

@@ -26,6 +26,7 @@ namespace Stary.Evo.InformationSave
public abstract void Save(int index); public abstract void Save(int index);
public abstract void Switch(int index); public abstract void Switch(int index);
public virtual T GetTransform(string desc) public virtual T GetTransform(string desc)
{ {
int index = _list.FindIndex(n => n.desc == desc); int index = _list.FindIndex(n => n.desc == desc);
@@ -57,7 +58,12 @@ namespace Stary.Evo.InformationSave
//更新 //更新
public void UpdateInformation() public void UpdateInformation()
{ {
String sceneNmae = gameObject.scene.name; string guid = GetPrefabGUID(this.gameObject)+GetPrefabHierarchyPath(this.gameObject);
if (guid == "")
{
UnityEditor.EditorUtility.DisplayDialog("错误", "可能存在错误\n1、无法在prefab预览中修改数据\n2、新增加物体需先同步为prefab", "确定");
return;
}
ScriptObjectSave scriptObjectSaveData = Resources.Load<ScriptObjectSave>(path); ScriptObjectSave scriptObjectSaveData = Resources.Load<ScriptObjectSave>(path);
if (scriptObjectSaveData == null) if (scriptObjectSaveData == null)
{ {
@@ -65,14 +71,14 @@ namespace Stary.Evo.InformationSave
return; return;
} }
if (scriptObjectSaveData.dic.ContainsKey(sceneNmae + gameObject.name)) if (scriptObjectSaveData.dic.ContainsKey(guid))
{ {
_list.Clear(); _list.Clear();
_list = scriptObjectSaveData.dic[sceneNmae + gameObject.name].OfType<T>().ToList(); _list = scriptObjectSaveData.dic[guid].OfType<T>().ToList();
} }
else else
{ {
Debug.LogError("UnityEvo:ScriptObjectSaveData中未存储场景:"+ sceneNmae + " 中物体:" + gameObject.name + "的数据!!!"); Debug.LogError($"UnityEvo:ScriptObjectSaveData中未存储物体名为:{this.gameObject}\n guid为:{guid}的数据!!!");
} }
} }
@@ -80,49 +86,53 @@ namespace Stary.Evo.InformationSave
public bool PlayingSave() public bool PlayingSave()
{ {
//文件保存 //文件保存
if (Application.isEditor)
string guid = GetPrefabGUID(this.gameObject)+GetPrefabHierarchyPath(this.gameObject);
if (guid == "")
{ {
String sceneNmae = gameObject.scene.name; UnityEditor.EditorUtility.DisplayDialog("错误", "可能存在错误\n1、无法在prefab预览中修改数据\n2、新增加物体需先同步为prefab", "确定");
// 加载 ScriptObjectSaveData return false;
ScriptObjectSave scriptObjectSaveData = Resources.Load<ScriptObjectSave>(path); }
if(scriptObjectSaveData == null) // 加载 ScriptObjectSaveData
{ ScriptObjectSave scriptObjectSaveData = Resources.Load<ScriptObjectSave>(path);
scriptObjectSaveData = CheckAndCreateFoldersAndAsset(); if (scriptObjectSaveData == null)
//Debug.Log("创建了ScriptObjectSaveData文件"); {
} scriptObjectSaveData = CheckAndCreateFoldersAndAsset();
//Debug.Log("创建了ScriptObjectSaveData文件");
}
if (scriptObjectSaveData.dic == null) if (scriptObjectSaveData.dic == null)
{ {
Debug.LogError("UnityEvo:ScriptObjectSaveData的dic为空"); Debug.LogError("UnityEvo:ScriptObjectSaveData的dic为空");
return false; return false;
} }
// 检查是否已经存在相同的键 // 检查是否已经存在相同的键
if (scriptObjectSaveData.dic.ContainsKey(sceneNmae + gameObject.name)) if (scriptObjectSaveData.dic.ContainsKey(guid))
{
// 如果存在,选择是否替换原有的 List
if (UnityEditor.EditorUtility.DisplayDialog("提示",
$"数据集下已有相同名称的物体数据\n是否覆盖更新\n 物体名为:{this.gameObject}\n guid为:{guid}", "确定",
"取消"))
{ {
// 如果存在,选择是否替换原有的 List scriptObjectSaveData.dic[guid] = new List<InformationBase>(_list);
if (UnityEditor.EditorUtility.DisplayDialog("提示", "数据集下已有相同名称的物体数据\n是否覆盖更新\n" + "场景名:" + sceneNmae + "\n物体名" + gameObject.name, "确定", "取消"))
{
scriptObjectSaveData.dic[sceneNmae + gameObject.name] = new List<InformationBase>(_list);
}
else
{
return false;
}
} }
else else
{ {
// 如果不存在,添加新的键值对 return false;
scriptObjectSaveData.dic.Add(sceneNmae + gameObject.name, new List<InformationBase>(_list));
} }
AssetDatabase.SaveAssets(); }
EditorUtility.SetDirty(scriptObjectSaveData); else
AssetDatabase.Refresh(); {
// 如果不存在,添加新的键值对
return true; scriptObjectSaveData.dic.Add(guid, new List<InformationBase>(_list));
} }
return false; AssetDatabase.SaveAssets();
EditorUtility.SetDirty(scriptObjectSaveData);
AssetDatabase.Refresh();
return true;
} }
private ScriptObjectSave CheckAndCreateFoldersAndAsset() private ScriptObjectSave CheckAndCreateFoldersAndAsset()
@@ -148,17 +158,19 @@ namespace Stary.Evo.InformationSave
// 创建ScriptObjectSaveData.asset文件 // 创建ScriptObjectSaveData.asset文件
scriptableObject = ScriptableObject.CreateInstance<ScriptObjectSave>(); scriptableObject = ScriptableObject.CreateInstance<ScriptObjectSave>();
AssetDatabase.CreateAsset(scriptableObject, "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + ScriptObjectSaveDataFileName + ".asset"); AssetDatabase.CreateAsset(scriptableObject,
"Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" +
ScriptObjectSaveDataFileName + ".asset");
AssetDatabase.SaveAssets(); AssetDatabase.SaveAssets();
AssetDatabase.Refresh(); AssetDatabase.Refresh();
Debug.Log("UnityEvo:创建了: " + "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" + ScriptObjectSaveDataFileName + ".asset 资产"); Debug.Log("UnityEvo:创建了: " + "Assets/" + ResourcesFolderName + "/" + InformationSaveDataFolderName + "/" +
ScriptObjectSaveDataFileName + ".asset 资产");
return scriptableObject; return scriptableObject;
} }
//绘制 //绘制
public override void Draw() public override void Draw()
{ {
int length = _list.Count; int length = _list.Count;
int deleteIndex = -1; int deleteIndex = -1;
for (int i = 0; i < length; i++) for (int i = 0; i < length; i++)
@@ -209,6 +221,52 @@ namespace Stary.Evo.InformationSave
GUILayout.EndHorizontal(); GUILayout.EndHorizontal();
} }
private string GetCurrentGUID()
{
string assetPath = AssetDatabase.GetAssetPath(this);
if (!string.IsNullOrEmpty(assetPath))
{
return AssetDatabase.AssetPathToGUID(assetPath);
}
return string.Empty;
}
private string GetPrefabGUID(GameObject obj)
{
string assetPath = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(obj);
Debug.Log("UnityEvo:GetPrefabHierarchyPath:" + GetPrefabHierarchyPath(obj));
if (!string.IsNullOrEmpty(assetPath))
{
return AssetDatabase.AssetPathToGUID(assetPath);
}
return string.Empty;
}
private string GetPrefabHierarchyPath(GameObject obj)
{
var path = new System.Text.StringBuilder();
var current = obj.transform;
//检测该预制体是否是实例
var root = PrefabUtility.GetNearestPrefabInstanceRoot(obj);
if (root != null)
{
while (current != null && current != root.transform)
{
path.Insert(0, current.name);
path.Insert(0, "/");
current = current.parent;
}
return path.ToString();
}
return string.Empty;
}
#else #else
public override void Draw(){} public override void Draw(){}
@@ -217,6 +275,7 @@ namespace Stary.Evo.InformationSave
#endregion #endregion
[System.Serializable] [System.Serializable]
public class InformationBase public class InformationBase
{ {

View File

@@ -1,7 +1,7 @@
{ {
"name": "com.staryevo.informationsave", "name": "com.staryevo.informationsave",
"displayName": "02.InformationSave", "displayName": "02.InformationSave",
"version": "1.0.3", "version": "1.0.4",
"description": "位置配置工具", "description": "位置配置工具",
"unity": "2021.3", "unity": "2021.3",
"unityRelease": "30f1", "unityRelease": "30f1",