完善框架
This commit is contained in:
parent
eb38f67131
commit
9f3fe49d6a
@ -159,7 +159,7 @@ namespace BuildCli
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[MenuItem("Build/Build Test")]
|
[MenuItem("开发工具/Build/Build Test")]
|
||||||
public static void BuildAAA()
|
public static void BuildAAA()
|
||||||
{
|
{
|
||||||
string outPath = System.IO.Path.Combine(Application.dataPath, "../../bundles/");
|
string outPath = System.IO.Path.Combine(Application.dataPath, "../../bundles/");
|
||||||
@ -232,6 +232,7 @@ namespace BuildCli
|
|||||||
{
|
{
|
||||||
Directory.CreateDirectory(targetPath);
|
Directory.CreateDirectory(targetPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteFilesInDirectory(targetPath);
|
DeleteFilesInDirectory(targetPath);
|
||||||
|
|
||||||
CopyFiles(bundlePath, targetPath);
|
CopyFiles(bundlePath, targetPath);
|
||||||
|
|||||||
8
Client/Assets/Editor/PlayModePlus.meta
Normal file
8
Client/Assets/Editor/PlayModePlus.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b2046c8d71ec8bb4289cae8890231bc7
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
47
Client/Assets/Editor/PlayModePlus/BuildManager.cs
Normal file
47
Client/Assets/Editor/PlayModePlus/BuildManager.cs
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Presets;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace BuildCli
|
||||||
|
{
|
||||||
|
public class BuildManager
|
||||||
|
{
|
||||||
|
public Preset SelectedBuildPreset;
|
||||||
|
public Preset[] PlayerSettingsPresetsInProject;
|
||||||
|
|
||||||
|
public void OpenBuildWindow()
|
||||||
|
{
|
||||||
|
#if UNITY_6000_0_OR_NEWER
|
||||||
|
EditorApplication.ExecuteMenuItem("File/Build Profiles");
|
||||||
|
#else
|
||||||
|
var buildPlayerWindow = EditorWindow.GetWindow<BuildPlayerWindow>("Build Settings");
|
||||||
|
buildPlayerWindow.Show();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ApplyPreset(Preset preset)
|
||||||
|
{
|
||||||
|
var projectSettings = Resources.FindObjectsOfTypeAll<PlayerSettings>();
|
||||||
|
|
||||||
|
foreach (var settings in projectSettings)
|
||||||
|
{
|
||||||
|
preset.ApplyTo(settings);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<string> GenerateBuildSettingsList()
|
||||||
|
{
|
||||||
|
PlayerSettingsPresetsInProject = AssetDatabase.FindAssets("t:Preset")
|
||||||
|
.Select(AssetDatabase.GUIDToAssetPath)
|
||||||
|
.Where(path => path.Contains("PlayerSettings"))
|
||||||
|
.Select(AssetDatabase.LoadAssetAtPath<Preset>)
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
var buildPresetsList = new List<string>(PlayerSettingsPresetsInProject.Select(preset => preset.name));
|
||||||
|
|
||||||
|
return buildPresetsList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,5 @@
|
|||||||
fileFormatVersion: 2
|
fileFormatVersion: 2
|
||||||
guid: dea5e7b095c6d3b4ea334c381fcd16fb
|
guid: 3ad015755f8508d48ba8bca98199bf77
|
||||||
MonoImporter:
|
MonoImporter:
|
||||||
externalObjects: {}
|
externalObjects: {}
|
||||||
serializedVersion: 2
|
serializedVersion: 2
|
||||||
27
Client/Assets/Editor/PlayModePlus/CustomUnityToolbar.cs
Normal file
27
Client/Assets/Editor/PlayModePlus/CustomUnityToolbar.cs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace BuildCli
|
||||||
|
{
|
||||||
|
[InitializeOnLoad]
|
||||||
|
public static class CustomUnityToolbar
|
||||||
|
{
|
||||||
|
private static readonly List<Action> LeftToolbarGUI = new();
|
||||||
|
private static readonly List<Action> RightToolbarGUI = new();
|
||||||
|
|
||||||
|
static CustomUnityToolbar()
|
||||||
|
{
|
||||||
|
CustomUnityToolbarCallback.OnToolbarGUILeft = () => { DrawToolbar(LeftToolbarGUI); };
|
||||||
|
CustomUnityToolbarCallback.OnToolbarGUIRight = () => { DrawToolbar(RightToolbarGUI); };
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void DrawToolbar(List<Action> toolbarActions)
|
||||||
|
{
|
||||||
|
EditorGUILayout.BeginHorizontal();
|
||||||
|
foreach (var action in toolbarActions) action();
|
||||||
|
|
||||||
|
EditorGUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Client/Assets/Editor/PlayModePlus/CustomUnityToolbar.cs.meta
Normal file
11
Client/Assets/Editor/PlayModePlus/CustomUnityToolbar.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c6b91b4b79d447e419bcf0a0509b2a92
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
using System;
|
||||||
|
using System.Reflection;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace BuildCli
|
||||||
|
{
|
||||||
|
public static class CustomUnityToolbarCallback
|
||||||
|
{
|
||||||
|
private static readonly Type MToolbarType = typeof(UnityEditor.Editor).Assembly.GetType("UnityEditor.Toolbar");
|
||||||
|
|
||||||
|
private static ScriptableObject _mCurrentToolbar;
|
||||||
|
|
||||||
|
private static Action _onToolbarGUI;
|
||||||
|
public static Action OnToolbarGUILeft;
|
||||||
|
public static Action OnToolbarGUIRight;
|
||||||
|
|
||||||
|
static CustomUnityToolbarCallback()
|
||||||
|
{
|
||||||
|
EditorApplication.delayCall -= OnUpdate;
|
||||||
|
EditorApplication.delayCall += OnUpdate;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void OnUpdate()
|
||||||
|
{
|
||||||
|
if (_mCurrentToolbar != null) return;
|
||||||
|
var toolbars = Resources.FindObjectsOfTypeAll(MToolbarType);
|
||||||
|
_mCurrentToolbar = toolbars.Length > 0 ? (ScriptableObject) toolbars[0] : null;
|
||||||
|
|
||||||
|
if (_mCurrentToolbar == null) return;
|
||||||
|
var root = _mCurrentToolbar.GetType()
|
||||||
|
.GetField("m_Root", BindingFlags.NonPublic | BindingFlags.Instance);
|
||||||
|
var mRoot = root?.GetValue(_mCurrentToolbar) as VisualElement;
|
||||||
|
|
||||||
|
if (mRoot == null) return;
|
||||||
|
var playButton = mRoot.Q("Play");
|
||||||
|
var extendedPlayModeToolbar = new PlayModeToolbar();
|
||||||
|
mRoot.Q("ToolbarZoneRightAlign").Add(extendedPlayModeToolbar);
|
||||||
|
|
||||||
|
RegisterCallback("ToolbarZoneLeftAlign", OnToolbarGUILeft);
|
||||||
|
RegisterCallback("ToolbarZoneRightAlign", OnToolbarGUIRight);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RegisterCallback(string root, Action action)
|
||||||
|
{
|
||||||
|
var toolbarZone =
|
||||||
|
_mCurrentToolbar?.GetType().GetProperty(root)?.GetValue(_mCurrentToolbar) as VisualElement;
|
||||||
|
|
||||||
|
if (toolbarZone == null) return;
|
||||||
|
var container = new IMGUIContainer();
|
||||||
|
container.onGUIHandler = () => { action?.Invoke(); };
|
||||||
|
container.style.flexGrow = 1;
|
||||||
|
container.style.flexDirection = FlexDirection.Row;
|
||||||
|
toolbarZone.Add(container);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b47cc5ca0cc1d7a48906f362e261b472
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
22
Client/Assets/Editor/PlayModePlus/LICENSE.md
Normal file
22
Client/Assets/Editor/PlayModePlus/LICENSE.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Disillusion
|
||||||
|
Copyright (c) 2023-2024 TippingGame tippinggame@163.com
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
7
Client/Assets/Editor/PlayModePlus/LICENSE.md.meta
Normal file
7
Client/Assets/Editor/PlayModePlus/LICENSE.md.meta
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 8da90e55807a3d24bac1ac41360d16bd
|
||||||
|
TextScriptImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
89
Client/Assets/Editor/PlayModePlus/PlayModeManager.cs
Normal file
89
Client/Assets/Editor/PlayModePlus/PlayModeManager.cs
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.SceneManagement;
|
||||||
|
using UnityEngine;
|
||||||
|
using YooAsset;
|
||||||
|
|
||||||
|
namespace BuildCli
|
||||||
|
{
|
||||||
|
public class PlayModeManager
|
||||||
|
{
|
||||||
|
private string[] _playmodeSettings;
|
||||||
|
|
||||||
|
private Dictionary<string, EPlayMode> _resourceModeSettings = new Dictionary<string, EPlayMode>
|
||||||
|
{
|
||||||
|
{ "编辑器模式", EPlayMode.EditorSimulateMode },
|
||||||
|
{ "单机模式", EPlayMode.OfflinePlayMode },
|
||||||
|
{ "热更模式", EPlayMode.HostPlayMode },
|
||||||
|
};
|
||||||
|
|
||||||
|
private static string PrefsKey => Application.dataPath.GetHashCode() + "GamePlayMode";
|
||||||
|
|
||||||
|
public static void EditorStartScene() => EditorSceneManager.playModeStartScene = null;
|
||||||
|
|
||||||
|
public void PlayScene()
|
||||||
|
{
|
||||||
|
if (!EditorApplication.isPlaying)
|
||||||
|
{
|
||||||
|
EditorApplication.isPlaying = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
EditorApplication.isPlaying = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<string> GenerateResourceModeList()
|
||||||
|
{
|
||||||
|
return _resourceModeSettings.Keys.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void SetPlayMode(string value)
|
||||||
|
{
|
||||||
|
if (_resourceModeSettings.TryGetValue(value, out EPlayMode playMode))
|
||||||
|
{
|
||||||
|
EditorPrefs.SetInt(PrefsKey, (int)playMode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public int GetSelectPlayMode()
|
||||||
|
{
|
||||||
|
var selectIndex = EditorPrefs.GetInt(PrefsKey, -1);
|
||||||
|
if (selectIndex == -1)
|
||||||
|
{
|
||||||
|
selectIndex = (int)EPlayMode.EditorSimulateMode;
|
||||||
|
EditorPrefs.SetInt(PrefsKey, selectIndex);
|
||||||
|
}
|
||||||
|
return selectIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetSelectPlayModeValue()
|
||||||
|
{
|
||||||
|
var selectIndex = EditorPrefs.GetInt(PrefsKey, -1);
|
||||||
|
if (selectIndex == -1)
|
||||||
|
{
|
||||||
|
selectIndex = (int)EPlayMode.EditorSimulateMode;
|
||||||
|
EditorPrefs.SetInt(PrefsKey, selectIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
EPlayMode mode = (EPlayMode)selectIndex;
|
||||||
|
return mode.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List<string> GeneratePlayModeSettingsList()
|
||||||
|
{
|
||||||
|
_playmodeSettings = new[]
|
||||||
|
{
|
||||||
|
"Default (Reload Domain, Reload Scene)", "Disable Reload Domain", "Disable Reload Scene", "Disable All"
|
||||||
|
};
|
||||||
|
|
||||||
|
var playModeSettingsList = new List<string>(_playmodeSettings);
|
||||||
|
|
||||||
|
return playModeSettingsList;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b51aeed2989245259b93bddc8922b086
|
||||||
|
timeCreated: 1676311145
|
||||||
133
Client/Assets/Editor/PlayModePlus/PlayModePlus.uss
Normal file
133
Client/Assets/Editor/PlayModePlus/PlayModePlus.uss
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
.plus-button {
|
||||||
|
background-color: rgb(56, 56, 56);
|
||||||
|
border-top-left-radius: 5px;
|
||||||
|
border-bottom-left-radius: 5px;
|
||||||
|
border-color: rgba(56, 56, 56, 0);
|
||||||
|
border-width: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plus-button:hover {
|
||||||
|
background-color: rgb(75, 75, 75);
|
||||||
|
-unity-background-image-tint-color: rgb(255, 255, 255);
|
||||||
|
-unity-background-scale-mode: scale-to-fit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.plus-button:active {
|
||||||
|
background-color: rgb(0, 0, 0);
|
||||||
|
-unity-background-image-tint-color: rgb(89, 158, 94);
|
||||||
|
}
|
||||||
|
|
||||||
|
.unity-base-field {
|
||||||
|
width: 31px;
|
||||||
|
height: 100%;
|
||||||
|
background-image: none;
|
||||||
|
background-color: rgba(0, 0, 0, 0);
|
||||||
|
-unity-background-scale-mode: scale-to-fit;
|
||||||
|
justify-content: center;
|
||||||
|
margin-left: 0px;
|
||||||
|
margin-right: 1px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
border-top-width: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unity-base-field:hover .unity-base-popup-field__input {
|
||||||
|
background-color: rgb(75, 75, 75);
|
||||||
|
-unity-background-image-tint-color: rgb(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
.unity-base-field__input {
|
||||||
|
padding-bottom: 0px;
|
||||||
|
border-width: 0px;
|
||||||
|
border-top-width: 0px;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 100%;
|
||||||
|
-unity-background-scale-mode: scale-to-fit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unity-base-popup-field__input {
|
||||||
|
border-radius: 0px;
|
||||||
|
-unity-background-scale-mode: scale-to-fit;
|
||||||
|
border-top-width: 0px;
|
||||||
|
min-width: 31px;
|
||||||
|
background-color: rgb(56, 56, 56);
|
||||||
|
background-image: none;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scene-select-dropdown .unity-base-popup-field__input {
|
||||||
|
background-image: url('project://database/Packages/com.disillusion.play-mode-plus/Editor/Resources/com.disillusion.play-mode-plus/CustomDropdownArrow.png?fileID=2800000&guid=d56d19b3e6d0fc0419cda6972838d5ba&type=3#CustomDropdownArrow');
|
||||||
|
-unity-background-scale-mode: scale-to-fit;
|
||||||
|
width: 14px;
|
||||||
|
height: 21px;
|
||||||
|
margin-left: 0px;
|
||||||
|
margin-right: 0px;
|
||||||
|
margin-top: 0px;
|
||||||
|
margin-bottom: 0px;
|
||||||
|
justify-content: center;
|
||||||
|
padding-left: 0px;
|
||||||
|
padding-right: 0px;
|
||||||
|
padding-top: 0px;
|
||||||
|
padding-bottom: 0px;
|
||||||
|
border-top-right-radius: 5px;
|
||||||
|
border-bottom-right-radius: 5px;
|
||||||
|
border-top-left-radius: 5px;
|
||||||
|
border-bottom-left-radius: 5px;
|
||||||
|
border-color: rgba(56, 56, 56, 0);
|
||||||
|
border-width: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.play-mode-settings-dropdown .unity-base-popup-field__input {
|
||||||
|
background-image: url('project://database/Packages/com.disillusion.play-mode-plus/Editor/Resources/com.disillusion.play-mode-plus/CustomSceneCogButton.png?fileID=2800000&guid=b620a07f1fa7bf54b874f9661d2c6140&type=3#CustomSceneCogButton');
|
||||||
|
-unity-background-scale-mode: scale-to-fit;
|
||||||
|
border-color: rgba(56, 56, 56, 0);
|
||||||
|
border-width: 11px;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.build-settings-select-dropdown .unity-base-popup-field__input {
|
||||||
|
background-image: url('project://database/Packages/com.disillusion.play-mode-plus/Editor/Resources/com.disillusion.play-mode-plus/CustomDropdownArrow.png?fileID=2800000&guid=d56d19b3e6d0fc0419cda6972838d5ba&type=3#CustomDropdownArrow');
|
||||||
|
-unity-background-scale-mode: scale-to-fit;
|
||||||
|
width: auto;
|
||||||
|
height: 21px;
|
||||||
|
justify-content: center;
|
||||||
|
border-top-right-radius: 5px;
|
||||||
|
border-bottom-right-radius: 5px;
|
||||||
|
border-color: rgba(56, 56, 56, 0);
|
||||||
|
border-width: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dropdown-override {
|
||||||
|
border-top-right-radius: 5px;
|
||||||
|
border-bottom-right-radius: 5px;
|
||||||
|
border-color: rgba(56, 56, 56, 0);
|
||||||
|
border-width: 8px;
|
||||||
|
width: 6px;
|
||||||
|
margin-left: 9px;
|
||||||
|
margin-right: 12px;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unity-base-popup-field__input:hover {
|
||||||
|
background-color: rgb(75, 75, 75);
|
||||||
|
-unity-background-image-tint-color: rgb(255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
|
.unity-base-popup-field__arrow {
|
||||||
|
display: none;
|
||||||
|
border-top-right-radius: 5px;
|
||||||
|
border-bottom-right-radius: 5px;
|
||||||
|
border-color: rgba(56, 56, 56, 0);
|
||||||
|
border-width: 11px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.unity-base-popup-field__text {
|
||||||
|
display: none;
|
||||||
|
border-top-right-radius: 5px;
|
||||||
|
border-bottom-right-radius: 5px;
|
||||||
|
border-color: rgba(56, 56, 56, 0);
|
||||||
|
border-width: 11px;
|
||||||
|
}
|
||||||
11
Client/Assets/Editor/PlayModePlus/PlayModePlus.uss.meta
Normal file
11
Client/Assets/Editor/PlayModePlus/PlayModePlus.uss.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 88ed63fd5c4857c43a3dbb9672116bb3
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 12385, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
|
disableValidation: 0
|
||||||
122
Client/Assets/Editor/PlayModePlus/PlayModeToolbar.cs
Normal file
122
Client/Assets/Editor/PlayModePlus/PlayModeToolbar.cs
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
using YooAsset;
|
||||||
|
|
||||||
|
namespace BuildCli
|
||||||
|
{
|
||||||
|
public class PlayModeToolbar : VisualElement
|
||||||
|
{
|
||||||
|
private readonly PlayModeManager _playModeManager = new();
|
||||||
|
private readonly BuildManager _buildManager = new();
|
||||||
|
|
||||||
|
private readonly Button _buildButton;
|
||||||
|
private readonly DropdownField _selectSceneDropdown;
|
||||||
|
private readonly DropdownField _selectPlayModeSettingsDropdown;
|
||||||
|
private readonly DropdownField _selectPlayerSettingsPresetsDropdown;
|
||||||
|
|
||||||
|
public PlayModeToolbar()
|
||||||
|
{
|
||||||
|
#if UNITY_6000_0_OR_NEWER
|
||||||
|
var visualTree = Resources.Load<VisualTreeAsset>("com.disillusion.play-mode-plus/PlayModePlusToolbar6000");
|
||||||
|
#else
|
||||||
|
var visualTree = Resources.Load<VisualTreeAsset>("com.disillusion.play-mode-plus/PlayModePlusToolbar");
|
||||||
|
#endif
|
||||||
|
visualTree.CloneTree(this);
|
||||||
|
|
||||||
|
style.flexGrow = 1;
|
||||||
|
|
||||||
|
_buildButton = this.Q<Button>("build-button");
|
||||||
|
_buildButton.clicked -= OnBuildClicked;
|
||||||
|
_buildButton.clicked += OnBuildClicked;
|
||||||
|
|
||||||
|
|
||||||
|
#region Select Scene Dropdown
|
||||||
|
|
||||||
|
_selectSceneDropdown = this.Q<DropdownField>("select-scene-dropdown");
|
||||||
|
_selectSceneDropdown.RegisterCallback<FocusEvent>(evt =>
|
||||||
|
_selectSceneDropdown.choices = _playModeManager.GenerateResourceModeList());
|
||||||
|
_selectSceneDropdown.RegisterCallback<ChangeEvent<string>>(evt => { _playModeManager.SetPlayMode(evt.newValue); });
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Play Mode Settings Dropdown
|
||||||
|
|
||||||
|
_selectPlayModeSettingsDropdown = this.Q<DropdownField>("play-mode-settings-dropdown");
|
||||||
|
_selectPlayModeSettingsDropdown.RegisterCallback<FocusEvent>(evt =>
|
||||||
|
_selectSceneDropdown.choices = _playModeManager.GenerateResourceModeList());
|
||||||
|
_selectPlayModeSettingsDropdown.RegisterCallback<ChangeEvent<string>>(evt =>
|
||||||
|
{
|
||||||
|
var editorSettings = new SerializedObject(
|
||||||
|
AssetDatabase.LoadAssetAtPath("ProjectSettings/EditorSettings.asset", typeof(Object)));
|
||||||
|
var enterPlayModeOptionsEnabled =
|
||||||
|
editorSettings.FindProperty("m_EnterPlayModeOptionsEnabled");
|
||||||
|
var enterPlayModeOptions = editorSettings.FindProperty("m_EnterPlayModeOptions");
|
||||||
|
|
||||||
|
switch (_selectPlayModeSettingsDropdown.value)
|
||||||
|
{
|
||||||
|
case "Default (Reload Domain, Reload Scene":
|
||||||
|
enterPlayModeOptionsEnabled.boolValue = false;
|
||||||
|
enterPlayModeOptions.intValue = (int)EnterPlayModeOptions.None;
|
||||||
|
break;
|
||||||
|
case "Disable Reload Domain":
|
||||||
|
enterPlayModeOptionsEnabled.boolValue = true;
|
||||||
|
enterPlayModeOptions.intValue = (int)EnterPlayModeOptions.DisableDomainReload;
|
||||||
|
break;
|
||||||
|
case "Disable Reload Scene":
|
||||||
|
enterPlayModeOptionsEnabled.boolValue = true;
|
||||||
|
enterPlayModeOptions.intValue = (int)EnterPlayModeOptions.DisableSceneReload;
|
||||||
|
break;
|
||||||
|
case "Disable All":
|
||||||
|
enterPlayModeOptionsEnabled.boolValue = true;
|
||||||
|
enterPlayModeOptions.intValue |= (int)EnterPlayModeOptions.DisableDomainReload;
|
||||||
|
enterPlayModeOptions.intValue |= (int)EnterPlayModeOptions.DisableSceneReload;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
enterPlayModeOptionsEnabled.boolValue = false;
|
||||||
|
enterPlayModeOptions.intValue = (int)EnterPlayModeOptions.None;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
editorSettings.ApplyModifiedProperties();
|
||||||
|
EditorUtility.SetDirty(editorSettings.targetObject);
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
});
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region Build Settings Dropdown
|
||||||
|
|
||||||
|
_selectPlayerSettingsPresetsDropdown = this.Q<DropdownField>("build-settings-dropdown");
|
||||||
|
_selectPlayerSettingsPresetsDropdown.RegisterCallback<FocusEvent>(evt =>
|
||||||
|
_selectPlayerSettingsPresetsDropdown.choices = _buildManager.GenerateBuildSettingsList());
|
||||||
|
_selectPlayerSettingsPresetsDropdown.RegisterCallback<ChangeEvent<string>>(evt =>
|
||||||
|
{
|
||||||
|
_buildManager.SelectedBuildPreset =
|
||||||
|
_buildManager.PlayerSettingsPresetsInProject.FirstOrDefault(presets =>
|
||||||
|
presets.name == evt.newValue);
|
||||||
|
BuildManager.ApplyPreset(_buildManager.SelectedBuildPreset);
|
||||||
|
});
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
// Set the play mode scene for Default play button
|
||||||
|
PlayModeManager.EditorStartScene();
|
||||||
|
|
||||||
|
// Populate Dropdowns
|
||||||
|
_selectSceneDropdown.choices = _playModeManager.GenerateResourceModeList();
|
||||||
|
_selectPlayModeSettingsDropdown.choices = _playModeManager.GeneratePlayModeSettingsList();
|
||||||
|
_selectPlayerSettingsPresetsDropdown.choices = _buildManager.GenerateBuildSettingsList();
|
||||||
|
|
||||||
|
// Set Select Scene Dropdown value to Last Scene which was opened
|
||||||
|
_selectSceneDropdown.index = _playModeManager.GetSelectPlayMode();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
private void OnBuildClicked() => _buildManager.OpenBuildWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Client/Assets/Editor/PlayModePlus/PlayModeToolbar.cs.meta
Normal file
11
Client/Assets/Editor/PlayModePlus/PlayModeToolbar.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7a078af8bc2041c468308232d58846b5
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Assets/Editor/PlayModePlus/Resources.meta
Normal file
8
Client/Assets/Editor/PlayModePlus/Resources.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d1eb15f9bc309b6449e16be98bfb12fd
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 22d9cf2c9dbc41f4495ecf4e02a1c9c0
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 674 B |
@ -0,0 +1,183 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e663f57b9e7db7544b771960de59b03f
|
||||||
|
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
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMasterTextureLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 0
|
||||||
|
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
|
||||||
|
cookieLightType: 1
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: iPhone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Windows Store Apps
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: tvOS
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
spritePackingTag:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
pSDShowRemoveMatteOption: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 239 B |
@ -0,0 +1,183 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d56d19b3e6d0fc0419cda6972838d5ba
|
||||||
|
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
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMasterTextureLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 0
|
||||||
|
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
|
||||||
|
cookieLightType: 1
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: iPhone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Windows Store Apps
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: tvOS
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
spritePackingTag:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
pSDShowRemoveMatteOption: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 355 B |
@ -0,0 +1,183 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9f501d46ce416b04ab9b2795a65e9dbc
|
||||||
|
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
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMasterTextureLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 0
|
||||||
|
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
|
||||||
|
cookieLightType: 1
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: iPhone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Windows Store Apps
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: tvOS
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
spritePackingTag:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
pSDShowRemoveMatteOption: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 288 B |
@ -0,0 +1,183 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 403347ecfd3420b4fbd207759127cfe3
|
||||||
|
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
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMasterTextureLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 0
|
||||||
|
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
|
||||||
|
cookieLightType: 1
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: iPhone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Windows Store Apps
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: tvOS
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
spritePackingTag:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
pSDShowRemoveMatteOption: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 867 B |
@ -0,0 +1,183 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b620a07f1fa7bf54b874f9661d2c6140
|
||||||
|
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
|
||||||
|
isReadable: 0
|
||||||
|
streamingMipmaps: 0
|
||||||
|
streamingMipmapsPriority: 0
|
||||||
|
vTOnly: 0
|
||||||
|
ignoreMasterTextureLimit: 0
|
||||||
|
grayScaleToAlpha: 0
|
||||||
|
generateCubemap: 6
|
||||||
|
cubemapConvolution: 0
|
||||||
|
seamlessCubemap: 0
|
||||||
|
textureFormat: 1
|
||||||
|
maxTextureSize: 2048
|
||||||
|
textureSettings:
|
||||||
|
serializedVersion: 2
|
||||||
|
filterMode: 1
|
||||||
|
aniso: 1
|
||||||
|
mipBias: 0
|
||||||
|
wrapU: 1
|
||||||
|
wrapV: 1
|
||||||
|
wrapW: 0
|
||||||
|
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
|
||||||
|
cookieLightType: 1
|
||||||
|
platformSettings:
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: DefaultTexturePlatform
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
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
|
||||||
|
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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: iPhone
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 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
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: Windows Store Apps
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
- serializedVersion: 3
|
||||||
|
buildTarget: tvOS
|
||||||
|
maxTextureSize: 2048
|
||||||
|
resizeAlgorithm: 0
|
||||||
|
textureFormat: -1
|
||||||
|
textureCompression: 1
|
||||||
|
compressionQuality: 50
|
||||||
|
crunchedCompression: 0
|
||||||
|
allowsAlphaSplitting: 0
|
||||||
|
overridden: 0
|
||||||
|
androidETC2FallbackOverride: 0
|
||||||
|
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||||
|
spriteSheet:
|
||||||
|
serializedVersion: 2
|
||||||
|
sprites: []
|
||||||
|
outline: []
|
||||||
|
physicsShape: []
|
||||||
|
bones: []
|
||||||
|
spriteID: 5e97eb03825dee720800000000000000
|
||||||
|
internalID: 0
|
||||||
|
vertices: []
|
||||||
|
indices:
|
||||||
|
edges: []
|
||||||
|
weights: []
|
||||||
|
secondaryTextures: []
|
||||||
|
nameFileIdTable: {}
|
||||||
|
spritePackingTag:
|
||||||
|
pSDRemoveMatte: 0
|
||||||
|
pSDShowRemoveMatteOption: 0
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="True">
|
||||||
|
<Style src="project://database/Assets/Editor/PlayModePlus/PlayModePlus.uss?fileID=7433441132597879392&guid=88ed63fd5c4857c43a3dbb9672116bb3&type=3#PlayModePlus" />
|
||||||
|
<ui:VisualElement name="VisualElement" style="overflow: visible; flex-direction: row; align-items: center;">
|
||||||
|
<ui:DropdownField index="-1" name="select-scene-dropdown" tooltip="Select PlayMode Scene" class="scene-select-dropdown dropdown-override" style="top: 0; align-items: flex-start; -unity-slice-scale: 1px; background-position-y: center 0; background-position-x: center 0; justify-content: center; align-self: auto; align-content: flex-start; border-top-width: 0;" />
|
||||||
|
<ui:DropdownField index="-1" name="play-mode-settings-dropdown" tooltip="PlayMode Settings" class="play-mode-settings-dropdown" style="height: 22px; top: 0;" />
|
||||||
|
<ui:Button display-tooltip-when-elided="true" tooltip="Build" name="build-button" class="unity-toolbar-toogle plus-button" style="width: 31px; height: 21px; margin-left: 4px; margin-right: 1px; margin-top: 0; margin-bottom: 1px; padding-left: 0; padding-right: 0; padding-top: 0; padding-bottom: 0; background-image: url("project://database/Assets/Editor/PlayModePlus/Resources/com.disillusion.play-mode-plus/CustomBuildButtonOutlined.png?fileID=2800000&guid=e663f57b9e7db7544b771960de59b03f&type=3#CustomBuildButtonOutlined"); -unity-background-scale-mode: scale-to-fit; top: 0;" />
|
||||||
|
<ui:DropdownField index="-1" name="build-settings-dropdown" tooltip="Select Build Settings Preset" class="build-settings-select-dropdown dropdown-override" style="top: 0; align-items: flex-start; justify-content: center; align-content: flex-start; align-self: auto; border-top-width: 0;" />
|
||||||
|
</ui:VisualElement>
|
||||||
|
</ui:UXML>
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 272ada475cb34cb4eabd26fb225d13f5
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
@ -0,0 +1,9 @@
|
|||||||
|
<ui:UXML xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" xsi="http://www.w3.org/2001/XMLSchema-instance" engine="UnityEngine.UIElements" editor="UnityEditor.UIElements" noNamespaceSchemaLocation="../../../UIElementsSchema/UIElements.xsd" editor-extension-mode="True">
|
||||||
|
<Style src="project://database/Assets/Editor/PlayModePlus/PlayModePlus.uss?fileID=7433441132597879392&guid=88ed63fd5c4857c43a3dbb9672116bb3&type=3#PlayModePlus" />
|
||||||
|
<ui:VisualElement name="VisualElement" style="overflow: visible; flex-direction: row; align-items: center;">
|
||||||
|
<ui:DropdownField index="-1" name="select-scene-dropdown" tooltip="Select PlayMode Scene" class="scene-select-dropdown dropdown-override" style="top: 0; align-items: flex-start; -unity-slice-scale: 1px; background-position-y: center 0; background-position-x: center 0; justify-content: center; align-self: auto; align-content: flex-start;" />
|
||||||
|
<ui:DropdownField index="-1" name="play-mode-settings-dropdown" tooltip="PlayMode Settings" class="play-mode-settings-dropdown" style="height: 22px; top: 0;" />
|
||||||
|
<ui:Button display-tooltip-when-elided="true" tooltip="Build" name="build-button" class="unity-toolbar-toogle plus-button" style="width: 31px; height: 21px; margin-left: 4px; margin-right: 1px; margin-top: 0; margin-bottom: 1px; padding-left: 0; padding-right: 0; padding-top: 0; padding-bottom: 0; background-image: url("project://database/Assets/Editor/PlayModePlus/Resources/com.disillusion.play-mode-plus/CustomBuildButtonOutlined.png?fileID=2800000&guid=e663f57b9e7db7544b771960de59b03f&type=3#CustomBuildButtonOutlined"); -unity-background-scale-mode: scale-to-fit; top: 0;" />
|
||||||
|
<ui:DropdownField index="-1" name="build-settings-dropdown" tooltip="Select Build Settings Preset" class="build-settings-select-dropdown dropdown-override" style="top: 0; align-items: flex-start; justify-content: center; align-content: flex-start; align-self: auto;" />
|
||||||
|
</ui:VisualElement>
|
||||||
|
</ui:UXML>
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 20cdb8c96ae40c34b90f6be123593c91
|
||||||
|
ScriptedImporter:
|
||||||
|
internalIDToNameTable: []
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
|
script: {fileID: 13804, guid: 0000000000000000e000000000000000, type: 0}
|
||||||
8
Client/Assets/Editor/Postprocessor.meta
Normal file
8
Client/Assets/Editor/Postprocessor.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 303c55325c569f8419d1aa6dc00b02be
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
549
Client/Assets/Editor/Postprocessor/SpritePostprocessor.cs
Normal file
549
Client/Assets/Editor/Postprocessor/SpritePostprocessor.cs
Normal file
@ -0,0 +1,549 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.U2D;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.U2D;
|
||||||
|
using Object = UnityEngine.Object;
|
||||||
|
|
||||||
|
namespace GameFramework.Editor
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 图集导入管线。
|
||||||
|
/// </summary>
|
||||||
|
public class SpritePostprocessor : AssetPostprocessor
|
||||||
|
{
|
||||||
|
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
|
||||||
|
{
|
||||||
|
foreach (var s in importedAssets)
|
||||||
|
{
|
||||||
|
EditorSpriteSaveInfo.OnImportSprite(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var s in deletedAssets)
|
||||||
|
{
|
||||||
|
EditorSpriteSaveInfo.OnDeleteSprite(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var s in movedFromAssetPaths)
|
||||||
|
{
|
||||||
|
EditorSpriteSaveInfo.OnDeleteSprite(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var s in movedAssets)
|
||||||
|
{
|
||||||
|
EditorSpriteSaveInfo.OnImportSprite(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class EditorSpriteSaveInfo
|
||||||
|
{
|
||||||
|
private const string NormalAtlasDir = "Assets/AssetArt/Atlas";
|
||||||
|
private const string UISpritePath = "Assets/AssetRaw/UIRaw";
|
||||||
|
private const string UIAtlasPath = "Assets/AssetRaw/UIRaw/Atlas";
|
||||||
|
private static readonly List<string> _dirtyAtlasList = new List<string>();
|
||||||
|
private static readonly Dictionary<string, List<string>> _allASprites = new Dictionary<string, List<string>>();
|
||||||
|
|
||||||
|
private static readonly Dictionary<string, string> _uiAtlasMap = new Dictionary<string, string>();
|
||||||
|
private static bool _isInit = false;
|
||||||
|
private static bool m_dirty = false;
|
||||||
|
|
||||||
|
public static void Init()
|
||||||
|
{
|
||||||
|
if (_isInit)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorApplication.update += CheckDirty;
|
||||||
|
|
||||||
|
//读取所有图集信息
|
||||||
|
string[] findAssets = AssetDatabase.FindAssets("t:SpriteAtlas", new[] { NormalAtlasDir });
|
||||||
|
foreach (var findAsset in findAssets)
|
||||||
|
{
|
||||||
|
var path = AssetDatabase.GUIDToAssetPath(findAsset);
|
||||||
|
SpriteAtlas sa = AssetDatabase.LoadAssetAtPath(path, typeof(SpriteAtlas)) as SpriteAtlas;
|
||||||
|
if (sa == null)
|
||||||
|
{
|
||||||
|
Debug.LogError($"加载图集数据{path}失败");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string atlasName = Path.GetFileNameWithoutExtension(path);
|
||||||
|
var objects = sa.GetPackables();
|
||||||
|
foreach (var o in objects)
|
||||||
|
{
|
||||||
|
if (!_allASprites.TryGetValue(atlasName, out var list))
|
||||||
|
{
|
||||||
|
list = new List<string>();
|
||||||
|
_allASprites.Add(atlasName, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.Add(AssetDatabase.GetAssetPath(o));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_isInit = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void CheckDirty()
|
||||||
|
{
|
||||||
|
if (m_dirty)
|
||||||
|
{
|
||||||
|
m_dirty = false;
|
||||||
|
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
float lastProgress = -1;
|
||||||
|
for (int i = 0; i < _dirtyAtlasList.Count; i++)
|
||||||
|
{
|
||||||
|
string atlasName = _dirtyAtlasList[i];
|
||||||
|
Debug.Log("更新图集 : " + atlasName);
|
||||||
|
var curProgress = (float)i / _dirtyAtlasList.Count;
|
||||||
|
if (curProgress > lastProgress + 0.01f)
|
||||||
|
{
|
||||||
|
lastProgress = curProgress;
|
||||||
|
var progressText = $"当前进度:{i}/{_dirtyAtlasList.Count} {atlasName}";
|
||||||
|
bool cancel = EditorUtility.DisplayCancelableProgressBar("刷新图集" + atlasName, progressText, curProgress);
|
||||||
|
if (cancel)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isUI = atlasName.StartsWith("UIRaw");
|
||||||
|
SaveAtlas(atlasName, isUI);
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorUtility.ClearProgressBar();
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
_dirtyAtlasList.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnImportSprite(string assetPath)
|
||||||
|
{
|
||||||
|
if (!assetPath.StartsWith(UISpritePath))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TextureImporter ti = AssetImporter.GetAtPath(assetPath) as TextureImporter;
|
||||||
|
|
||||||
|
if (ti != null)
|
||||||
|
{
|
||||||
|
var modify = false;
|
||||||
|
|
||||||
|
if (assetPath.StartsWith(UISpritePath))
|
||||||
|
{
|
||||||
|
if (ti.textureType != TextureImporterType.Sprite)
|
||||||
|
{
|
||||||
|
ti.textureType = TextureImporterType.Sprite;
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(ti.spritePackingTag))
|
||||||
|
{
|
||||||
|
ti.spritePackingTag = string.Empty;
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var setting = new TextureImporterSettings();
|
||||||
|
ti.ReadTextureSettings(setting);
|
||||||
|
if (setting.spriteGenerateFallbackPhysicsShape)
|
||||||
|
{
|
||||||
|
setting.spriteGenerateFallbackPhysicsShape = false;
|
||||||
|
ti.SetTextureSettings(setting);
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsKeepRawImage(assetPath))
|
||||||
|
{
|
||||||
|
//调整android格式
|
||||||
|
var andPlatformSettings = ti.GetPlatformTextureSettings("Android");
|
||||||
|
if (!andPlatformSettings.overridden)
|
||||||
|
{
|
||||||
|
andPlatformSettings.overridden = true;
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (andPlatformSettings.format != TextureImporterFormat.ASTC_6x6)
|
||||||
|
{
|
||||||
|
andPlatformSettings.format = TextureImporterFormat.ASTC_6x6;
|
||||||
|
andPlatformSettings.compressionQuality = 50;
|
||||||
|
ti.SetPlatformTextureSettings(andPlatformSettings);
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//调整ios格式
|
||||||
|
var iosPlatformSettings = ti.GetPlatformTextureSettings("iPhone");
|
||||||
|
if (!iosPlatformSettings.overridden)
|
||||||
|
{
|
||||||
|
iosPlatformSettings.overridden = true;
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iosPlatformSettings.format != TextureImporterFormat.ASTC_5x5)
|
||||||
|
{
|
||||||
|
iosPlatformSettings.format = TextureImporterFormat.ASTC_5x5;
|
||||||
|
iosPlatformSettings.compressionQuality = 50;
|
||||||
|
ti.SetPlatformTextureSettings(iosPlatformSettings);
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//调整WebGL格式
|
||||||
|
var webglSettings = ti.GetPlatformTextureSettings("WebGL");
|
||||||
|
if (!webglSettings.overridden)
|
||||||
|
{
|
||||||
|
webglSettings.overridden = true;
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (webglSettings.format != TextureImporterFormat.ASTC_6x6)
|
||||||
|
{
|
||||||
|
webglSettings.format = TextureImporterFormat.ASTC_6x6;
|
||||||
|
webglSettings.compressionQuality = 50;
|
||||||
|
ti.SetPlatformTextureSettings(webglSettings);
|
||||||
|
modify = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (modify)
|
||||||
|
{
|
||||||
|
ti.SaveAndReimport();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ti.textureType == TextureImporterType.Sprite)
|
||||||
|
{
|
||||||
|
OnProcessSprite(assetPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否保持散图(不打图集)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="dirPath"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool IsKeepRawImage(string dirPath)
|
||||||
|
{
|
||||||
|
return dirPath.Contains("UIRaw/Raw/") || dirPath.Contains("UIRaw_Raw_");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static string GetSpritePath(string assetPath)
|
||||||
|
{
|
||||||
|
string path = assetPath.Substring(0, assetPath.LastIndexOf(".", StringComparison.Ordinal));
|
||||||
|
path = path.Replace("Assets/AssetRaw/", "");
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 根据文件路径,返回图集名称
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="fullName"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string GetPackageTag(string fullName)
|
||||||
|
{
|
||||||
|
fullName = fullName.Replace("\\", "/");
|
||||||
|
int idx = fullName.LastIndexOf("UIRaw", StringComparison.Ordinal);
|
||||||
|
if (idx == -1)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (IsKeepRawImage(fullName))
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
|
var atlasPath = fullName.Substring(idx);
|
||||||
|
string str = atlasPath;
|
||||||
|
str = str.Substring(0, str.LastIndexOf("/", StringComparison.Ordinal)).Replace("/", "_");
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnProcessSprite(string assetPath)
|
||||||
|
{
|
||||||
|
if (!assetPath.StartsWith("Assets"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assetPath.StartsWith("Assets/UIRaw_Delete"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Init();
|
||||||
|
|
||||||
|
var spriteName = Path.GetFileNameWithoutExtension(assetPath);
|
||||||
|
var spritePath = GetSpritePath(assetPath);
|
||||||
|
if (!_uiAtlasMap.TryGetValue(spriteName, out string oldAssetPath) || spritePath == oldAssetPath)
|
||||||
|
{
|
||||||
|
_uiAtlasMap[spriteName] = spritePath;
|
||||||
|
m_dirty = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError($"有重名的图片:{spriteName}\n旧图集:{oldAssetPath}\n新图集:{spritePath} ");
|
||||||
|
_uiAtlasMap[spriteName] = spritePath;
|
||||||
|
m_dirty = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
string atlasName = GetPackageTag(assetPath);
|
||||||
|
if (string.IsNullOrEmpty(atlasName))
|
||||||
|
{
|
||||||
|
bool keepRaw = IsKeepRawImage(assetPath);
|
||||||
|
if (!keepRaw)
|
||||||
|
{
|
||||||
|
Debug.LogError($"empty packingTag of asset :{assetPath} !!!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
List<string> ret;
|
||||||
|
if (!_allASprites.TryGetValue(atlasName, out ret))
|
||||||
|
{
|
||||||
|
ret = new List<string>();
|
||||||
|
_allASprites.Add(atlasName, ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ret.Contains(assetPath))
|
||||||
|
{
|
||||||
|
ret.Add(assetPath);
|
||||||
|
m_dirty = true;
|
||||||
|
if (!_dirtyAtlasList.Contains(atlasName))
|
||||||
|
{
|
||||||
|
_dirtyAtlasList.Add(atlasName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void OnDeleteSprite(string assetPath)
|
||||||
|
{
|
||||||
|
if (assetPath.StartsWith("Assets/UIRaw_Delete"))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!assetPath.StartsWith(UISpritePath))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Init();
|
||||||
|
string atlasName = GetPackageTag(assetPath);
|
||||||
|
if (!_allASprites.TryGetValue(atlasName, out var ret))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//改成文件名的匹配
|
||||||
|
if (!ret.Exists(s => Path.GetFileName(s) == Path.GetFileName(assetPath)))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (assetPath.StartsWith(UISpritePath))
|
||||||
|
{
|
||||||
|
var spriteName = Path.GetFileNameWithoutExtension(assetPath);
|
||||||
|
if (_uiAtlasMap.ContainsKey(spriteName))
|
||||||
|
{
|
||||||
|
_uiAtlasMap.Remove(spriteName);
|
||||||
|
m_dirty = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ret.Remove(assetPath);
|
||||||
|
m_dirty = true;
|
||||||
|
if (!_dirtyAtlasList.Contains(atlasName))
|
||||||
|
{
|
||||||
|
_dirtyAtlasList.Add(atlasName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region 更新图集
|
||||||
|
|
||||||
|
public static void SaveAtlas(string atlasName, bool isUI)
|
||||||
|
{
|
||||||
|
List<Object> spriteList = new List<Object>();
|
||||||
|
if (_allASprites.TryGetValue(atlasName, out var list))
|
||||||
|
{
|
||||||
|
list.Sort(StringComparer.Ordinal);
|
||||||
|
|
||||||
|
foreach (var s in list)
|
||||||
|
{
|
||||||
|
var sprite = AssetDatabase.LoadAssetAtPath<Sprite>(s);
|
||||||
|
if (sprite != null)
|
||||||
|
{
|
||||||
|
spriteList.Add(sprite);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var path = $"{NormalAtlasDir}/{atlasName}.spriteatlas";
|
||||||
|
|
||||||
|
if (spriteList.Count == 0)
|
||||||
|
{
|
||||||
|
if (File.Exists(path))
|
||||||
|
{
|
||||||
|
AssetDatabase.DeleteAsset(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var atlas = new SpriteAtlas();
|
||||||
|
// var atlas = new SpriteAtlasAsset();
|
||||||
|
var setting = new SpriteAtlasPackingSettings
|
||||||
|
{
|
||||||
|
blockOffset = 1,
|
||||||
|
padding = 2,
|
||||||
|
enableRotation = true
|
||||||
|
};
|
||||||
|
|
||||||
|
bool isOpaque = atlasName.Contains("Opaque");
|
||||||
|
|
||||||
|
var textureSetting = new SpriteAtlasTextureSettings
|
||||||
|
{
|
||||||
|
generateMipMaps = false,
|
||||||
|
sRGB = true,
|
||||||
|
filterMode = FilterMode.Bilinear
|
||||||
|
};
|
||||||
|
atlas.SetTextureSettings(textureSetting);
|
||||||
|
|
||||||
|
var iphonePlatformSetting = atlas.GetPlatformSettings("iPhone");
|
||||||
|
if (!iphonePlatformSetting.overridden)
|
||||||
|
{
|
||||||
|
iphonePlatformSetting.overridden = true;
|
||||||
|
iphonePlatformSetting.format = TextureImporterFormat.ASTC_5x5;
|
||||||
|
iphonePlatformSetting.compressionQuality = 100;
|
||||||
|
atlas.SetPlatformSettings(iphonePlatformSetting);
|
||||||
|
}
|
||||||
|
|
||||||
|
var androidPlatformSetting = atlas.GetPlatformSettings("Android");
|
||||||
|
if (!androidPlatformSetting.overridden)
|
||||||
|
{
|
||||||
|
androidPlatformSetting.overridden = true;
|
||||||
|
androidPlatformSetting.format = TextureImporterFormat.ASTC_6x6;
|
||||||
|
androidPlatformSetting.compressionQuality = 100;
|
||||||
|
atlas.SetPlatformSettings(androidPlatformSetting);
|
||||||
|
}
|
||||||
|
|
||||||
|
var webglSettings = atlas.GetPlatformSettings("WebGL");
|
||||||
|
if (!webglSettings.overridden)
|
||||||
|
{
|
||||||
|
webglSettings.overridden = true;
|
||||||
|
webglSettings.format = TextureImporterFormat.ASTC_6x6;
|
||||||
|
webglSettings.compressionQuality = 50;
|
||||||
|
atlas.SetPlatformSettings(webglSettings);
|
||||||
|
}
|
||||||
|
|
||||||
|
atlas.SetPackingSettings(setting);
|
||||||
|
atlas.Add(spriteList.ToArray());
|
||||||
|
|
||||||
|
AssetDatabase.CreateAsset(atlas, path);
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 重新生成图集
|
||||||
|
|
||||||
|
private static readonly Dictionary<string, List<string>> m_tempAllASprites = new Dictionary<string, List<string>>();
|
||||||
|
|
||||||
|
[MenuItem("开发工具/Atlas/重新生成UI图集", false, 90)]
|
||||||
|
static void ForceGenAtlas()
|
||||||
|
{
|
||||||
|
Init();
|
||||||
|
List<string> needSaveAtlas = new List<string>();
|
||||||
|
m_tempAllASprites.Clear();
|
||||||
|
_allASprites.Clear();
|
||||||
|
var findAssets = AssetDatabase.FindAssets("t:sprite", new[] { UIAtlasPath });
|
||||||
|
foreach (var findAsset in findAssets)
|
||||||
|
{
|
||||||
|
var path = AssetDatabase.GUIDToAssetPath(findAsset);
|
||||||
|
var atlasName = GetPackageTag(path);
|
||||||
|
if (!m_tempAllASprites.TryGetValue(atlasName, out var spriteList))
|
||||||
|
{
|
||||||
|
spriteList = new List<string>();
|
||||||
|
m_tempAllASprites[atlasName] = spriteList;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!spriteList.Contains(path))
|
||||||
|
{
|
||||||
|
spriteList.Add(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//有变化的才刷
|
||||||
|
var iter = m_tempAllASprites.GetEnumerator();
|
||||||
|
while (iter.MoveNext())
|
||||||
|
{
|
||||||
|
bool needSave = false;
|
||||||
|
var atlasName = iter.Current.Key;
|
||||||
|
var newSpritesList = iter.Current.Value;
|
||||||
|
|
||||||
|
if (_allASprites.TryGetValue(atlasName, out var existSprites))
|
||||||
|
{
|
||||||
|
if (existSprites.Count != newSpritesList.Count)
|
||||||
|
{
|
||||||
|
needSave = true;
|
||||||
|
existSprites.Clear();
|
||||||
|
existSprites.AddRange(newSpritesList);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (int i = 0; i < newSpritesList.Count; i++)
|
||||||
|
{
|
||||||
|
if (!existSprites.Contains(newSpritesList[i]))
|
||||||
|
{
|
||||||
|
needSave = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needSave)
|
||||||
|
{
|
||||||
|
existSprites.Clear();
|
||||||
|
existSprites.AddRange(newSpritesList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
needSave = true;
|
||||||
|
_allASprites.Add(atlasName, new List<string>(newSpritesList));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (needSave && !needSaveAtlas.Contains(atlasName))
|
||||||
|
{
|
||||||
|
needSaveAtlas.Add(atlasName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
iter.Dispose();
|
||||||
|
foreach (var atlas in needSaveAtlas)
|
||||||
|
{
|
||||||
|
Debug.LogFormat("Gen atlas:{0}", atlas);
|
||||||
|
SaveAtlas(atlas, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
|
||||||
|
SpriteAtlasUtility.PackAllAtlases(EditorUserBuildSettings.activeBuildTarget);
|
||||||
|
Debug.Log("Gen end");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 693ec7e51f3eb9642b1e4c8f9ca4b6ed
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Assets/Editor/Tools.meta
Normal file
8
Client/Assets/Editor/Tools.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 74a281eb7e99e984f80c7681c4a0723f
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
56
Client/Assets/Editor/Tools/GameEditorPrefs.cs
Normal file
56
Client/Assets/Editor/Tools/GameEditorPrefs.cs
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace BuildCli
|
||||||
|
{
|
||||||
|
public class GameEditorPrefs
|
||||||
|
{
|
||||||
|
// 获取 EditorPrefs 中的字符串
|
||||||
|
public static string GetString(string key, string value = default)
|
||||||
|
{
|
||||||
|
return EditorPrefs.GetString(Application.dataPath.GetHashCode() + key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置 EditorPrefs 中的字符串
|
||||||
|
public static void SetString(string key, string value)
|
||||||
|
{
|
||||||
|
EditorPrefs.SetString(Application.dataPath.GetHashCode() + key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取 EditorPrefs 中的布尔值
|
||||||
|
public static bool GetBool(string key, bool defaultValue = default)
|
||||||
|
{
|
||||||
|
return EditorPrefs.GetBool(Application.dataPath.GetHashCode() + key, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置 EditorPrefs 中的布尔值
|
||||||
|
public static void SetBool(string key, bool value)
|
||||||
|
{
|
||||||
|
EditorPrefs.SetBool(Application.dataPath.GetHashCode() + key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取 EditorPrefs 中的整数值
|
||||||
|
public static int GetInt(string key, int defaultValue = default)
|
||||||
|
{
|
||||||
|
return EditorPrefs.GetInt(Application.dataPath.GetHashCode() + key, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置 EditorPrefs 中的整数值
|
||||||
|
public static void SetInt(string key, int value)
|
||||||
|
{
|
||||||
|
EditorPrefs.SetInt(Application.dataPath.GetHashCode() + key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取 EditorPrefs 中的浮点值
|
||||||
|
public static float GetFloat(string key, float defaultValue = default)
|
||||||
|
{
|
||||||
|
return EditorPrefs.GetFloat(Application.dataPath.GetHashCode() + key, defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置 EditorPrefs 中的浮点值
|
||||||
|
public static void SetFloat(string key, float value)
|
||||||
|
{
|
||||||
|
EditorPrefs.SetFloat(Application.dataPath.GetHashCode() + key, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Client/Assets/Editor/Tools/GameEditorPrefs.cs.meta
Normal file
11
Client/Assets/Editor/Tools/GameEditorPrefs.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 39a488e91379e994ab6a3c708804874e
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
70
Client/Assets/Editor/Tools/ScreenShotWindow.cs
Normal file
70
Client/Assets/Editor/Tools/ScreenShotWindow.cs
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
using UnityEngine;
|
||||||
|
using UnityEditor;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace BuildCli
|
||||||
|
{
|
||||||
|
public class CaptureWindow : EditorWindow
|
||||||
|
{
|
||||||
|
private string saveFileName = string.Empty;
|
||||||
|
private string saveDirPathKey = "CaptureSaveDirPathKey";
|
||||||
|
|
||||||
|
[UnityEditor.MenuItem("开发工具/截图工具", false, 102)]
|
||||||
|
private static void Capture()
|
||||||
|
{
|
||||||
|
if (HasOpenInstances<CaptureWindow>())
|
||||||
|
{
|
||||||
|
EditorWindow.GetWindow<CaptureWindow>("截图工具").Close();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
EditorWindow.GetWindow<CaptureWindow>("截图工具");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnGUI()
|
||||||
|
{
|
||||||
|
string buildPath = GameEditorPrefs.GetString(saveDirPathKey, Application.dataPath);
|
||||||
|
EditorGUILayout.LabelField("输出目录 : ");
|
||||||
|
EditorGUILayout.LabelField(buildPath);
|
||||||
|
|
||||||
|
if (GUILayout.Button("选择目录"))
|
||||||
|
{
|
||||||
|
string path = EditorUtility.OpenFolderPanel("选择目录", buildPath, Application.dataPath);
|
||||||
|
if (!string.IsNullOrEmpty(path))
|
||||||
|
{
|
||||||
|
GameEditorPrefs.SetString(saveDirPathKey, path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GUILayout.Button("打开目录"))
|
||||||
|
{
|
||||||
|
string openPath = GameEditorPrefs.GetString(saveDirPathKey, Application.dataPath);
|
||||||
|
System.Diagnostics.Process.Start(openPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// insert blank line
|
||||||
|
GUILayout.Label("");
|
||||||
|
|
||||||
|
if (GUILayout.Button("截图"))
|
||||||
|
{
|
||||||
|
var resolution = GetMainGameViewSize();
|
||||||
|
int x = (int)resolution.x;
|
||||||
|
int y = (int)resolution.y;
|
||||||
|
Debug.Log(buildPath);
|
||||||
|
var outputPath = buildPath + "/" + DateTime.Now.ToString($"{x}x{y}_yyyy_MM_dd_HH_mm_ss") + ".png";
|
||||||
|
ScreenCapture.CaptureScreenshot(outputPath);
|
||||||
|
Debug.Log("保存路径:" + outputPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Vector2 GetMainGameViewSize()
|
||||||
|
{
|
||||||
|
System.Type T = System.Type.GetType("UnityEditor.GameView,UnityEditor");
|
||||||
|
System.Reflection.MethodInfo GetSizeOfMainGameView = T.GetMethod("GetSizeOfMainGameView",
|
||||||
|
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
|
||||||
|
System.Object Res = GetSizeOfMainGameView.Invoke(null, null);
|
||||||
|
return (Vector2)Res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Client/Assets/Editor/Tools/ScreenShotWindow.cs.meta
Normal file
11
Client/Assets/Editor/Tools/ScreenShotWindow.cs.meta
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 67a283ae94bfe264683f4911572f5533
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -308,6 +308,52 @@ MonoBehaviour:
|
|||||||
componentType:
|
componentType:
|
||||||
m_CheckCanReleaseInterval: 30
|
m_CheckCanReleaseInterval: 30
|
||||||
m_AutoReleaseInterval: 60
|
m_AutoReleaseInterval: 60
|
||||||
|
--- !u!1 &354344801
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 354344802}
|
||||||
|
- component: {fileID: 354344803}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: UI
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &354344802
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 354344801}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 1455375114}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &354344803
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 354344801}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 028204b1d2277bd4782816ee91aeed81, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
componentType: AlicizaX.UI.Runtime.UIManager
|
||||||
|
uiRoot: {fileID: 4612363183729467837, guid: 9368ff38b2090b2468f8358242026e4b, type: 3}
|
||||||
--- !u!1 &539295520
|
--- !u!1 &539295520
|
||||||
GameObject:
|
GameObject:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
@ -446,6 +492,7 @@ MonoBehaviour:
|
|||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
componentType: AlicizaX.Procedure.Runtime.ProcedureManager
|
componentType: AlicizaX.Procedure.Runtime.ProcedureManager
|
||||||
m_AvailableProcedureTypeNames:
|
m_AvailableProcedureTypeNames:
|
||||||
|
- Unity.Startup.Procedure.ProcedureClearCache
|
||||||
- Unity.Startup.Procedure.ProcedureCreateDownloader
|
- Unity.Startup.Procedure.ProcedureCreateDownloader
|
||||||
- Unity.Startup.Procedure.ProcedureDownloadWebFiles
|
- Unity.Startup.Procedure.ProcedureDownloadWebFiles
|
||||||
- Unity.Startup.Procedure.ProcedureGameLauncherState
|
- Unity.Startup.Procedure.ProcedureGameLauncherState
|
||||||
@ -752,7 +799,6 @@ Transform:
|
|||||||
m_LocalScale: {x: 1, y: 1, z: 1}
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
m_ConstrainProportionsScale: 0
|
m_ConstrainProportionsScale: 0
|
||||||
m_Children:
|
m_Children:
|
||||||
- {fileID: 2081231531}
|
|
||||||
- {fileID: 2121063206}
|
- {fileID: 2121063206}
|
||||||
- {fileID: 2066725839}
|
- {fileID: 2066725839}
|
||||||
- {fileID: 804333830}
|
- {fileID: 804333830}
|
||||||
@ -766,6 +812,8 @@ Transform:
|
|||||||
- {fileID: 2030429591}
|
- {fileID: 2030429591}
|
||||||
- {fileID: 965054550}
|
- {fileID: 965054550}
|
||||||
- {fileID: 559090127}
|
- {fileID: 559090127}
|
||||||
|
- {fileID: 2081231531}
|
||||||
|
- {fileID: 354344802}
|
||||||
m_Father: {fileID: 0}
|
m_Father: {fileID: 0}
|
||||||
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
--- !u!114 &1455375115
|
--- !u!114 &1455375115
|
||||||
|
|||||||
@ -19,7 +19,6 @@ namespace GameLogic
|
|||||||
public static void Entrance(object[] objects)
|
public static void Entrance(object[] objects)
|
||||||
{
|
{
|
||||||
Log.Info("HotFix Logic Entry!");
|
Log.Info("HotFix Logic Entry!");
|
||||||
Log.Info("热更222!");
|
|
||||||
LoadConfig();
|
LoadConfig();
|
||||||
TestLog().Forget();
|
TestLog().Forget();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,29 @@
|
|||||||
|
using AlicizaX.Resource.Runtime;
|
||||||
|
using AlicizaX.Fsm.Runtime;
|
||||||
|
using AlicizaX.Procedure.Runtime;
|
||||||
|
using AlicizaX.Runtime;
|
||||||
|
using UnityEngine;
|
||||||
|
using YooAsset;
|
||||||
|
|
||||||
|
namespace Unity.Startup.Procedure
|
||||||
|
{
|
||||||
|
internal sealed class ProcedureClearCache : ProcedureBase
|
||||||
|
{
|
||||||
|
private IFsm<IProcedureManager> owner;
|
||||||
|
|
||||||
|
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
|
||||||
|
{
|
||||||
|
base.OnEnter(procedureOwner);
|
||||||
|
Log.Info("开始清理包裹无用缓存!");
|
||||||
|
owner = procedureOwner;
|
||||||
|
ClearUnusedBundleFilesOperation operation = GameApp.Resource.ClearUnusedCacheFilesAsync();
|
||||||
|
operation.Completed += ClearCacheCompleted;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ClearCacheCompleted(AsyncOperationBase obj)
|
||||||
|
{
|
||||||
|
Log.Debug($"清理包裹缓存完成");
|
||||||
|
ChangeState<ProcedureLoadAssembly>(owner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b0ff1b60245f47dbad916144240bbcc2
|
||||||
|
timeCreated: 1737685923
|
||||||
@ -13,7 +13,7 @@ namespace Unity.Startup.Procedure
|
|||||||
{
|
{
|
||||||
base.OnEnter(procedureOwner);
|
base.OnEnter(procedureOwner);
|
||||||
|
|
||||||
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(ResourceComponent.BuildInPackageName, EPatchStates.CreateDownloader));
|
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(EPatchStates.CreateDownloader));
|
||||||
CreateDownloader(procedureOwner);
|
CreateDownloader(procedureOwner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -29,7 +29,7 @@ namespace Unity.Startup.Procedure
|
|||||||
procedureOwner.SetData<VarObject>("Downloader", downloaderVarObject);
|
procedureOwner.SetData<VarObject>("Downloader", downloaderVarObject);
|
||||||
if (downloader.TotalDownloadCount == 0)
|
if (downloader.TotalDownloadCount == 0)
|
||||||
{
|
{
|
||||||
Debug.Log("没有发现需要下载的资源");
|
Log.Info("没有发现需要下载的资源");
|
||||||
ChangeState<ProcedurePatchDone>(procedureOwner);
|
ChangeState<ProcedurePatchDone>(procedureOwner);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@ -15,7 +15,7 @@ namespace Unity.Startup.Procedure
|
|||||||
{
|
{
|
||||||
base.OnEnter(procedureOwner);
|
base.OnEnter(procedureOwner);
|
||||||
|
|
||||||
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(ResourceComponent.BuildInPackageName, EPatchStates.DownloadWebFiles));
|
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(EPatchStates.DownloadWebFiles));
|
||||||
BeginDownload(procedureOwner).Forget();
|
BeginDownload(procedureOwner).Forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -11,9 +11,9 @@ namespace Unity.Startup.Procedure
|
|||||||
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
|
protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
|
||||||
{
|
{
|
||||||
base.OnEnter(procedureOwner);
|
base.OnEnter(procedureOwner);
|
||||||
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(ResourceComponent.BuildInPackageName, EPatchStates.PatchDone));
|
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(EPatchStates.PatchDone));
|
||||||
LauncherUIHandler.ShowLogText("补丁流程更新完毕!");
|
Log.Info("补丁流程更新完毕!");
|
||||||
ChangeState<ProcedureLoadAssembly>(procedureOwner);
|
ChangeState<ProcedureClearCache>(procedureOwner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -14,7 +14,7 @@ namespace Unity.Startup.Procedure
|
|||||||
base.OnEnter(procedureOwner);
|
base.OnEnter(procedureOwner);
|
||||||
if (GameApp.Resource.GamePlayMode == EPlayMode.EditorSimulateMode)
|
if (GameApp.Resource.GamePlayMode == EPlayMode.EditorSimulateMode)
|
||||||
{
|
{
|
||||||
await GameApp.Resource.InitPackageAsync(ResourceComponent.BuildInPackageName, string.Empty, string.Empty, true);
|
await GameApp.Resource.InitPackageAsync();
|
||||||
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ namespace Unity.Startup.Procedure
|
|||||||
if (GameApp.Resource.GamePlayMode == EPlayMode.OfflinePlayMode)
|
if (GameApp.Resource.GamePlayMode == EPlayMode.OfflinePlayMode)
|
||||||
{
|
{
|
||||||
Log.Info("当前为离线模式,直接启动 ProcedureUpdateStaticVersion");
|
Log.Info("当前为离线模式,直接启动 ProcedureUpdateStaticVersion");
|
||||||
await GameApp.Resource.InitPackageAsync(ResourceComponent.BuildInPackageName, string.Empty, string.Empty, true);
|
await GameApp.Resource.InitPackageAsync();
|
||||||
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -35,8 +35,7 @@ namespace Unity.Startup.Procedure
|
|||||||
string bundleUrl = GlobalConfig.PatchData.BundleUrl;
|
string bundleUrl = GlobalConfig.PatchData.BundleUrl;
|
||||||
Log.Info("下载资源的路径:" + bundleUrl);
|
Log.Info("下载资源的路径:" + bundleUrl);
|
||||||
|
|
||||||
await GameApp.Resource.InitPackageAsync(ResourceComponent.BuildInPackageName, bundleUrl, bundleUrl, true);
|
await GameApp.Resource.InitPackageAsync(string.Empty, bundleUrl, bundleUrl, true);
|
||||||
procedureOwner.RemoveData(ResourceComponent.BuildInPackageName);
|
|
||||||
await UniTask.DelayFrame();
|
await UniTask.DelayFrame();
|
||||||
|
|
||||||
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
||||||
|
|||||||
@ -24,7 +24,7 @@ namespace Unity.Startup.Procedure
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(ResourceComponent.BuildInPackageName, EPatchStates.UpdateManifest));
|
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(EPatchStates.UpdateManifest));
|
||||||
UpdateManifest(procedureOwner).Forget();
|
UpdateManifest(procedureOwner).Forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -56,7 +56,7 @@ namespace Unity.Startup.Procedure
|
|||||||
{
|
{
|
||||||
//更新失败
|
//更新失败
|
||||||
Debug.LogError(buildInOperation.Error);
|
Debug.LogError(buildInOperation.Error);
|
||||||
GameApp.Event.Fire(this, AssetPatchManifestUpdateFailedEventArgs.Create(ResourceComponent.BuildInPackageName, buildInOperation.Error));
|
GameApp.Event.Fire(this, AssetPatchManifestUpdateFailedEventArgs.Create(buildInOperation.Error));
|
||||||
|
|
||||||
//询问是否重试
|
//询问是否重试
|
||||||
//ChangeState<ProcedureUpdateManifest>(procedureOwner);
|
//ChangeState<ProcedureUpdateManifest>(procedureOwner);
|
||||||
|
|||||||
@ -15,7 +15,7 @@ namespace Unity.Startup.Procedure
|
|||||||
{
|
{
|
||||||
base.OnEnter(procedureOwner);
|
base.OnEnter(procedureOwner);
|
||||||
|
|
||||||
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(ResourceComponent.BuildInPackageName, EPatchStates.UpdateStaticVersion));
|
GameApp.Event.Fire(this, AssetPatchStatesChangeEventArgs.Create(EPatchStates.UpdateStaticVersion));
|
||||||
GetStaticVersion(procedureOwner).Forget();
|
GetStaticVersion(procedureOwner).Forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ namespace Unity.Startup.Procedure
|
|||||||
{
|
{
|
||||||
//更新失败
|
//更新失败
|
||||||
Log.Error(buildInOperation.Error);
|
Log.Error(buildInOperation.Error);
|
||||||
GameApp.Event.Fire(this, AssetStaticVersionUpdateFailedEventArgs.Create(ResourceComponent.BuildInPackageName, buildInOperation.Error));
|
GameApp.Event.Fire(this, AssetStaticVersionUpdateFailedEventArgs.Create(buildInOperation.Error));
|
||||||
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
ChangeState<ProcedureUpdateStaticVersion>(procedureOwner);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,9 +9,17 @@ namespace AlicizaX.Resource.Editor
|
|||||||
internal sealed class ResourceComponentInspector : ComponentTypeComponentInspector
|
internal sealed class ResourceComponentInspector : ComponentTypeComponentInspector
|
||||||
{
|
{
|
||||||
private SerializedProperty m_GamePlayMode;
|
private SerializedProperty m_GamePlayMode;
|
||||||
|
|
||||||
private GUIContent m_GamePlayModeGUIContent = new GUIContent("资源运行模式");
|
private GUIContent m_GamePlayModeGUIContent = new GUIContent("资源运行模式");
|
||||||
|
|
||||||
|
|
||||||
|
private SerializedProperty m_Milliseconds;
|
||||||
|
private SerializedProperty m_defaultPackageName;
|
||||||
|
private SerializedProperty m_AssetAutoReleaseInterval;
|
||||||
|
private SerializedProperty m_AssetCapacity;
|
||||||
|
private SerializedProperty m_AssetExpireTime;
|
||||||
|
private SerializedProperty m_AssetPriority;
|
||||||
|
|
||||||
|
|
||||||
public override void OnInspectorGUI()
|
public override void OnInspectorGUI()
|
||||||
{
|
{
|
||||||
base.OnInspectorGUI();
|
base.OnInspectorGUI();
|
||||||
@ -20,11 +28,52 @@ namespace AlicizaX.Resource.Editor
|
|||||||
EditorGUI.BeginDisabledGroup(EditorApplication.isPlayingOrWillChangePlaymode);
|
EditorGUI.BeginDisabledGroup(EditorApplication.isPlayingOrWillChangePlaymode);
|
||||||
{
|
{
|
||||||
EditorGUILayout.PropertyField(m_GamePlayMode, m_GamePlayModeGUIContent);
|
EditorGUILayout.PropertyField(m_GamePlayMode, m_GamePlayModeGUIContent);
|
||||||
|
|
||||||
|
|
||||||
|
long milliseconds = (long)EditorGUILayout.Slider("每帧执行消耗的最大时间切片(ms)", m_Milliseconds.longValue, 30, 100000);
|
||||||
|
if (milliseconds != m_Milliseconds.longValue)
|
||||||
|
{
|
||||||
|
m_Milliseconds.longValue = milliseconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
string packageName = EditorGUILayout.TextField("Package Name", m_defaultPackageName.stringValue);
|
||||||
|
if (packageName != m_defaultPackageName.stringValue)
|
||||||
|
{
|
||||||
|
m_defaultPackageName.stringValue = packageName;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float assetAutoReleaseInterval = EditorGUILayout.Slider("对象池自动释放间隔(s)", m_AssetAutoReleaseInterval.floatValue, 60, 3600);
|
||||||
|
if (assetAutoReleaseInterval != m_AssetAutoReleaseInterval.floatValue)
|
||||||
|
{
|
||||||
|
m_AssetAutoReleaseInterval.floatValue = assetAutoReleaseInterval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int assetCapacity = EditorGUILayout.IntSlider("对象池容量", m_AssetCapacity.intValue, 32, 1024);
|
||||||
|
if (assetCapacity != m_AssetCapacity.intValue)
|
||||||
|
{
|
||||||
|
m_AssetCapacity.intValue = assetCapacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
float assetExpireTime = EditorGUILayout.Slider("对象池过期秒数", m_AssetExpireTime.floatValue, 60, 1024);
|
||||||
|
if (assetExpireTime != m_AssetExpireTime.floatValue)
|
||||||
|
{
|
||||||
|
m_AssetExpireTime.floatValue = assetExpireTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int assetPriority = EditorGUILayout.IntSlider("对象池优先级", m_AssetPriority.intValue, 0, 10);
|
||||||
|
if (assetPriority != m_AssetPriority.intValue)
|
||||||
|
{
|
||||||
|
m_AssetPriority.intValue = assetPriority;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EditorGUI.EndDisabledGroup();
|
EditorGUI.EndDisabledGroup();
|
||||||
|
|
||||||
serializedObject.ApplyModifiedProperties();
|
serializedObject.ApplyModifiedProperties();
|
||||||
|
|
||||||
|
|
||||||
Repaint();
|
Repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,9 +82,17 @@ namespace AlicizaX.Resource.Editor
|
|||||||
{
|
{
|
||||||
RefreshComponentTypeNames(typeof(IResourceManager));
|
RefreshComponentTypeNames(typeof(IResourceManager));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void Enable()
|
protected override void Enable()
|
||||||
{
|
{
|
||||||
m_GamePlayMode = serializedObject.FindProperty("m_GamePlayMode");
|
m_GamePlayMode = serializedObject.FindProperty("m_GamePlayMode");
|
||||||
|
|
||||||
|
m_Milliseconds = serializedObject.FindProperty("m_Milliseconds");
|
||||||
|
m_defaultPackageName = serializedObject.FindProperty("m_defaultPackageName");
|
||||||
|
m_AssetAutoReleaseInterval = serializedObject.FindProperty("m_AssetAutoReleaseInterval");
|
||||||
|
m_AssetCapacity = serializedObject.FindProperty("m_AssetCapacity");
|
||||||
|
m_AssetExpireTime = serializedObject.FindProperty("m_AssetExpireTime");
|
||||||
|
m_AssetPriority = serializedObject.FindProperty("m_AssetPriority");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -32,7 +32,7 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
/// 初始化操作。
|
/// 初始化操作。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="packageName">资源包名称。</param>
|
/// <param name="packageName">资源包名称。</param>
|
||||||
UniTask<bool> InitPackageAsync(string packageName, string hostServerURL, string fallbackHostServerURL, bool isDefaultPackage = false);
|
UniTask<bool> InitPackageAsync(string packageName, string hostServerURL, string fallbackHostServerURL, bool isDefaultPackage = true);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 默认资源包名称。
|
/// 默认资源包名称。
|
||||||
|
|||||||
@ -18,18 +18,18 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
[Tooltip("当目标平台为Web平台时,将会强制设置为" + nameof(EPlayMode.WebPlayMode))] [SerializeField]
|
[Tooltip("当目标平台为Web平台时,将会强制设置为" + nameof(EPlayMode.WebPlayMode))] [SerializeField]
|
||||||
private EPlayMode m_GamePlayMode;
|
private EPlayMode m_GamePlayMode;
|
||||||
|
|
||||||
[Range(30, 100000)] [SerializeField] private long m_Milliseconds = 30;
|
[SerializeField] private long m_Milliseconds = 30;
|
||||||
|
|
||||||
[SerializeField] private string m_defaultPackageName = "DefaultPackage";
|
[SerializeField] private string m_defaultPackageName = "DefaultPackage";
|
||||||
|
|
||||||
[Range(60, 3600)] [SerializeField] private float m_AssetAutoReleaseInterval = 60;
|
[SerializeField] private float m_AssetAutoReleaseInterval = 60;
|
||||||
|
|
||||||
[Range(32, 1024)] [SerializeField] private int m_AssetCapacity = 64;
|
[SerializeField] private int m_AssetCapacity = 64;
|
||||||
|
|
||||||
|
|
||||||
[Range(60, 1024)] [SerializeField] private float m_AssetExpireTime = 60;
|
[SerializeField] private float m_AssetExpireTime = 60;
|
||||||
|
|
||||||
[SerializeField] [Range(0, 10)] private int m_AssetPriority = 0;
|
[SerializeField] private int m_AssetPriority = 0;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源的运行模式
|
/// 资源的运行模式
|
||||||
@ -40,8 +40,6 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
set { m_GamePlayMode = value; }
|
set { m_GamePlayMode = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
public const string BuildInPackageName = "DefaultPackage";
|
|
||||||
|
|
||||||
public const int DefaultPriority = 0;
|
public const int DefaultPriority = 0;
|
||||||
|
|
||||||
private IResourceManager m_ResourceManager;
|
private IResourceManager m_ResourceManager;
|
||||||
@ -68,15 +66,13 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
m_ResourceManager = SysModuleCenter.GetModule<IResourceManager>();
|
m_ResourceManager = SysModuleCenter.GetModule<IResourceManager>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static string PrefsKey => Application.dataPath.GetHashCode() + "GamePlayMode";
|
||||||
|
|
||||||
protected void Start()
|
protected void Start()
|
||||||
{
|
{
|
||||||
if (m_GamePlayMode == EPlayMode.EditorSimulateMode)
|
#if UNITY_EDITOR
|
||||||
{
|
m_GamePlayMode = (EPlayMode)UnityEditor.EditorPrefs.GetInt(PrefsKey, 0);
|
||||||
#if !UNITY_EDITOR
|
|
||||||
m_GamePlayMode = EPlayMode.OfflinePlayMode;
|
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
// m_ResourceManager.SetReadOnlyPath(Application.streamingAssetsPath);
|
// m_ResourceManager.SetReadOnlyPath(Application.streamingAssetsPath);
|
||||||
// if (config.ReadWritePathType == ReadWritePathType.TemporaryCache)
|
// if (config.ReadWritePathType == ReadWritePathType.TemporaryCache)
|
||||||
// {
|
// {
|
||||||
@ -86,10 +82,7 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
// {
|
// {
|
||||||
// m_ResourceManager.SetReadWritePath(Application.persistentDataPath);
|
// m_ResourceManager.SetReadWritePath(Application.persistentDataPath);
|
||||||
// }
|
// }
|
||||||
if (string.IsNullOrEmpty(m_defaultPackageName))
|
|
||||||
{
|
|
||||||
m_defaultPackageName = BuildInPackageName;
|
|
||||||
}
|
|
||||||
m_ResourceManager.DefaultPackageName = m_defaultPackageName;
|
m_ResourceManager.DefaultPackageName = m_defaultPackageName;
|
||||||
m_ResourceManager.PlayMode = m_GamePlayMode;
|
m_ResourceManager.PlayMode = m_GamePlayMode;
|
||||||
m_ResourceManager.VerifyLevel = EFileVerifyLevel.Middle;
|
m_ResourceManager.VerifyLevel = EFileVerifyLevel.Middle;
|
||||||
@ -109,7 +102,7 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
/// 初始化操作。
|
/// 初始化操作。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async UniTask<bool> InitPackageAsync(string packageName, string host, string fallbackHostServer, bool isDefaultPackage = false)
|
public async UniTask<bool> InitPackageAsync(string packageName = "", string host = "", string fallbackHostServer = "", bool isDefaultPackage = true)
|
||||||
{
|
{
|
||||||
if (m_ResourceManager == null)
|
if (m_ResourceManager == null)
|
||||||
{
|
{
|
||||||
@ -117,6 +110,11 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(packageName))
|
||||||
|
{
|
||||||
|
packageName = m_defaultPackageName;
|
||||||
|
}
|
||||||
|
|
||||||
return await m_ResourceManager.InitPackageAsync(packageName, host, fallbackHostServer, isDefaultPackage);
|
return await m_ResourceManager.InitPackageAsync(packageName, host, fallbackHostServer, isDefaultPackage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -171,7 +171,7 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public UniTask<bool> InitPackageAsync(string packageName, string hostServerURL, string fallbackHostServerURL, bool isDefaultPackage = false)
|
public UniTask<bool> InitPackageAsync(string packageName, string hostServerURL, string fallbackHostServerURL, bool isDefaultPackage = true)
|
||||||
{
|
{
|
||||||
if (PackageMap.ContainsKey(packageName))
|
if (PackageMap.ContainsKey(packageName))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -11,7 +11,6 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
{
|
{
|
||||||
public override void Clear()
|
public override void Clear()
|
||||||
{
|
{
|
||||||
PackageName = null;
|
|
||||||
Error = null;
|
Error = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,11 +24,6 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
get { return EventId; }
|
get { return EventId; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 包名称
|
|
||||||
/// </summary>
|
|
||||||
public string PackageName { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 错误信息
|
/// 错误信息
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -41,10 +35,9 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
/// <param name="packageName">包名称</param>
|
/// <param name="packageName">包名称</param>
|
||||||
/// <param name="error">错误信息</param>
|
/// <param name="error">错误信息</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static AssetPatchManifestUpdateFailedEventArgs Create(string packageName, string error)
|
public static AssetPatchManifestUpdateFailedEventArgs Create(string error)
|
||||||
{
|
{
|
||||||
var assetPatchManifestUpdateFailed = ReferencePool.Acquire<AssetPatchManifestUpdateFailedEventArgs>();
|
var assetPatchManifestUpdateFailed = ReferencePool.Acquire<AssetPatchManifestUpdateFailedEventArgs>();
|
||||||
assetPatchManifestUpdateFailed.PackageName = packageName;
|
|
||||||
assetPatchManifestUpdateFailed.Error = error;
|
assetPatchManifestUpdateFailed.Error = error;
|
||||||
return assetPatchManifestUpdateFailed;
|
return assetPatchManifestUpdateFailed;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,6 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
{
|
{
|
||||||
public override void Clear()
|
public override void Clear()
|
||||||
{
|
{
|
||||||
PackageName = null;
|
|
||||||
CurrentStates = EPatchStates.CreateDownloader;
|
CurrentStates = EPatchStates.CreateDownloader;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -22,10 +21,6 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
get { return EventId; }
|
get { return EventId; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 包名称
|
|
||||||
/// </summary>
|
|
||||||
public string PackageName { get; private set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 当前步骤
|
/// 当前步骤
|
||||||
@ -38,10 +33,9 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
/// <param name="packageName">包名称</param>
|
/// <param name="packageName">包名称</param>
|
||||||
/// <param name="currentStates">当前步骤</param>
|
/// <param name="currentStates">当前步骤</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static AssetPatchStatesChangeEventArgs Create(string packageName, EPatchStates currentStates)
|
public static AssetPatchStatesChangeEventArgs Create(EPatchStates currentStates)
|
||||||
{
|
{
|
||||||
var assetPatchStatesChange = ReferencePool.Acquire<AssetPatchStatesChangeEventArgs>();
|
var assetPatchStatesChange = ReferencePool.Acquire<AssetPatchStatesChangeEventArgs>();
|
||||||
assetPatchStatesChange.PackageName = packageName;
|
|
||||||
assetPatchStatesChange.CurrentStates = currentStates;
|
assetPatchStatesChange.CurrentStates = currentStates;
|
||||||
return assetPatchStatesChange;
|
return assetPatchStatesChange;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,7 +11,6 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
{
|
{
|
||||||
public override void Clear()
|
public override void Clear()
|
||||||
{
|
{
|
||||||
PackageName = null;
|
|
||||||
Error = null;
|
Error = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,10 +24,6 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
get { return EventId; }
|
get { return EventId; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 包名称
|
|
||||||
/// </summary>
|
|
||||||
public string PackageName { get; set; }
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 错误信息
|
/// 错误信息
|
||||||
@ -41,10 +36,9 @@ namespace AlicizaX.Resource.Runtime
|
|||||||
/// <param name="packageName">包名称</param>
|
/// <param name="packageName">包名称</param>
|
||||||
/// <param name="error"></param>
|
/// <param name="error"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static AssetStaticVersionUpdateFailedEventArgs Create(string packageName, string error)
|
public static AssetStaticVersionUpdateFailedEventArgs Create(string error)
|
||||||
{
|
{
|
||||||
var assetStaticVersionUpdateFailed = ReferencePool.Acquire<AssetStaticVersionUpdateFailedEventArgs>();
|
var assetStaticVersionUpdateFailed = ReferencePool.Acquire<AssetStaticVersionUpdateFailedEventArgs>();
|
||||||
assetStaticVersionUpdateFailed.PackageName = packageName;
|
|
||||||
assetStaticVersionUpdateFailed.Error = error;
|
assetStaticVersionUpdateFailed.Error = error;
|
||||||
return assetStaticVersionUpdateFailed;
|
return assetStaticVersionUpdateFailed;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,55 +4,73 @@ using AlicizaX.Runtime;
|
|||||||
|
|
||||||
namespace AlicizaX.Timer.Runtime
|
namespace AlicizaX.Timer.Runtime
|
||||||
{
|
{
|
||||||
|
public delegate void TimerHandler(object[] args);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 定时器接口
|
/// 定时器接口
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[UnityEngine.Scripting.Preserve]
|
[UnityEngine.Scripting.Preserve]
|
||||||
public interface ITimerManager : IModule, IModuleUpdate
|
public interface ITimerManager : IModule, IModuleUpdate
|
||||||
{
|
{
|
||||||
List<TimerInfo> GetTimerInfos();
|
/// <summary>
|
||||||
|
/// 添加计时器。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="callback">计时器回调。</param>
|
||||||
|
/// <param name="time">计时器间隔。</param>
|
||||||
|
/// <param name="isLoop">是否循环。</param>
|
||||||
|
/// <param name="isUnscaled">是否不收时间缩放影响。</param>
|
||||||
|
/// <param name="args">传参。(避免闭包)</param>
|
||||||
|
/// <returns>计时器Id。</returns>
|
||||||
|
public int AddTimer(TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false, params object[] args);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个定时调用的任务
|
/// 暂停计时器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="interval">间隔时间(以秒为单位)</param>
|
/// <param name="timerId">计时器Id。</param>
|
||||||
/// <param name="repeat">重复次数(0 表示无限重复)</param>
|
public void Stop(int timerId);
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
|
||||||
/// <param name="callbackParam">回调函数的参数(可选)</param>
|
|
||||||
void Add(float interval, int repeat, Action<object> callback, object callbackParam = null);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个只执行一次的任务
|
/// 恢复计时器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="interval">间隔时间(以秒为单位)</param>
|
/// <param name="timerId">计时器Id。</param>
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
public void Resume(int timerId);
|
||||||
/// <param name="callbackParam">回调函数的参数(可选)</param>
|
|
||||||
void AddOnce(float interval, Action<object> callback, object callbackParam = null);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个每帧更新执行的任务
|
/// 计时器是否在运行中。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
/// <param name="timerId">计时器Id。</param>
|
||||||
void AddUpdate(Action<object> callback);
|
/// <returns>否在运行中。</returns>
|
||||||
|
public bool IsRunning(int timerId);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个每帧更新执行的任务
|
/// 获得计时器剩余时间。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
public float GetLeftTime(int timerId);
|
||||||
/// <param name="callbackParam">回调函数的参数</param>
|
|
||||||
void AddUpdate(Action<object> callback, object callbackParam);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查指定的任务是否存在
|
/// 重置计时器,恢复到开始状态。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要检查的回调函数</param>
|
public void Restart(int timerId);
|
||||||
/// <returns>存在返回 true,不存在返回 false</returns>
|
|
||||||
bool Exists(Action<object> callback);
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 移除指定的任务
|
/// 重置计时器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要移除的回调函数</param>
|
public void Reset(int timerId, TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false);
|
||||||
void Remove(Action<object> callback);
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void Reset(int timerId, float time, bool isLoop, bool isUnscaled);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除计时器。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="timerId">计时器Id。</param>
|
||||||
|
public void RemoveTimer(int timerId);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除所有计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void RemoveAllTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -27,71 +27,147 @@ namespace AlicizaX.Timer.Runtime
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个定时调用的任务
|
/// 添加计时器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="interval">间隔时间(以秒为单位)</param>
|
/// <param name="callback">计时器回调。</param>
|
||||||
/// <param name="repeat">重复次数(0 表示无限重复)</param>
|
/// <param name="time">计时器间隔。</param>
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
/// <param name="isLoop">是否循环。</param>
|
||||||
/// <param name="callbackParam">回调函数的参数(可选)</param>
|
/// <param name="isUnscaled">是否不收时间缩放影响。</param>
|
||||||
public void Add(float interval, int repeat, Action<object> callback, object callbackParam = null)
|
/// <param name="args">传参。(避免闭包)</param>
|
||||||
|
/// <returns>计时器Id。</returns>
|
||||||
|
public int AddTimer(TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false, params object[] args)
|
||||||
{
|
{
|
||||||
_timerManager.Add(interval, repeat, callback, callbackParam);
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return _timerManager.AddTimer(callback, time, isLoop, isUnscaled, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个只执行一次的任务
|
/// 暂停计时器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="interval">间隔时间(以秒为单位)</param>
|
/// <param name="timerId">计时器Id。</param>
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
public void Stop(int timerId)
|
||||||
/// <param name="callbackParam">回调函数的参数(可选)</param>
|
|
||||||
public void AddOnce(float interval, Action<object> callback, object callbackParam = null)
|
|
||||||
{
|
{
|
||||||
_timerManager.AddOnce(interval, callback, callbackParam);
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_timerManager.Stop(timerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个每帧更新执行的任务
|
/// 恢复计时器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
/// <param name="timerId">计时器Id。</param>
|
||||||
public void AddUpdate(Action<object> callback)
|
public void Resume(int timerId)
|
||||||
{
|
{
|
||||||
_timerManager.AddUpdate(callback);
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_timerManager.Resume(timerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 添加一个每帧更新执行的任务
|
/// 计时器是否在运行中。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
/// <param name="timerId">计时器Id。</param>
|
||||||
/// <param name="callbackParam">回调函数的参数</param>
|
/// <returns>否在运行中。</returns>
|
||||||
public void AddUpdate(Action<object> callback, object callbackParam)
|
public bool IsRunning(int timerId)
|
||||||
{
|
{
|
||||||
_timerManager.AddUpdate(callback, callbackParam);
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return _timerManager.IsRunning(timerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 检查指定的任务是否存在
|
/// 获得计时器剩余时间。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要检查的回调函数</param>
|
public float GetLeftTime(int timerId)
|
||||||
/// <returns>存在返回 true,不存在返回 false</returns>
|
|
||||||
public bool Exists(Action<object> callback)
|
|
||||||
{
|
{
|
||||||
return _timerManager.Exists(callback);
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
return _timerManager.GetLeftTime(timerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 移除指定的任务
|
/// 重置计时器,恢复到开始状态。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="callback">要移除的回调函数</param>
|
public void Restart(int timerId)
|
||||||
public void Remove(Action<object> callback)
|
|
||||||
{
|
{
|
||||||
_timerManager.Remove(callback);
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<TimerInfo> GetTimerInfos()
|
_timerManager.Restart(timerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void Reset(int timerId, TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false)
|
||||||
{
|
{
|
||||||
return _timerManager.GetTimerInfos();
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_timerManager.Reset(timerId, callback, time, isLoop, isUnscaled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void Reset(int timerId, float time, bool isLoop, bool isUnscaled)
|
||||||
|
{
|
||||||
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_timerManager.Reset(timerId, time, isLoop, isUnscaled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除计时器。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="timerId">计时器Id。</param>
|
||||||
|
public void RemoveTimer(int timerId)
|
||||||
|
{
|
||||||
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
Log.Error("TimerMgr is invalid.");
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_timerManager.RemoveTimer(timerId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除所有计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void RemoveAllTimer()
|
||||||
|
{
|
||||||
|
if (_timerManager == null)
|
||||||
|
{
|
||||||
|
Log.Error("TimerMgr is invalid.");
|
||||||
|
throw new GameFrameworkException("TimerMgr is invalid.");
|
||||||
|
}
|
||||||
|
|
||||||
|
_timerManager.RemoveAllTimer();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -5,326 +5,464 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace AlicizaX.Timer.Runtime
|
namespace AlicizaX.Timer.Runtime
|
||||||
{
|
{
|
||||||
public struct TimerInfo
|
[Serializable]
|
||||||
|
public class Timer
|
||||||
{
|
{
|
||||||
public float Interval;
|
public int timerId = 0;
|
||||||
public int Repeat;
|
public float curTime = 0;
|
||||||
public float Elapsed;
|
public float time = 0;
|
||||||
|
public TimerHandler Handler;
|
||||||
|
public bool isLoop = false;
|
||||||
|
public bool isNeedRemove = false;
|
||||||
|
public bool isRunning = false;
|
||||||
|
public bool isUnscaled = false; //是否使用非缩放的时间
|
||||||
|
public object[] Args = null; //回调参数
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 定时器管理器
|
|
||||||
/// </summary>
|
|
||||||
[UnityEngine.Scripting.Preserve]
|
[UnityEngine.Scripting.Preserve]
|
||||||
internal sealed class TimerManager : ITimerManager
|
internal sealed class TimerManager : ITimerManager
|
||||||
{
|
{
|
||||||
class TimerItem
|
private int _curTimerId = 0;
|
||||||
{
|
private readonly List<Timer> _timerList = new List<Timer>();
|
||||||
public float Interval;
|
private readonly List<Timer> _unscaledTimerList = new List<Timer>();
|
||||||
public int Repeat;
|
private readonly List<int> _cacheRemoveTimers = new List<int>();
|
||||||
public Action<object> Callback;
|
private readonly List<int> _cacheRemoveUnscaledTimers = new List<int>();
|
||||||
public object Param;
|
|
||||||
|
|
||||||
public float Elapsed;
|
|
||||||
public bool Deleted;
|
|
||||||
|
|
||||||
public void Set(float interval, int repeat, Action<object> callback, object param)
|
|
||||||
{
|
|
||||||
this.Interval = interval;
|
|
||||||
this.Repeat = repeat;
|
|
||||||
this.Callback = callback;
|
|
||||||
this.Param = param;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private readonly Dictionary<Action<object>, TimerItem> _items = new Dictionary<Action<object>, TimerItem>();
|
|
||||||
private readonly Dictionary<Action<object>, TimerItem> _toAdd = new Dictionary<Action<object>, TimerItem>();
|
|
||||||
private readonly List<TimerItem> _toRemove = new List<TimerItem>();
|
|
||||||
private readonly List<TimerItem> _pool = new List<TimerItem>(100);
|
|
||||||
|
|
||||||
private static readonly object Locker = new object();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否触发回调异常
|
/// 添加计时器。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static bool CatchCallbackExceptions = false;
|
/// <param name="callback">计时器回调。</param>
|
||||||
|
/// <param name="time">计时器间隔。</param>
|
||||||
|
/// <param name="isLoop">是否循环。</param>
|
||||||
|
/// <param name="isUnscaled">是否不收时间缩放影响。</param>
|
||||||
|
/// <param name="args">传参。(避免闭包)</param>
|
||||||
|
/// <returns>计时器Id。</returns>
|
||||||
|
public int AddTimer(TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false, params object[] args)
|
||||||
|
{
|
||||||
|
Timer timer = new Timer
|
||||||
|
{
|
||||||
|
timerId = ++_curTimerId,
|
||||||
|
curTime = time,
|
||||||
|
time = time,
|
||||||
|
Handler = callback,
|
||||||
|
isLoop = isLoop,
|
||||||
|
isUnscaled = isUnscaled,
|
||||||
|
Args = args,
|
||||||
|
isNeedRemove = false,
|
||||||
|
isRunning = true
|
||||||
|
};
|
||||||
|
|
||||||
void IModuleUpdate.Update(float elapseSeconds, float realElapseSeconds)
|
InsertTimer(timer);
|
||||||
{
|
return timer.timerId;
|
||||||
lock (Locker)
|
|
||||||
{
|
|
||||||
Dictionary<Action<object>, TimerItem>.Enumerator enumerator;
|
|
||||||
|
|
||||||
if (_items.Count > 0)
|
|
||||||
{
|
|
||||||
enumerator = _items.GetEnumerator();
|
|
||||||
while (enumerator.MoveNext())
|
|
||||||
{
|
|
||||||
TimerItem timerItem = enumerator.Current.Value;
|
|
||||||
if (timerItem.Deleted)
|
|
||||||
{
|
|
||||||
_toRemove.Add(timerItem);
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
timerItem.Elapsed += realElapseSeconds;
|
private void InsertTimer(Timer timer)
|
||||||
if (timerItem.Elapsed < timerItem.Interval)
|
|
||||||
{
|
{
|
||||||
continue;
|
bool isInsert = false;
|
||||||
}
|
if (timer.isUnscaled)
|
||||||
|
|
||||||
timerItem.Elapsed -= timerItem.Interval;
|
|
||||||
if (timerItem.Elapsed < 0 || timerItem.Elapsed > 0.03f)
|
|
||||||
timerItem.Elapsed = 0;
|
|
||||||
|
|
||||||
if (timerItem.Repeat > 0)
|
|
||||||
{
|
{
|
||||||
timerItem.Repeat--;
|
for (int i = 0, len = _unscaledTimerList.Count; i < len; i++)
|
||||||
if (timerItem.Repeat == 0)
|
|
||||||
{
|
{
|
||||||
timerItem.Deleted = true;
|
if (_unscaledTimerList[i].curTime > timer.curTime)
|
||||||
_toRemove.Add(timerItem);
|
{
|
||||||
|
_unscaledTimerList.Insert(i, timer);
|
||||||
|
isInsert = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// var repeat = i.Repeat;
|
if (!isInsert)
|
||||||
if (timerItem.Callback != null)
|
|
||||||
{
|
{
|
||||||
if (CatchCallbackExceptions)
|
_unscaledTimerList.Add(timer);
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
timerItem.Callback(timerItem.Param);
|
|
||||||
}
|
|
||||||
catch (Exception e)
|
|
||||||
{
|
|
||||||
timerItem.Deleted = true;
|
|
||||||
Debug.LogWarning("Timer: timer(internal=" + timerItem.Interval + ", repeat=" + timerItem.Repeat + ") callback error > " + e.Message);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
timerItem.Callback(timerItem.Param);
|
for (int i = 0, len = _timerList.Count; i < len; i++)
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
enumerator.Dispose();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int len = _toRemove.Count;
|
|
||||||
if (len > 0)
|
|
||||||
{
|
{
|
||||||
for (int k = 0; k < len; k++)
|
if (_timerList[i].curTime > timer.curTime)
|
||||||
{
|
{
|
||||||
TimerItem i = _toRemove[k];
|
_timerList.Insert(i, timer);
|
||||||
if (i.Deleted && i.Callback != null)
|
isInsert = true;
|
||||||
{
|
break;
|
||||||
_items.Remove(i.Callback);
|
|
||||||
ReturnToPool(i);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_toRemove.Clear();
|
if (!isInsert)
|
||||||
|
{
|
||||||
|
_timerList.Add(timer);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_toAdd.Count > 0)
|
/// <summary>
|
||||||
|
/// 暂停计时器。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="timerId">计时器Id。</param>
|
||||||
|
public void Stop(int timerId)
|
||||||
{
|
{
|
||||||
enumerator = _toAdd.GetEnumerator();
|
Timer timer = GetTimer(timerId);
|
||||||
while (enumerator.MoveNext())
|
if (timer != null) timer.isRunning = false;
|
||||||
{
|
|
||||||
_items.Add(enumerator.Current.Key, enumerator.Current.Value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enumerator.Dispose();
|
/// <summary>
|
||||||
_toAdd.Clear();
|
/// 恢复计时器。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="timerId">计时器Id。</param>
|
||||||
|
public void Resume(int timerId)
|
||||||
|
{
|
||||||
|
Timer timer = GetTimer(timerId);
|
||||||
|
if (timer != null) timer.isRunning = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 计时器是否在运行中。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="timerId">计时器Id。</param>
|
||||||
|
/// <returns>否在运行中。</returns>
|
||||||
|
public bool IsRunning(int timerId)
|
||||||
|
{
|
||||||
|
Timer timer = GetTimer(timerId);
|
||||||
|
return timer is { isRunning: true };
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获得计时器剩余时间
|
||||||
|
/// </summary>
|
||||||
|
public float GetLeftTime(int timerId)
|
||||||
|
{
|
||||||
|
Timer timer = GetTimer(timerId);
|
||||||
|
if (timer == null) return 0;
|
||||||
|
return timer.curTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置计时器,恢复到开始状态。
|
||||||
|
/// </summary>
|
||||||
|
public void Restart(int timerId)
|
||||||
|
{
|
||||||
|
Timer timer = GetTimer(timerId);
|
||||||
|
if (timer != null)
|
||||||
|
{
|
||||||
|
timer.curTime = timer.time;
|
||||||
|
timer.isRunning = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void Reset(int timerId, TimerHandler callback, float time, bool isLoop = false, bool isUnscaled = false)
|
||||||
|
{
|
||||||
|
Timer timer = GetTimer(timerId);
|
||||||
|
if (timer != null)
|
||||||
|
{
|
||||||
|
timer.curTime = time;
|
||||||
|
timer.time = time;
|
||||||
|
timer.Handler = callback;
|
||||||
|
timer.isLoop = isLoop;
|
||||||
|
timer.isNeedRemove = false;
|
||||||
|
if (timer.isUnscaled != isUnscaled)
|
||||||
|
{
|
||||||
|
RemoveTimerImmediate(timerId);
|
||||||
|
|
||||||
|
timer.isUnscaled = isUnscaled;
|
||||||
|
InsertTimer(timer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 重置计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void Reset(int timerId, float time, bool isLoop, bool isUnscaled)
|
||||||
|
{
|
||||||
|
Timer timer = GetTimer(timerId);
|
||||||
|
if (timer != null)
|
||||||
|
{
|
||||||
|
timer.curTime = time;
|
||||||
|
timer.time = time;
|
||||||
|
timer.isLoop = isLoop;
|
||||||
|
timer.isNeedRemove = false;
|
||||||
|
if (timer.isUnscaled != isUnscaled)
|
||||||
|
{
|
||||||
|
RemoveTimerImmediate(timerId);
|
||||||
|
|
||||||
|
timer.isUnscaled = isUnscaled;
|
||||||
|
InsertTimer(timer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 立即移除。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="timerId"></param>
|
||||||
|
private void RemoveTimerImmediate(int timerId)
|
||||||
|
{
|
||||||
|
for (int i = 0, len = _timerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
if (_timerList[i].timerId == timerId)
|
||||||
|
{
|
||||||
|
_timerList.RemoveAt(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0, len = _unscaledTimerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
if (_unscaledTimerList[i].timerId == timerId)
|
||||||
|
{
|
||||||
|
_unscaledTimerList.RemoveAt(i);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除计时器。
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="timerId">计时器Id。</param>
|
||||||
|
public void RemoveTimer(int timerId)
|
||||||
|
{
|
||||||
|
for (int i = 0, len = _timerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
if (_timerList[i].timerId == timerId)
|
||||||
|
{
|
||||||
|
_timerList[i].isNeedRemove = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0, len = _unscaledTimerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
if (_unscaledTimerList[i].timerId == timerId)
|
||||||
|
{
|
||||||
|
_unscaledTimerList[i].isNeedRemove = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 移除所有计时器。
|
||||||
|
/// </summary>
|
||||||
|
public void RemoveAllTimer()
|
||||||
|
{
|
||||||
|
_timerList.Clear();
|
||||||
|
_unscaledTimerList.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Timer GetTimer(int timerId)
|
||||||
|
{
|
||||||
|
for (int i = 0, len = _timerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
if (_timerList[i].timerId == timerId)
|
||||||
|
{
|
||||||
|
return _timerList[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0, len = _unscaledTimerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
if (_unscaledTimerList[i].timerId == timerId)
|
||||||
|
{
|
||||||
|
return _unscaledTimerList[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoopCallInBadFrame()
|
||||||
|
{
|
||||||
|
bool isLoopCall = false;
|
||||||
|
for (int i = 0, len = _timerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
Timer timer = _timerList[i];
|
||||||
|
if (timer.isLoop && timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
if (timer.Handler != null)
|
||||||
|
{
|
||||||
|
timer.Handler(timer.Args);
|
||||||
|
}
|
||||||
|
|
||||||
|
timer.curTime += timer.time;
|
||||||
|
if (timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
isLoopCall = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLoopCall)
|
||||||
|
{
|
||||||
|
LoopCallInBadFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoopCallUnscaledInBadFrame()
|
||||||
|
{
|
||||||
|
bool isLoopCall = false;
|
||||||
|
for (int i = 0, len = _unscaledTimerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
Timer timer = _unscaledTimerList[i];
|
||||||
|
if (timer.isLoop && timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
if (timer.Handler != null)
|
||||||
|
{
|
||||||
|
timer.Handler(timer.Args);
|
||||||
|
}
|
||||||
|
|
||||||
|
timer.curTime += timer.time;
|
||||||
|
if (timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
isLoopCall = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLoopCall)
|
||||||
|
{
|
||||||
|
LoopCallUnscaledInBadFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateTimer(float elapseSeconds)
|
||||||
|
{
|
||||||
|
bool isLoopCall = false;
|
||||||
|
for (int i = 0, len = _timerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
Timer timer = _timerList[i];
|
||||||
|
if (timer.isNeedRemove)
|
||||||
|
{
|
||||||
|
_cacheRemoveTimers.Add(i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!timer.isRunning) continue;
|
||||||
|
timer.curTime -= elapseSeconds;
|
||||||
|
if (timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
if (timer.Handler != null)
|
||||||
|
{
|
||||||
|
timer.Handler(timer.Args);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timer.isLoop)
|
||||||
|
{
|
||||||
|
timer.curTime += timer.time;
|
||||||
|
if (timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
isLoopCall = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_cacheRemoveTimers.Add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = _cacheRemoveTimers.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
_timerList.RemoveAt(_cacheRemoveTimers[i]);
|
||||||
|
_cacheRemoveTimers.RemoveAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLoopCall)
|
||||||
|
{
|
||||||
|
LoopCallInBadFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateUnscaledTimer(float realElapseSeconds)
|
||||||
|
{
|
||||||
|
bool isLoopCall = false;
|
||||||
|
for (int i = 0, len = _unscaledTimerList.Count; i < len; i++)
|
||||||
|
{
|
||||||
|
Timer timer = _unscaledTimerList[i];
|
||||||
|
if (timer.isNeedRemove)
|
||||||
|
{
|
||||||
|
_cacheRemoveUnscaledTimers.Add(i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!timer.isRunning) continue;
|
||||||
|
timer.curTime -= realElapseSeconds;
|
||||||
|
if (timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
if (timer.Handler != null)
|
||||||
|
{
|
||||||
|
timer.Handler(timer.Args);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timer.isLoop)
|
||||||
|
{
|
||||||
|
timer.curTime += timer.time;
|
||||||
|
if (timer.curTime <= 0)
|
||||||
|
{
|
||||||
|
isLoopCall = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_cacheRemoveUnscaledTimers.Add(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = _cacheRemoveUnscaledTimers.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
_unscaledTimerList.RemoveAt(_cacheRemoveUnscaledTimers[i]);
|
||||||
|
_cacheRemoveUnscaledTimers.RemoveAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isLoopCall)
|
||||||
|
{
|
||||||
|
LoopCallUnscaledInBadFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly List<System.Timers.Timer> _ticker = new List<System.Timers.Timer>();
|
||||||
|
|
||||||
|
public System.Timers.Timer AddSystemTimer(Action<object, System.Timers.ElapsedEventArgs> callBack)
|
||||||
|
{
|
||||||
|
int interval = 1000;
|
||||||
|
var timerTick = new System.Timers.Timer(interval);
|
||||||
|
timerTick.AutoReset = true;
|
||||||
|
timerTick.Enabled = true;
|
||||||
|
timerTick.Elapsed += new System.Timers.ElapsedEventHandler(callBack);
|
||||||
|
|
||||||
|
_ticker.Add(timerTick);
|
||||||
|
|
||||||
|
return timerTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DestroySystemTimer()
|
||||||
|
{
|
||||||
|
foreach (var ticker in _ticker)
|
||||||
|
{
|
||||||
|
if (ticker != null)
|
||||||
|
{
|
||||||
|
ticker.Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void IModuleUpdate.Update(float elapseSeconds, float realElapseSeconds)
|
||||||
|
{
|
||||||
|
UpdateTimer(elapseSeconds);
|
||||||
|
UpdateUnscaledTimer(realElapseSeconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
void IModule.Dispose()
|
void IModule.Dispose()
|
||||||
{
|
{
|
||||||
lock (Locker)
|
RemoveAllTimer();
|
||||||
{
|
DestroySystemTimer();
|
||||||
this._toRemove.Clear();
|
|
||||||
this._toAdd.Clear();
|
|
||||||
this._items.Clear();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
public int Priority { get; }
|
||||||
/// 添加一个定时调用的任务
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="interval">间隔时间(以秒为单位)</param>
|
|
||||||
/// <param name="repeat">重复次数(0 表示无限重复)</param>
|
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
|
||||||
/// <param name="callbackParam">回调函数的参数(可选)</param>
|
|
||||||
public void Add(float interval, int repeat, Action<object> callback, object callbackParam = null)
|
|
||||||
{
|
|
||||||
lock (Locker)
|
|
||||||
{
|
|
||||||
if (callback == null)
|
|
||||||
{
|
|
||||||
Debug.LogWarning("timer callback is null, " + interval + "," + repeat);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (_items.TryGetValue(callback, out var t))
|
|
||||||
{
|
|
||||||
t.Set(interval, repeat, callback, callbackParam);
|
|
||||||
t.Elapsed = 0;
|
|
||||||
t.Deleted = false;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_toAdd.TryGetValue(callback, out t))
|
|
||||||
{
|
|
||||||
t.Set(interval, repeat, callback, callbackParam);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
t = GetFromPool();
|
|
||||||
t.Interval = interval;
|
|
||||||
t.Repeat = repeat;
|
|
||||||
t.Callback = callback;
|
|
||||||
t.Param = callbackParam;
|
|
||||||
_toAdd[callback] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 添加一个只执行一次的任务
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="interval">间隔时间(以秒为单位)</param>
|
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
|
||||||
/// <param name="callbackParam">回调函数的参数(可选)</param>
|
|
||||||
public void AddOnce(float interval, Action<object> callback, object callbackParam = null)
|
|
||||||
{
|
|
||||||
Add(interval, 1, callback, callbackParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 添加一个每帧更新执行的任务
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
|
||||||
public void AddUpdate(Action<object> callback)
|
|
||||||
{
|
|
||||||
Add(0.001f, 0, callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 添加一个每帧更新执行的任务
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="callback">要执行的回调函数</param>
|
|
||||||
/// <param name="callbackParam">回调函数的参数</param>
|
|
||||||
public void AddUpdate(Action<object> callback, object callbackParam)
|
|
||||||
{
|
|
||||||
Add(0.001f, 0, callback, callbackParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 检查指定的任务是否存在
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="callback">要检查的回调函数</param>
|
|
||||||
/// <returns>存在返回 true,不存在返回 false</returns>
|
|
||||||
public bool Exists(Action<object> callback)
|
|
||||||
{
|
|
||||||
lock (Locker)
|
|
||||||
{
|
|
||||||
if (_toAdd.ContainsKey(callback))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (_items.TryGetValue(callback, out var at))
|
|
||||||
{
|
|
||||||
return !at.Deleted;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 移除指定的任务
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="callback">要移除的回调函数</param>
|
|
||||||
public void Remove(Action<object> callback)
|
|
||||||
{
|
|
||||||
lock (Locker)
|
|
||||||
{
|
|
||||||
if (_toAdd.TryGetValue(callback, out var t))
|
|
||||||
{
|
|
||||||
_toAdd.Remove(callback);
|
|
||||||
ReturnToPool(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_items.TryGetValue(callback, out t))
|
|
||||||
{
|
|
||||||
t.Deleted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private TimerItem GetFromPool()
|
|
||||||
{
|
|
||||||
TimerItem t;
|
|
||||||
int cnt = _pool.Count;
|
|
||||||
if (cnt > 0)
|
|
||||||
{
|
|
||||||
t = _pool[cnt - 1];
|
|
||||||
_pool.RemoveAt(cnt - 1);
|
|
||||||
t.Deleted = false;
|
|
||||||
t.Elapsed = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
t = new TimerItem();
|
|
||||||
}
|
|
||||||
|
|
||||||
return t;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void ReturnToPool(TimerItem t)
|
|
||||||
{
|
|
||||||
t.Callback = null;
|
|
||||||
_pool.Add(t);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int Priority
|
|
||||||
{
|
|
||||||
get => 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 获取所有正在运行的定时器的信息
|
|
||||||
/// </summary>
|
|
||||||
/// <returns>一个列表,其中包含每个定时器的信息</returns>
|
|
||||||
public List<TimerInfo> GetTimerInfos()
|
|
||||||
{
|
|
||||||
List<TimerInfo> timerInfos = new List<TimerInfo>();
|
|
||||||
|
|
||||||
lock (Locker)
|
|
||||||
{
|
|
||||||
foreach (var timerItem in _items.Values)
|
|
||||||
{
|
|
||||||
if (!timerItem.Deleted) // 确保定时器未被删除
|
|
||||||
{
|
|
||||||
timerInfos.Add(new TimerInfo
|
|
||||||
{
|
|
||||||
Interval = timerItem.Interval,
|
|
||||||
Repeat = timerItem.Repeat,
|
|
||||||
Elapsed = timerItem.Elapsed,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return timerInfos;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"name": "AlicizaX.UI.Editor",
|
||||||
|
"rootNamespace": "AlicizaX.UI.Editor",
|
||||||
|
"references": [
|
||||||
|
"GUID:acfef7cabed3b0a42b25edb1cd4fa259",
|
||||||
|
"GUID:e9c35c8938f782649bb7e670099ca425"
|
||||||
|
],
|
||||||
|
"includePlatforms": [
|
||||||
|
"Editor"
|
||||||
|
],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": true,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e4779686214cb2842afa52039398a499
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Editor/Assets.meta
Normal file
8
Client/Packages/com.alicizax.unity.ui/Editor/Assets.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9d6ac7f882627044b9ce79413cc6b70d
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!114 &11400000
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 0}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: b212f141eb1bc7b4d97c4dc8b938bc5f, type: 3}
|
||||||
|
m_Name: UIGenerateGlobalSettings
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
scriptGenerateRule:
|
||||||
|
- uiElementRegex: Obj
|
||||||
|
componentName: GameObject
|
||||||
|
- uiElementRegex: Item
|
||||||
|
componentName: GameObject
|
||||||
|
- uiElementRegex: Tf
|
||||||
|
componentName: Transform
|
||||||
|
- uiElementRegex: Rect
|
||||||
|
componentName: RectTransform
|
||||||
|
- uiElementRegex: Btn
|
||||||
|
componentName: Button
|
||||||
|
- uiElementRegex: Img
|
||||||
|
componentName: Image
|
||||||
|
- uiElementRegex: RImg
|
||||||
|
componentName: RawImage
|
||||||
|
- uiElementRegex: Scrollbar
|
||||||
|
componentName: Scrollbar
|
||||||
|
- uiElementRegex: ScrollRect
|
||||||
|
componentName: ScrollRect
|
||||||
|
- uiElementRegex: GridLayout
|
||||||
|
componentName: GridLayoutGroup
|
||||||
|
- uiElementRegex: HLayout
|
||||||
|
componentName: HorizontalLayoutGroup
|
||||||
|
- uiElementRegex: VLayout
|
||||||
|
componentName: VerticalLayoutGroup
|
||||||
|
- uiElementRegex: Slider
|
||||||
|
componentName: Slider
|
||||||
|
- uiElementRegex: TogGroup
|
||||||
|
componentName: ToggleGroup
|
||||||
|
- uiElementRegex: AnimationCurve
|
||||||
|
componentName: AnimationCurve
|
||||||
|
- uiElementRegex: CanvasGroup
|
||||||
|
componentName: CanvasGroup
|
||||||
|
- uiElementRegex: Input
|
||||||
|
componentName: TMP_InputField
|
||||||
|
- uiElementRegex: Text
|
||||||
|
componentName: TextMeshProUGUI
|
||||||
|
- uiElementRegex: Video
|
||||||
|
componentName: VideoPlayer
|
||||||
|
- uiElementRegex: SBtn
|
||||||
|
componentName: UIButtonSuper
|
||||||
|
- uiElementRegex: STBtn
|
||||||
|
componentName: UIButtonSuperText
|
||||||
|
- uiElementRegex: 3DDisplay
|
||||||
|
componentName: UI3DDisplay
|
||||||
|
- uiElementRegex: Mask2D
|
||||||
|
componentName: RectMask2D
|
||||||
|
- uiElementRegex: LText
|
||||||
|
componentName: Text
|
||||||
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 49e650f120e0eb443855b745d735c2db
|
||||||
|
NativeFormatImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
mainObjectFileID: 11400000
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c775eb6a6aca4533bc75c89ef7a219a1
|
||||||
|
timeCreated: 1737704983
|
||||||
@ -0,0 +1,61 @@
|
|||||||
|
using AlicizaX.Editor;
|
||||||
|
using AlicizaX.UI.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace AlicizaX.UI.Editor
|
||||||
|
{
|
||||||
|
[CustomEditor(typeof(UIComponent))]
|
||||||
|
internal sealed class UIComponentInspector : ComponentTypeComponentInspector
|
||||||
|
{
|
||||||
|
private SerializedProperty uiRoot;
|
||||||
|
|
||||||
|
|
||||||
|
public override void OnInspectorGUI()
|
||||||
|
{
|
||||||
|
base.OnInspectorGUI();
|
||||||
|
serializedObject.Update();
|
||||||
|
|
||||||
|
EditorGUI.BeginDisabledGroup(EditorApplication.isPlayingOrWillChangePlaymode);
|
||||||
|
{
|
||||||
|
if (uiRoot.objectReferenceValue == null)
|
||||||
|
{
|
||||||
|
EditorGUILayout.HelpBox("uiroot can not be null!", MessageType.Error);
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorGUILayout.BeginHorizontal();
|
||||||
|
|
||||||
|
GameObject rootPrefab = (GameObject)EditorGUILayout.ObjectField("UI根预设", uiRoot.objectReferenceValue, typeof(GameObject));
|
||||||
|
|
||||||
|
if (rootPrefab != uiRoot.objectReferenceValue)
|
||||||
|
{
|
||||||
|
uiRoot.objectReferenceValue = rootPrefab;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uiRoot.objectReferenceValue == null)
|
||||||
|
{
|
||||||
|
if (GUILayout.Button("设置默认"))
|
||||||
|
{
|
||||||
|
GameObject defaultPrefab = AssetDatabase.LoadAssetAtPath<GameObject>("Packages/com.alicizax.unity.ui/Resources/UIRoot.prefab");
|
||||||
|
uiRoot.objectReferenceValue = defaultPrefab;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorGUILayout.EndHorizontal();
|
||||||
|
}
|
||||||
|
EditorGUI.EndDisabledGroup();
|
||||||
|
serializedObject.ApplyModifiedProperties();
|
||||||
|
Repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void RefreshTypeNames()
|
||||||
|
{
|
||||||
|
RefreshComponentTypeNames(typeof(IUIManager));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Enable()
|
||||||
|
{
|
||||||
|
uiRoot = serializedObject.FindProperty("uiRoot");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6c8dd72e28584576864a33af24255060
|
||||||
|
timeCreated: 1737704960
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 2f54df36513f40bd80b00f7149741495
|
||||||
|
timeCreated: 1737704936
|
||||||
@ -0,0 +1,956 @@
|
|||||||
|
#if UNITY_EDITOR
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Reflection;
|
||||||
|
using System.Text;
|
||||||
|
using AlicizaX.UI.Runtime;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using Object = UnityEngine.Object;
|
||||||
|
|
||||||
|
namespace AlicizaX.UI.Editor
|
||||||
|
{
|
||||||
|
internal static class ScriptGenerator
|
||||||
|
{
|
||||||
|
private static UIGenerateGlobalSettings m_GenerateGlobalSetting;
|
||||||
|
public static string UIGenerateGlobalSettingPath = $"Assets/AlicizaFramework/UISetting/UIGenerateGlobalSettings.asset";
|
||||||
|
|
||||||
|
const string RegisterUIHelper = "Assets/GameScripts/HotFix/GameLogic/Runtime/UI";
|
||||||
|
const string RegisterUIHelperMain = "Assets/GameScripts/Main/Launcher/Scripts";
|
||||||
|
|
||||||
|
|
||||||
|
#region 热更工程目录
|
||||||
|
|
||||||
|
//Bind文件存放根路径
|
||||||
|
const string BindComponetsSavePath = "Assets/GameScripts/HotFix/GameLogic/Runtime/UI/BindComponents";
|
||||||
|
|
||||||
|
//界面逻辑文件存放根路径
|
||||||
|
const string UILogicSavePath = "Assets/GameScripts/HotFix/GameLogic/Runtime/UI/View";
|
||||||
|
|
||||||
|
//预制体存放根路径
|
||||||
|
const string UIPrefabSavePath = "Assets/AssetRaw/UI";
|
||||||
|
public const string HotfixNameSpace = "GameLogic.UI";
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region 主工程目录
|
||||||
|
|
||||||
|
//Bind文件存放根路径
|
||||||
|
const string BindComponetsMainSavePath = "Assets/GameScripts/Main/Launcher/Scripts/UI/BindComponents";
|
||||||
|
|
||||||
|
//界面逻辑文件存放根路径
|
||||||
|
const string UILogicMainSavePath = "Assets/GameScripts/Main/Launcher/Scripts/UI/View";
|
||||||
|
|
||||||
|
//预制体存放根路径
|
||||||
|
const string UIPrefabMainSavePath = "Assets/GameScripts/Main/Launcher/Resources";
|
||||||
|
|
||||||
|
public const string MainNameSpace = "GameMain.UI";
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
static string WindowPrefabSavePath = Path.Combine(UIPrefabSavePath, "UIWindow");
|
||||||
|
static string WidgetPrefabSavePath = Path.Combine(UIPrefabSavePath, "UIWidget");
|
||||||
|
static string ViewPrefabSavePath = Path.Combine(UIPrefabSavePath, "UIView");
|
||||||
|
|
||||||
|
static string WindowBindSavePath = Path.Combine(BindComponetsSavePath, "Window");
|
||||||
|
static string WidgetBindSavePath = Path.Combine(BindComponetsSavePath, "Widget");
|
||||||
|
static string ViewBindSavePath = Path.Combine(BindComponetsSavePath, "View");
|
||||||
|
|
||||||
|
static string WindowLogicSavePath = Path.Combine(UILogicSavePath, "Window");
|
||||||
|
static string WidgetLogicSavePath = Path.Combine(UILogicSavePath, "Widget");
|
||||||
|
static string ViewLogicSavePath = Path.Combine(UILogicSavePath, "View");
|
||||||
|
|
||||||
|
static string ScriptsNameSpace = "GameLogic.UI";
|
||||||
|
|
||||||
|
static void SwitchHotFitRootPath(UIBindComponent bindComponent)
|
||||||
|
{
|
||||||
|
bool isHotfix = bindComponent.ResLoadType == EUIResLoadType.AssetBundle;
|
||||||
|
WindowPrefabSavePath = Path.Combine(isHotfix ? UIPrefabSavePath : UIPrefabMainSavePath, "UIWindow");
|
||||||
|
WidgetPrefabSavePath = Path.Combine(isHotfix ? UIPrefabSavePath : UIPrefabMainSavePath, "UIWidget");
|
||||||
|
ViewPrefabSavePath = Path.Combine(isHotfix ? UIPrefabSavePath : UIPrefabMainSavePath, "UIView");
|
||||||
|
|
||||||
|
WindowBindSavePath = Path.Combine(isHotfix ? BindComponetsSavePath : BindComponetsMainSavePath, "Window");
|
||||||
|
WidgetBindSavePath = Path.Combine(isHotfix ? BindComponetsSavePath : BindComponetsMainSavePath, "Widget");
|
||||||
|
ViewBindSavePath = Path.Combine(isHotfix ? BindComponetsSavePath : BindComponetsMainSavePath, "View");
|
||||||
|
|
||||||
|
WindowLogicSavePath = Path.Combine(isHotfix ? UILogicSavePath : UILogicMainSavePath, "Window");
|
||||||
|
WidgetLogicSavePath = Path.Combine(isHotfix ? UILogicSavePath : UILogicMainSavePath, "Widget");
|
||||||
|
ViewLogicSavePath = Path.Combine(isHotfix ? UILogicSavePath : UILogicMainSavePath, "View");
|
||||||
|
ScriptsNameSpace = isHotfix ? HotfixNameSpace : MainNameSpace;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GenerateUIRegisterHelper(Assembly assembly, string path)
|
||||||
|
{
|
||||||
|
// 获取程序集中的所有类型
|
||||||
|
var types = assembly.GetTypes();
|
||||||
|
List<Type> eventTypes = new List<Type>();
|
||||||
|
// 遍历每个类型
|
||||||
|
foreach (Type type in types)
|
||||||
|
{
|
||||||
|
// 检查类型是否是接口
|
||||||
|
if (type.IsInterface)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var attribute = Attribute.GetCustomAttribute(type, typeof(WindowAttribute)) as WindowAttribute;
|
||||||
|
|
||||||
|
if (attribute != null)
|
||||||
|
{
|
||||||
|
eventTypes.Add(type);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var filePath = Path.Combine(path, "UIRegisterHelper.cs");
|
||||||
|
|
||||||
|
using (StreamWriter sw = new StreamWriter(filePath))
|
||||||
|
{
|
||||||
|
sw.WriteLine("using AlicizaFramework;");
|
||||||
|
sw.WriteLine($"namespace {ScriptsNameSpace}");
|
||||||
|
sw.WriteLine("{");
|
||||||
|
sw.WriteLine("\tpublic static class UIRegisterHelper");
|
||||||
|
sw.WriteLine("\t{");
|
||||||
|
|
||||||
|
sw.WriteLine("\t\tpublic static void Initlize()");
|
||||||
|
sw.WriteLine("\t\t{\n");
|
||||||
|
|
||||||
|
foreach (var type in eventTypes)
|
||||||
|
{
|
||||||
|
sw.WriteLine($"\t\t\tUICacheRegister.Register<{type.FullName}>();\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
sw.WriteLine("\t\t}");
|
||||||
|
sw.WriteLine("\t}");
|
||||||
|
sw.WriteLine("}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void GenerateUIRegisterHelper()
|
||||||
|
{
|
||||||
|
// Assembly mainAssembly = Assembly.GetAssembly(typeof(DisStripCode));
|
||||||
|
// GenerateUIRegisterHelper(mainAssembly, RegisterUIHelperMain);
|
||||||
|
//
|
||||||
|
// Assembly hotfixAssembly = Assembly.GetAssembly(typeof(GameLogic.GameModule));
|
||||||
|
// GenerateUIRegisterHelper(hotfixAssembly, RegisterUIHelper);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static UIGenerateGlobalSettings UIGenerateGlobalSetting
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (m_GenerateGlobalSetting == null)
|
||||||
|
{
|
||||||
|
m_GenerateGlobalSetting = AssetDatabase.LoadAssetAtPath<UIGenerateGlobalSettings>(UIGenerateGlobalSettingPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_GenerateGlobalSetting;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void GenerateUIPanelScript(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
SwitchHotFitRootPath(uiBindComponent);
|
||||||
|
uiBindComponent.ScriptName = uiBindComponent.gameObject.name;
|
||||||
|
if (uiBindComponent.ResLoadType == EUIResLoadType.Resources)
|
||||||
|
{
|
||||||
|
uiBindComponent.Location = "UI" + uiBindComponent.UIType + "/" + uiBindComponent.gameObject.name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uiBindComponent.Location = uiBindComponent.gameObject.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (uiBindComponent.UIType == UIType.Window)
|
||||||
|
{
|
||||||
|
SaveAllChildWidgets(uiBindComponent);
|
||||||
|
CreateUIScript(uiBindComponent);
|
||||||
|
CreateWndUIPrefab(uiBindComponent);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CreateUIWidgetScript(uiBindComponent);
|
||||||
|
CreateWidgetUIPrefab(uiBindComponent);
|
||||||
|
}
|
||||||
|
|
||||||
|
GenerateUIRegisterHelper();
|
||||||
|
|
||||||
|
AssetDatabase.Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void SaveAllChildWidgets(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
List<UIBindComponent> childWidgets = new List<UIBindComponent>();
|
||||||
|
CheckIsSaveWidget(uiBindComponent.transform, ref childWidgets);
|
||||||
|
|
||||||
|
string CombineName = "包含多个组件\n";
|
||||||
|
foreach (var VARIABLE in childWidgets)
|
||||||
|
{
|
||||||
|
CombineName += VARIABLE.ScriptName + "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childWidgets.Count > 0)
|
||||||
|
{
|
||||||
|
bool result = EditorUtility.DisplayDialog(
|
||||||
|
"Hello!", // 标题
|
||||||
|
CombineName, // 消息内容
|
||||||
|
"一起生成保存", // 确认按钮
|
||||||
|
"不保存子组件" // 取消按钮(可选)
|
||||||
|
);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
foreach (var VARIABLE in childWidgets)
|
||||||
|
{
|
||||||
|
BindComponent(VARIABLE);
|
||||||
|
GenerateUIPanelScript(VARIABLE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CheckIsSaveWidget(Transform root, ref List<UIBindComponent> childWidegt)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < root.childCount; ++i)
|
||||||
|
{
|
||||||
|
Transform child = root.GetChild(i);
|
||||||
|
if (child.name.IndexOf("widget", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
UIBindComponent childWd = child.GetComponent<UIBindComponent>();
|
||||||
|
if (childWd == null)
|
||||||
|
{
|
||||||
|
Debug.Log("Widget 不包含UIBindComponent 命名不正确" + child.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childWd && string.IsNullOrEmpty(childWd.ScriptName))
|
||||||
|
{
|
||||||
|
Debug.Log("Widget 生成脚本名不正确 检查UIBindComponent " + child.name);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (childWd && !string.IsNullOrEmpty(childWd.ScriptName))
|
||||||
|
{
|
||||||
|
childWidegt.Add(childWd);
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckIsSaveWidget(child, ref childWidegt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region UIView
|
||||||
|
|
||||||
|
private static void CreateUIViewScript(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
string logicFilePath = Path.Combine(ViewLogicSavePath, uiBindComponent.ScriptName + ".cs");
|
||||||
|
string bindFilePath = Path.Combine(ViewBindSavePath, uiBindComponent.ScriptName + ".BindComponents.cs");
|
||||||
|
|
||||||
|
string LogicText = GetWidgetLogicText(uiBindComponent);
|
||||||
|
string bindText = GetWidgetBingComponentLogicText(uiBindComponent);
|
||||||
|
|
||||||
|
if (!Directory.Exists(ViewBindSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(ViewBindSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Directory.Exists(ViewLogicSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(ViewLogicSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
File.WriteAllText(bindFilePath, bindText);
|
||||||
|
File.WriteAllText(logicFilePath, LogicText);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void CreateWidgetUIPrefab(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
string prefabPath = Path.Combine(WidgetPrefabSavePath, uiBindComponent.ScriptName + ".prefab");
|
||||||
|
if (!Directory.Exists(WidgetPrefabSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(WidgetPrefabSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(prefabPath))
|
||||||
|
{
|
||||||
|
File.Delete(prefabPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (uiBindComponent.gameObject)
|
||||||
|
{
|
||||||
|
RectTransform rectTransform = uiBindComponent.gameObject.GetComponent<RectTransform>();
|
||||||
|
if (rectTransform != null)
|
||||||
|
{
|
||||||
|
// 修改RectTransform的锚点
|
||||||
|
rectTransform.localScale = Vector3.one;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PrefabUtility.SaveAsPrefabAsset(uiBindComponent.gameObject, prefabPath);
|
||||||
|
Debug.Log($"{uiBindComponent.ScriptName} Generate Succesd");
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
#region UIWidget
|
||||||
|
|
||||||
|
private static void CreateUIWidgetScript(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
string logicFilePath = Path.Combine(WidgetLogicSavePath, uiBindComponent.ScriptName + ".cs");
|
||||||
|
string bindFilePath = Path.Combine(WidgetBindSavePath, uiBindComponent.ScriptName + ".BindComponents.cs");
|
||||||
|
|
||||||
|
string LogicText = GetWidgetLogicText(uiBindComponent);
|
||||||
|
string bindText = GetWidgetBingComponentLogicText(uiBindComponent);
|
||||||
|
|
||||||
|
if (!Directory.Exists(WidgetBindSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(WidgetBindSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Directory.Exists(WidgetLogicSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(WidgetLogicSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
File.WriteAllText(bindFilePath, bindText);
|
||||||
|
File.WriteAllText(logicFilePath, LogicText);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static void CreateViewUIPrefab(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
string prefabPath = Path.Combine(ViewPrefabSavePath, uiBindComponent.ScriptName + ".prefab");
|
||||||
|
if (!Directory.Exists(ViewPrefabSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(ViewPrefabSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(prefabPath))
|
||||||
|
{
|
||||||
|
File.Delete(prefabPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (uiBindComponent.gameObject)
|
||||||
|
{
|
||||||
|
RectTransform rectTransform = uiBindComponent.gameObject.GetComponent<RectTransform>();
|
||||||
|
if (rectTransform != null)
|
||||||
|
{
|
||||||
|
// 修改RectTransform的锚点
|
||||||
|
rectTransform.localScale = Vector3.one;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
PrefabUtility.SaveAsPrefabAsset(uiBindComponent.gameObject, prefabPath);
|
||||||
|
Debug.Log($"{uiBindComponent.ScriptName} Generate Succesd");
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetWidgetLogicText(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
string logicFilePath = Path.Combine(WidgetLogicSavePath, uiBindComponent.ScriptName + ".cs");
|
||||||
|
string logicRef = "";
|
||||||
|
if (File.Exists(logicFilePath))
|
||||||
|
{
|
||||||
|
logicRef = File.ReadAllText(logicFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder logicTextBuilder = new StringBuilder();
|
||||||
|
var hasLogic = logicRef.Length > 0;
|
||||||
|
if (!hasLogic)
|
||||||
|
{
|
||||||
|
logicTextBuilder.Append("using UnityEngine;\n");
|
||||||
|
logicTextBuilder.Append("using AlicizaFramework;\n\n");
|
||||||
|
logicTextBuilder.Append($"namespace {ScriptsNameSpace}\n");
|
||||||
|
logicTextBuilder.Append("{\n");
|
||||||
|
logicTextBuilder.Append("\tpublic partial class " + uiBindComponent.ScriptName + " \n");
|
||||||
|
logicTextBuilder.Append("\t{\n");
|
||||||
|
|
||||||
|
logicTextBuilder.Append("\n");
|
||||||
|
logicTextBuilder.Append("\t\t#region UIBind事件\n");
|
||||||
|
logicTextBuilder.Append(GetCallBackText(uiBindComponent, logicRef));
|
||||||
|
logicTextBuilder.Append("\n");
|
||||||
|
logicTextBuilder.Append("\t\t#endregion\n\n");
|
||||||
|
|
||||||
|
logicTextBuilder.Append("\n\t}\n");
|
||||||
|
logicTextBuilder.Append("}\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int index = logicRef.ToString().IndexOf("UIBind事件");
|
||||||
|
if (index != -1)
|
||||||
|
{
|
||||||
|
logicTextBuilder.Append(logicRef.Insert(index + 8,
|
||||||
|
"\n" + GetCallBackText(uiBindComponent, logicRef)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("请检查该脚本自动生成关键字#region UIBind事件是否被去除!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return logicTextBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetWidgetBingComponentLogicText(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
StringBuilder bindComponetsBuilder = new StringBuilder();
|
||||||
|
bindComponetsBuilder.Append(GetRefrenceNameSpace(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append($"using AlicizaFramework;\n");
|
||||||
|
bindComponetsBuilder.Append($"namespace {ScriptsNameSpace}\n");
|
||||||
|
bindComponetsBuilder.Append("{\n");
|
||||||
|
bindComponetsBuilder.Append("\tpublic partial class " + uiBindComponent.ScriptName + $" : UIWidget\n");
|
||||||
|
bindComponetsBuilder.Append("\t{\n");
|
||||||
|
|
||||||
|
// 脚本工具生成的代码
|
||||||
|
bindComponetsBuilder.Append("\t\t#region 脚本工具生成的代码\n");
|
||||||
|
bindComponetsBuilder.Append(GetVarText(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append("\t\tprotected override void OnBindUIComponents()\n");
|
||||||
|
bindComponetsBuilder.Append("\t\t{\n");
|
||||||
|
bindComponetsBuilder.Append("\t\t\tInitBindComponent();\n");
|
||||||
|
bindComponetsBuilder.Append(GetBindText(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append(GetBindUIEvent(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append("\t\t}\n");
|
||||||
|
bindComponetsBuilder.Append("\t\t#endregion");
|
||||||
|
bindComponetsBuilder.Append("\n\t}\n");
|
||||||
|
bindComponetsBuilder.Append("}\n");
|
||||||
|
|
||||||
|
return bindComponetsBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
public static void CreateWndUIPrefab(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
string prefabPath = Path.Combine(WindowPrefabSavePath, uiBindComponent.ScriptName + ".prefab");
|
||||||
|
if (!Directory.Exists(WindowPrefabSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(WindowPrefabSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (File.Exists(prefabPath))
|
||||||
|
{
|
||||||
|
File.Delete(prefabPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (uiBindComponent.gameObject)
|
||||||
|
{
|
||||||
|
var prefabClone = GameObject.Instantiate(uiBindComponent.gameObject, uiBindComponent.transform.parent);
|
||||||
|
prefabClone.name = uiBindComponent.ScriptName;
|
||||||
|
RemoveChildWidget(prefabClone.transform);
|
||||||
|
|
||||||
|
|
||||||
|
RectTransform rectTransform = prefabClone.gameObject.GetComponent<RectTransform>();
|
||||||
|
if (rectTransform != null)
|
||||||
|
{
|
||||||
|
// 修改RectTransform的锚点
|
||||||
|
rectTransform.pivot = new Vector2(0.5f, 0.5f);
|
||||||
|
rectTransform.anchorMin = Vector2.zero;
|
||||||
|
rectTransform.anchorMax = Vector2.one;
|
||||||
|
rectTransform.offsetMin = Vector2.zero;
|
||||||
|
rectTransform.offsetMax = Vector2.zero;
|
||||||
|
rectTransform.localScale = Vector3.one;
|
||||||
|
// rectTransform.anchoredPosition = Vector2.zero;
|
||||||
|
// rectTransform.position = Vector3.zero;
|
||||||
|
}
|
||||||
|
|
||||||
|
PrefabUtility.SaveAsPrefabAsset(prefabClone.gameObject, prefabPath);
|
||||||
|
Debug.Log($"{uiBindComponent.ScriptName} Generate Succesd");
|
||||||
|
Object.DestroyImmediate(prefabClone);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void RemoveChildWidget(Transform root)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < root.childCount; ++i)
|
||||||
|
{
|
||||||
|
Transform child = root.GetChild(i);
|
||||||
|
if (child.name.IndexOf("widget", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
Debug.Log("包含子Widget 移除保存" + child.name);
|
||||||
|
GameObject.DestroyImmediate(child.gameObject);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
RemoveChildWidget(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void CreateUIScript(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
string logicFilePath = Path.Combine(WindowLogicSavePath, uiBindComponent.ScriptName + ".cs");
|
||||||
|
string bindFilePath = Path.Combine(WindowBindSavePath, uiBindComponent.ScriptName + ".BindComponents.cs");
|
||||||
|
|
||||||
|
string LogicText = GetUILogicText(uiBindComponent);
|
||||||
|
string bindText = GetUIBingComponentLogicText(uiBindComponent);
|
||||||
|
|
||||||
|
string attributeResText = $"[UIRes(location: \"{uiBindComponent.Location}\" , EUIResLoadType.{uiBindComponent.ResLoadType})]\n";
|
||||||
|
string attributeText = $"\t[Window(UILayer.{uiBindComponent.UILayer}, fullScreen:{uiBindComponent.FullScreen.ToString().ToLower()} , delayedClose:{uiBindComponent.CacheDuration.ToString()})]\n";
|
||||||
|
bindText = bindText.Replace("#AttributeMark", attributeResText + attributeText);
|
||||||
|
|
||||||
|
|
||||||
|
if (!Directory.Exists(WindowBindSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(WindowBindSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Directory.Exists(WindowLogicSavePath))
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(WindowLogicSavePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
File.WriteAllText(bindFilePath, bindText);
|
||||||
|
File.WriteAllText(logicFilePath, LogicText);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetUILogicText(UIBindComponent uiBindComponent,
|
||||||
|
bool isHotfixProject = true)
|
||||||
|
{
|
||||||
|
string logicFilePath = Path.Combine(WindowLogicSavePath, uiBindComponent.ScriptName + ".cs");
|
||||||
|
string logicRef = "";
|
||||||
|
if (File.Exists(logicFilePath))
|
||||||
|
{
|
||||||
|
logicRef = File.ReadAllText(logicFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder logicTextBuilder = new StringBuilder();
|
||||||
|
var hasLogic = logicRef.Length > 0;
|
||||||
|
if (!hasLogic)
|
||||||
|
{
|
||||||
|
logicTextBuilder.Append("using UnityEngine;\n");
|
||||||
|
logicTextBuilder.Append("using AlicizaFramework;\n\n");
|
||||||
|
logicTextBuilder.Append($"namespace {ScriptsNameSpace}\n");
|
||||||
|
logicTextBuilder.Append("{\n");
|
||||||
|
logicTextBuilder.Append("\tpartial class " + uiBindComponent.ScriptName + " \n");
|
||||||
|
logicTextBuilder.Append("\t{\n");
|
||||||
|
|
||||||
|
logicTextBuilder.Append("\n");
|
||||||
|
logicTextBuilder.Append("\t\t#region UIBind事件\n");
|
||||||
|
logicTextBuilder.Append(GetCallBackText(uiBindComponent, logicRef));
|
||||||
|
logicTextBuilder.Append("\n");
|
||||||
|
logicTextBuilder.Append("\t\t#endregion\n\n");
|
||||||
|
|
||||||
|
logicTextBuilder.Append(GetLogicLifeText(uiBindComponent));
|
||||||
|
|
||||||
|
|
||||||
|
logicTextBuilder.Append("\n\t}\n");
|
||||||
|
logicTextBuilder.Append("}\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int index = logicRef.ToString().IndexOf("UIBind事件");
|
||||||
|
if (index != -1)
|
||||||
|
{
|
||||||
|
logicTextBuilder.Append(logicRef.Insert(index + 8,
|
||||||
|
"\n" + GetCallBackText(uiBindComponent, logicRef)));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
logicTextBuilder.Append(logicRef.ToString());
|
||||||
|
Debug.LogWarning("该脚本自动生成关键字#region UIBind事件被去除 不进行追加UI事件");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return logicTextBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建部分类 xxxUI.BindComponetns
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiBindComponent"></param>
|
||||||
|
/// <param name="isHotfixProject"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetUIBingComponentLogicText(UIBindComponent uiBindComponent, bool isHotfixProject = true)
|
||||||
|
{
|
||||||
|
StringBuilder bindComponetsBuilder = new StringBuilder();
|
||||||
|
bindComponetsBuilder.Append(GetRefrenceNameSpace(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append($"using AlicizaFramework;\n");
|
||||||
|
bindComponetsBuilder.Append($"namespace {ScriptsNameSpace}\n");
|
||||||
|
bindComponetsBuilder.Append("{\n");
|
||||||
|
bindComponetsBuilder.Append("\t#AttributeMark");
|
||||||
|
bindComponetsBuilder.Append("\tpartial class " + uiBindComponent.ScriptName + " : UIWindow\n");
|
||||||
|
bindComponetsBuilder.Append("\t{\n");
|
||||||
|
|
||||||
|
// 脚本工具生成的代码
|
||||||
|
bindComponetsBuilder.Append("\t\t#region 脚本工具生成的代码\n");
|
||||||
|
bindComponetsBuilder.Append(GetVarText(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append("\t\tprotected override void OnBindUIComponents()\n");
|
||||||
|
bindComponetsBuilder.Append("\t\t{\n");
|
||||||
|
bindComponetsBuilder.Append("\t\t\tInitBindComponent();\n");
|
||||||
|
bindComponetsBuilder.Append(GetBindText(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append(GetBindUIEvent(uiBindComponent));
|
||||||
|
bindComponetsBuilder.Append("\t\t}\n");
|
||||||
|
bindComponetsBuilder.Append("\t\t#endregion");
|
||||||
|
bindComponetsBuilder.Append("\n\t}\n");
|
||||||
|
bindComponetsBuilder.Append("}\n");
|
||||||
|
|
||||||
|
return bindComponetsBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有组件的对应命名空间引用
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiBindComponent"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetRefrenceNameSpace(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
StringBuilder refrenceNameSpaceBuilder = new StringBuilder();
|
||||||
|
List<string> nameSpaces = new List<string>();
|
||||||
|
for (int i = 0; i < uiBindComponent.bindComponents.Count; i++)
|
||||||
|
{
|
||||||
|
var nameSpace = uiBindComponent.Elements[i].BindCom.GetType().Namespace;
|
||||||
|
if (!nameSpaces.Contains(nameSpace))
|
||||||
|
{
|
||||||
|
nameSpaces.Add(nameSpace);
|
||||||
|
refrenceNameSpaceBuilder.Append($"using {nameSpace};\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return refrenceNameSpaceBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有绑定组件的引用
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiBindComponent"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetBindText(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
StringBuilder bindTextBuilder = new StringBuilder();
|
||||||
|
for (int i = 0; i < uiBindComponent.bindComponents.Count; i++)
|
||||||
|
{
|
||||||
|
var varName = uiBindComponent.Elements[i].Name;
|
||||||
|
var varType = uiBindComponent.Elements[i].BindCom.GetType().Name;
|
||||||
|
switch (varType)
|
||||||
|
{
|
||||||
|
case "GameObject":
|
||||||
|
bindTextBuilder.Append(
|
||||||
|
$"\t\t\t{varName} = FChild<{varType}>({i}).gameObject;\n");
|
||||||
|
break;
|
||||||
|
case "RichItemIcon":
|
||||||
|
bindTextBuilder.Append(
|
||||||
|
$"\t\t\t{varName} = CreateWidgetByType<{varType}>(FChild(\"{varName}\"));\n");
|
||||||
|
break;
|
||||||
|
case "RedNoteWidget":
|
||||||
|
break;
|
||||||
|
case "TextButtonItem":
|
||||||
|
case "SwitchTabItem":
|
||||||
|
case "UIActorWidget":
|
||||||
|
case "UIEffectWidget":
|
||||||
|
case "UISpineWidget":
|
||||||
|
case "UIMainPlayerWidget":
|
||||||
|
bindTextBuilder.Append(
|
||||||
|
$"\t\t\t{varName} = CreateWidget<{varType}>(FChild(\"{varName}\").gameObject);\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
bindTextBuilder.Append(
|
||||||
|
$"\t\t\t{varName} = FChild<{varType}>({i});\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bindTextBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有组件的引用
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiBindComponent"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetVarText(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
StringBuilder varTextBuilder = new StringBuilder();
|
||||||
|
for (int i = 0; i < uiBindComponent.bindComponents.Count; i++)
|
||||||
|
{
|
||||||
|
var varName = uiBindComponent.Elements[i].Name;
|
||||||
|
varTextBuilder.Append("\t\tprivate " + uiBindComponent.Elements[i].BindCom.GetType().Name + " " + varName + ";\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return varTextBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有组件的绑定事件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiBindComponent"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetBindUIEvent(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
StringBuilder bingUIEventBuilder = new StringBuilder();
|
||||||
|
for (int i = 0; i < uiBindComponent.bindComponents.Count; i++)
|
||||||
|
{
|
||||||
|
var varName = uiBindComponent.Elements[i].SplitName;
|
||||||
|
var comName = uiBindComponent.Elements[i].Name;
|
||||||
|
var varType = uiBindComponent.Elements[i].BindCom.GetType().Name;
|
||||||
|
if (varType == "Button" || varType == "UIButtonSuper" || varType == "UIButtonSuperText")
|
||||||
|
{
|
||||||
|
string varFuncName = GetBtnFuncName(varName);
|
||||||
|
bingUIEventBuilder.Append($"\t\t\t{comName}.onClick.AddListener({varFuncName});\n");
|
||||||
|
}
|
||||||
|
else if (varType == "Toggle")
|
||||||
|
{
|
||||||
|
string varFuncName = GetToggleFuncName(varName);
|
||||||
|
bingUIEventBuilder.Append($"\t\t\t{comName}.onValueChanged.AddListener({varFuncName});\n");
|
||||||
|
}
|
||||||
|
else if (varType == "Slider")
|
||||||
|
{
|
||||||
|
string varFuncName = GetSliderFuncName(varName);
|
||||||
|
bingUIEventBuilder.Append($"\t\t\t{comName}.onValueChanged.AddListener({varFuncName});\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bingUIEventBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取所有组件的绑定回调
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiBindComponent"></param>
|
||||||
|
/// <param name="logicRef"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetCallBackText(UIBindComponent uiBindComponent, string logicRef)
|
||||||
|
{
|
||||||
|
StringBuilder callBackText = new StringBuilder();
|
||||||
|
for (int i = 0; i < uiBindComponent.bindComponents.Count; i++)
|
||||||
|
{
|
||||||
|
var varName = uiBindComponent.Elements[i].SplitName;
|
||||||
|
var varType = uiBindComponent.Elements[i].BindCom.GetType().Name;
|
||||||
|
if (varType == "Button" || varType == "UIButtonSuper" || varType == "UIButtonSuperText")
|
||||||
|
{
|
||||||
|
string varFuncName = GetBtnFuncName(varName);
|
||||||
|
if (!logicRef.Contains(varFuncName))
|
||||||
|
{
|
||||||
|
callBackText.Append($"\t\tprivate void {varFuncName}()\n");
|
||||||
|
callBackText.Append("\t\t{\n\t\t}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (varType == "Toggle")
|
||||||
|
{
|
||||||
|
string varFuncName = GetToggleFuncName(varName);
|
||||||
|
if (!logicRef.Contains(varFuncName))
|
||||||
|
{
|
||||||
|
callBackText.Append($"\t\tprivate void {varFuncName}(bool isOn)\n");
|
||||||
|
callBackText.Append("\t\t{\n\t\t}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (varType == "Slider")
|
||||||
|
{
|
||||||
|
string varFuncName = GetSliderFuncName(varName);
|
||||||
|
if (!logicRef.Contains(varFuncName))
|
||||||
|
{
|
||||||
|
callBackText.Append($"\t\tprivate void {varFuncName}(float valFue)\n");
|
||||||
|
callBackText.Append("\t\t{\n\t\t}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return callBackText.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 构建脚本生命周期
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="uiBindComponent"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private static string GetLogicLifeText(UIBindComponent uiBindComponent)
|
||||||
|
{
|
||||||
|
StringBuilder lifeTextBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
//觉得还是没有必要加 需要哪个自己override吧
|
||||||
|
|
||||||
|
// lifeTextBuilder.Append("\t\t#region 生命周期事件\n");
|
||||||
|
// lifeTextBuilder.Append($"\t\tprotected override void OnInitlize()\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t{\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t\tbase.OnInitlize();\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t}\n");
|
||||||
|
|
||||||
|
// lifeTextBuilder.Append($"\t\tprotected override void OnOpen()\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t{\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t\tbase.OnOpen();\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t}\n");
|
||||||
|
|
||||||
|
// lifeTextBuilder.Append($"\t\tprotected override void OnUpdate()\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t{\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t\tbase.OnUpdate();\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t}\n");
|
||||||
|
|
||||||
|
|
||||||
|
// lifeTextBuilder.Append($"\t\tprotected override void OnClose()\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t{\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t\tbase.OnClose();\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t}\n");
|
||||||
|
|
||||||
|
// lifeTextBuilder.Append($"\t\tprotected override void OnDispose()\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t{\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t\tbase.OnDispose();\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t}\n");
|
||||||
|
// lifeTextBuilder.Append("\t\t#endregion\n\n");
|
||||||
|
|
||||||
|
|
||||||
|
return lifeTextBuilder.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 绑定组件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bindComponent"></param>
|
||||||
|
public static void BindComponent(UIBindComponent bindComponent)
|
||||||
|
{
|
||||||
|
List<UIBindComponent.UIBindData> bindDatas = new List<UIBindComponent.UIBindData>();
|
||||||
|
CollectComponet(bindComponent.transform, ref bindDatas);
|
||||||
|
bindComponent.bindComponents.Clear();
|
||||||
|
foreach (var bindData in bindDatas)
|
||||||
|
{
|
||||||
|
bindComponent.bindComponents.Add(bindData.BindCom);
|
||||||
|
}
|
||||||
|
|
||||||
|
bindComponent.Elements = bindDatas;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 收集组件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="root"></param>
|
||||||
|
/// <param name="bingDatas"></param>
|
||||||
|
private static void CollectComponet(Transform root, ref List<UIBindComponent.UIBindData> bingDatas)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < root.childCount; ++i)
|
||||||
|
{
|
||||||
|
Transform child = root.GetChild(i);
|
||||||
|
if (child.name.IndexOf("widget", StringComparison.OrdinalIgnoreCase) >= 0)
|
||||||
|
{
|
||||||
|
Debug.Log("包含子Widget 如非Widget组件 请避开命名 路径" + child.name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
string[] comArray = SplitComName(child.name);
|
||||||
|
if (comArray != null)
|
||||||
|
{
|
||||||
|
string splitName = child.name.Substring(child.name.IndexOf("@") + 1);
|
||||||
|
foreach (var com in comArray)
|
||||||
|
{
|
||||||
|
var typeName = GetVerType(com);
|
||||||
|
var component = child.GetComponent(typeName);
|
||||||
|
var keyName = GetKeyName(com, child.name);
|
||||||
|
if (bingDatas.Find(a => a.Name == keyName) != null)
|
||||||
|
{
|
||||||
|
Debug.LogError("有重复的key:" + keyName);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (component == null)
|
||||||
|
{
|
||||||
|
Debug.LogError($"{child.name}没有{typeName}组件");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bingDatas.Add(new UIBindComponent.UIBindData(keyName, component, splitName));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
CollectComponet(child, ref bingDatas);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string[] SplitComName(string name)
|
||||||
|
{
|
||||||
|
bool hasCom = name.Contains("@");
|
||||||
|
if (!hasCom) return null;
|
||||||
|
string comStr = name.Substring(0, name.IndexOf("@"));
|
||||||
|
string[] comArray = comStr.Split("#");
|
||||||
|
return comArray;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetKeyName(string comName, string Key)
|
||||||
|
{
|
||||||
|
return $"m{comName}{Key.Substring(Key.IndexOf("@") + 1)}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 情况所有组件
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bindComponent"></param>
|
||||||
|
public static void ClearBindComponets(UIBindComponent bindComponent)
|
||||||
|
{
|
||||||
|
bindComponent.bindComponents.Clear();
|
||||||
|
bindComponent.Elements.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清楚空引用
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="bindComponent"></param>
|
||||||
|
public static void ClearNullRefrence(UIBindComponent bindComponent)
|
||||||
|
{
|
||||||
|
for (var index = bindComponent.Elements.Count - 1; index >= 0; index--)
|
||||||
|
{
|
||||||
|
if (bindComponent.Elements[index].BindCom == null)
|
||||||
|
{
|
||||||
|
bindComponent.Elements.RemoveAt(index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bindComponent.bindComponents.Clear();
|
||||||
|
foreach (var VARIABLE in bindComponent.Elements)
|
||||||
|
{
|
||||||
|
bindComponent.bindComponents.Add(VARIABLE.BindCom);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private static string GetBtnFuncName(string varName)
|
||||||
|
{
|
||||||
|
return $"OnBtn{varName}Click";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetToggleFuncName(string varName)
|
||||||
|
{
|
||||||
|
return "OnToggle" + varName + "Change";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetSliderFuncName(string varName)
|
||||||
|
{
|
||||||
|
return "OnSlider" + varName + "Change";
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetVerType(string uiName)
|
||||||
|
{
|
||||||
|
foreach (var pair in UIGenerateGlobalSetting.scriptGenerateRule)
|
||||||
|
{
|
||||||
|
if (uiName.StartsWith(pair.uiElementRegex))
|
||||||
|
{
|
||||||
|
return pair.componentName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetUIBindDataPrefix(string uiName)
|
||||||
|
{
|
||||||
|
foreach (var pair in UIGenerateGlobalSetting.scriptGenerateRule)
|
||||||
|
{
|
||||||
|
if (uiName.StartsWith(pair.uiElementRegex))
|
||||||
|
{
|
||||||
|
return pair.uiElementRegex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: d7bb0ec8a5855b14cbeac868ca983c37
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
using AlicizaX.Editor;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEditor;
|
||||||
|
|
||||||
|
namespace AlicizaX.UI.Editor
|
||||||
|
{
|
||||||
|
[System.Serializable]
|
||||||
|
[DisplayName("UI设置")]
|
||||||
|
internal sealed class UIGenerateGlobalSettingTab : GameFrameworkTabBase
|
||||||
|
{
|
||||||
|
[Required] [InlineEditor(InlineEditorObjectFieldModes.CompletelyHidden)] [DisableInPlayMode] [HideLabel]
|
||||||
|
public UIGenerateGlobalSettings UIGenerateGlobalSettings;
|
||||||
|
|
||||||
|
public UIGenerateGlobalSettingTab()
|
||||||
|
{
|
||||||
|
UIGenerateGlobalSettings = ScriptableSingletonUtil.Get<UIGenerateGlobalSettings>();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Save()
|
||||||
|
{
|
||||||
|
base.Save();
|
||||||
|
EditorUtility.SetDirty(UIGenerateGlobalSettings);
|
||||||
|
AssetDatabase.SaveAssets();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c093bf237b3e4243a52e04a5db36f86d
|
||||||
|
timeCreated: 1737705566
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
#if UNITY_EDITOR
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using Sirenix.OdinInspector;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace AlicizaX.UI.Editor
|
||||||
|
{
|
||||||
|
internal class UIGenerateGlobalSettings : ScriptableObject
|
||||||
|
{
|
||||||
|
[SerializeField] public List<ScriptGenerateRuler> scriptGenerateRule = new List<ScriptGenerateRuler>();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Serializable]
|
||||||
|
internal class ScriptGenerateRuler
|
||||||
|
{
|
||||||
|
public string uiElementRegex;
|
||||||
|
public string componentName;
|
||||||
|
|
||||||
|
public ScriptGenerateRuler(string uiElementRegex, string componentName)
|
||||||
|
{
|
||||||
|
this.uiElementRegex = uiElementRegex;
|
||||||
|
this.componentName = componentName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b212f141eb1bc7b4d97c4dc8b938bc5f
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Resources.meta
Normal file
8
Client/Packages/com.alicizax.unity.ui/Resources.meta
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 1adcae2abd30deb478273eb8d2a4a1ac
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
312
Client/Packages/com.alicizax.unity.ui/Resources/UIRoot.prefab
Normal file
312
Client/Packages/com.alicizax.unity.ui/Resources/UIRoot.prefab
Normal file
@ -0,0 +1,312 @@
|
|||||||
|
%YAML 1.1
|
||||||
|
%TAG !u! tag:unity3d.com,2011:
|
||||||
|
--- !u!1 &500891838716286123
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 5373281001294974998}
|
||||||
|
- component: {fileID: 743195302492612381}
|
||||||
|
- component: {fileID: 7227605137039161963}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: UICamera
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &5373281001294974998
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 500891838716286123}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 86062277508691697}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!20 &743195302492612381
|
||||||
|
Camera:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 500891838716286123}
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 2
|
||||||
|
m_ClearFlags: 3
|
||||||
|
m_BackGroundColor: {r: 0, g: 0, b: 0, a: 0}
|
||||||
|
m_projectionMatrixMode: 1
|
||||||
|
m_GateFitMode: 2
|
||||||
|
m_FOVAxisMode: 0
|
||||||
|
m_Iso: 200
|
||||||
|
m_ShutterSpeed: 0.005
|
||||||
|
m_Aperture: 16
|
||||||
|
m_FocusDistance: 10
|
||||||
|
m_FocalLength: 50
|
||||||
|
m_BladeCount: 5
|
||||||
|
m_Curvature: {x: 2, y: 11}
|
||||||
|
m_BarrelClipping: 0.25
|
||||||
|
m_Anamorphism: 0
|
||||||
|
m_SensorSize: {x: 36, y: 24}
|
||||||
|
m_LensShift: {x: 0, y: 0}
|
||||||
|
m_NormalizedViewPortRect:
|
||||||
|
serializedVersion: 2
|
||||||
|
x: 0
|
||||||
|
y: 0
|
||||||
|
width: 1
|
||||||
|
height: 1
|
||||||
|
near clip plane: 10
|
||||||
|
far clip plane: 1000
|
||||||
|
field of view: 60
|
||||||
|
orthographic: 1
|
||||||
|
orthographic size: 5
|
||||||
|
m_Depth: 2
|
||||||
|
m_CullingMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 32
|
||||||
|
m_RenderingPath: -1
|
||||||
|
m_TargetTexture: {fileID: 0}
|
||||||
|
m_TargetDisplay: 0
|
||||||
|
m_TargetEye: 3
|
||||||
|
m_HDR: 0
|
||||||
|
m_AllowMSAA: 0
|
||||||
|
m_AllowDynamicResolution: 0
|
||||||
|
m_ForceIntoRT: 0
|
||||||
|
m_OcclusionCulling: 1
|
||||||
|
m_StereoConvergence: 10
|
||||||
|
m_StereoSeparation: 0.022
|
||||||
|
--- !u!114 &7227605137039161963
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 500891838716286123}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_RenderShadows: 0
|
||||||
|
m_RequiresDepthTextureOption: 0
|
||||||
|
m_RequiresOpaqueTextureOption: 0
|
||||||
|
m_CameraType: 0
|
||||||
|
m_Cameras: []
|
||||||
|
m_RendererIndex: -1
|
||||||
|
m_VolumeLayerMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 0
|
||||||
|
m_VolumeTrigger: {fileID: 0}
|
||||||
|
m_VolumeFrameworkUpdateModeOption: 2
|
||||||
|
m_RenderPostProcessing: 0
|
||||||
|
m_Antialiasing: 0
|
||||||
|
m_AntialiasingQuality: 2
|
||||||
|
m_StopNaN: 0
|
||||||
|
m_Dithering: 0
|
||||||
|
m_ClearDepth: 1
|
||||||
|
m_AllowXRRendering: 1
|
||||||
|
m_AllowHDROutput: 1
|
||||||
|
m_UseScreenCoordOverride: 0
|
||||||
|
m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0}
|
||||||
|
m_RequiresDepthTexture: 0
|
||||||
|
m_RequiresColorTexture: 0
|
||||||
|
m_Version: 2
|
||||||
|
m_TaaSettings:
|
||||||
|
m_Quality: 3
|
||||||
|
m_FrameInfluence: 0.1
|
||||||
|
m_JitterScale: 1
|
||||||
|
m_MipBias: 0
|
||||||
|
m_VarianceClampScale: 0.9
|
||||||
|
m_ContrastAdaptiveSharpening: 0
|
||||||
|
--- !u!1 &1735351593002053547
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 3110666966229274110}
|
||||||
|
- component: {fileID: 4697108639102116370}
|
||||||
|
- component: {fileID: 3475475550181341661}
|
||||||
|
- component: {fileID: 6941144161958937340}
|
||||||
|
m_Layer: 5
|
||||||
|
m_Name: UICanvas
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!224 &3110666966229274110
|
||||||
|
RectTransform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1735351593002053547}
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 0, y: 0, z: 0}
|
||||||
|
m_LocalScale: {x: 0, y: 0, z: 0}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children: []
|
||||||
|
m_Father: {fileID: 86062277508691697}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
m_AnchorMin: {x: 0, y: 0}
|
||||||
|
m_AnchorMax: {x: 0, y: 0}
|
||||||
|
m_AnchoredPosition: {x: 0, y: 0}
|
||||||
|
m_SizeDelta: {x: 0, y: 0}
|
||||||
|
m_Pivot: {x: 0, y: 0}
|
||||||
|
--- !u!223 &4697108639102116370
|
||||||
|
Canvas:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1735351593002053547}
|
||||||
|
m_Enabled: 1
|
||||||
|
serializedVersion: 3
|
||||||
|
m_RenderMode: 1
|
||||||
|
m_Camera: {fileID: 743195302492612381}
|
||||||
|
m_PlaneDistance: 100
|
||||||
|
m_PixelPerfect: 0
|
||||||
|
m_ReceivesEvents: 1
|
||||||
|
m_OverrideSorting: 0
|
||||||
|
m_OverridePixelPerfect: 0
|
||||||
|
m_SortingBucketNormalizedSize: 0
|
||||||
|
m_VertexColorAlwaysGammaSpace: 0
|
||||||
|
m_AdditionalShaderChannelsFlag: 27
|
||||||
|
m_UpdateRectTransformForStandalone: 0
|
||||||
|
m_SortingLayerID: 0
|
||||||
|
m_SortingOrder: 0
|
||||||
|
m_TargetDisplay: 0
|
||||||
|
--- !u!114 &3475475550181341661
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1735351593002053547}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_UiScaleMode: 1
|
||||||
|
m_ReferencePixelsPerUnit: 100
|
||||||
|
m_ScaleFactor: 1
|
||||||
|
m_ReferenceResolution: {x: 1920, y: 1080}
|
||||||
|
m_ScreenMatchMode: 0
|
||||||
|
m_MatchWidthOrHeight: 0
|
||||||
|
m_PhysicalUnit: 3
|
||||||
|
m_FallbackScreenDPI: 96
|
||||||
|
m_DefaultSpriteDPI: 96
|
||||||
|
m_DynamicPixelsPerUnit: 1
|
||||||
|
m_PresetInfoIsWorld: 0
|
||||||
|
--- !u!114 &6941144161958937340
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 1735351593002053547}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_IgnoreReversedGraphics: 1
|
||||||
|
m_BlockingObjects: 0
|
||||||
|
m_BlockingMask:
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Bits: 55
|
||||||
|
--- !u!1 &4612363183729467837
|
||||||
|
GameObject:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
serializedVersion: 6
|
||||||
|
m_Component:
|
||||||
|
- component: {fileID: 86062277508691697}
|
||||||
|
- component: {fileID: 2601148299080526511}
|
||||||
|
- component: {fileID: 4177649269856392400}
|
||||||
|
m_Layer: 0
|
||||||
|
m_Name: UIRoot
|
||||||
|
m_TagString: Untagged
|
||||||
|
m_Icon: {fileID: 0}
|
||||||
|
m_NavMeshLayer: 0
|
||||||
|
m_StaticEditorFlags: 0
|
||||||
|
m_IsActive: 1
|
||||||
|
--- !u!4 &86062277508691697
|
||||||
|
Transform:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 4612363183729467837}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
|
||||||
|
m_LocalPosition: {x: 1000, y: 1000, z: 0}
|
||||||
|
m_LocalScale: {x: 1, y: 1, z: 1}
|
||||||
|
m_ConstrainProportionsScale: 0
|
||||||
|
m_Children:
|
||||||
|
- {fileID: 3110666966229274110}
|
||||||
|
- {fileID: 5373281001294974998}
|
||||||
|
m_Father: {fileID: 0}
|
||||||
|
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
|
||||||
|
--- !u!114 &2601148299080526511
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 4612363183729467837}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_FirstSelected: {fileID: 0}
|
||||||
|
m_sendNavigationEvents: 1
|
||||||
|
m_DragThreshold: 10
|
||||||
|
--- !u!114 &4177649269856392400
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 4612363183729467837}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
m_SendPointerHoverToParent: 1
|
||||||
|
m_MoveRepeatDelay: 0.5
|
||||||
|
m_MoveRepeatRate: 0.1
|
||||||
|
m_XRTrackingOrigin: {fileID: 0}
|
||||||
|
m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3}
|
||||||
|
m_DeselectOnBackgroundClick: 1
|
||||||
|
m_PointerBehavior: 0
|
||||||
|
m_CursorLockBehavior: 0
|
||||||
|
m_ScrollDeltaPerTick: 6
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 9368ff38b2090b2468f8358242026e4b
|
||||||
|
PrefabImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"name": "AlicizaX.UI.Runtime",
|
||||||
|
"rootNamespace": "AlicizaX.UI.Runtime",
|
||||||
|
"references": [
|
||||||
|
"GUID:75b6f2078d190f14dbda4a5b747d709c",
|
||||||
|
"GUID:56115dc8e38144842823f4ee0dcad88b",
|
||||||
|
"GUID:be2f20a77f3232f44b9711ef43234aac",
|
||||||
|
"GUID:f51ebe6a0ceec4240a699833d6309b23",
|
||||||
|
"GUID:6e66e5d3ebcffd845a40833b6f1d6426"
|
||||||
|
],
|
||||||
|
"includePlatforms": [],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": true,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e9c35c8938f782649bb7e670099ca425
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 6b2b18ae4d9d49d6b032cababaf21c16
|
||||||
|
timeCreated: 1737704913
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow.meta
vendored
Normal file
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow.meta
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: e1412be7c85017f448c92d8324f9f6d6
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor.meta
vendored
Normal file
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor.meta
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: db9a9b55c8f5bfb428b614a72cdf5efc
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"name": "AnimationFlowEditor",
|
||||||
|
"rootNamespace": "AnimationFlowEditor",
|
||||||
|
"references": [
|
||||||
|
"GUID:6e66e5d3ebcffd845a40833b6f1d6426"
|
||||||
|
],
|
||||||
|
"includePlatforms": [
|
||||||
|
"Editor"
|
||||||
|
],
|
||||||
|
"excludePlatforms": [],
|
||||||
|
"allowUnsafeCode": false,
|
||||||
|
"overrideReferences": false,
|
||||||
|
"precompiledReferences": [],
|
||||||
|
"autoReferenced": true,
|
||||||
|
"defineConstraints": [],
|
||||||
|
"versionDefines": [],
|
||||||
|
"noEngineReferences": false
|
||||||
|
}
|
||||||
@ -0,0 +1,7 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: c9bcb498a0de71144a369983cda0ba7e
|
||||||
|
AssemblyDefinitionImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Data.meta
vendored
Normal file
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Data.meta
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 05481b2c8d50a2d448adef9320a56a83
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using AnimationFlowCore;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace AnimationFlowEditor {
|
||||||
|
public class AnimationFlowSerialize {
|
||||||
|
public string flag;
|
||||||
|
[SerializeReference]
|
||||||
|
public List<ActionNode> nodes = new();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fda964849c26a2048929d7d1064807a9
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Graph.meta
vendored
Normal file
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Graph.meta
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: b3e8fab836e994447ae794a436875a3e
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
367
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Graph/GraphView.cs
vendored
Normal file
367
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Graph/GraphView.cs
vendored
Normal file
@ -0,0 +1,367 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using AnimationFlowCore;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace AnimationFlowEditor
|
||||||
|
{
|
||||||
|
public class GraphView : UnityEditor.Experimental.GraphView.GraphView
|
||||||
|
{
|
||||||
|
private readonly SearchWindowProvider searchWindowProvider;
|
||||||
|
private readonly GraphWindow graphWindow;
|
||||||
|
private readonly Dictionary<string, NodeView> dicNodeView = new();
|
||||||
|
private AnimationFlow animationFlow;
|
||||||
|
private const string applicationFlag = "@AnimationFlow";
|
||||||
|
|
||||||
|
private readonly Dictionary<string, ActionNode> pendingNodes = new();
|
||||||
|
|
||||||
|
public GraphView(GraphWindow graphWindow) : base()
|
||||||
|
{
|
||||||
|
this.graphWindow = graphWindow;
|
||||||
|
InitView();
|
||||||
|
SetupZoom(ContentZoomer.DefaultMinScale, ContentZoomer.DefaultMaxScale);
|
||||||
|
this.AddManipulator(new SelectionDragger());
|
||||||
|
this.AddManipulator(new RectangleSelector());
|
||||||
|
this.AddManipulator(new ContentDragger());
|
||||||
|
|
||||||
|
searchWindowProvider = ScriptableObject.CreateInstance<SearchWindowProvider>();
|
||||||
|
searchWindowProvider.Initialize(graphWindow, this);
|
||||||
|
|
||||||
|
|
||||||
|
SetCopyAndPaste();
|
||||||
|
graphViewChanged += OnGraphViewChanged;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void InitView()
|
||||||
|
{
|
||||||
|
this.StretchToParentSize();
|
||||||
|
|
||||||
|
Insert(0, new GridBackground());
|
||||||
|
AddStyles();
|
||||||
|
MiniMap miniMap = new();
|
||||||
|
Add(miniMap);
|
||||||
|
miniMap.style.backgroundColor = new Color(0.12f, 0.12f, 0.12f, 1f);
|
||||||
|
miniMap.style.borderBottomColor = new Color(0.2f, 0.2f, 0.2f, 1f);
|
||||||
|
miniMap.style.borderRightColor = new Color(0.2f, 0.2f, 0.2f, 1f);
|
||||||
|
miniMap.style.borderTopColor = new Color(0.2f, 0.2f, 0.2f, 1f);
|
||||||
|
miniMap.style.borderLeftColor = new Color(0.2f, 0.2f, 0.2f, 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetCopyAndPaste()
|
||||||
|
{
|
||||||
|
serializeGraphElements += (IEnumerable<GraphElement> elements) =>
|
||||||
|
{
|
||||||
|
AnimationFlowSerialize serialize = new();
|
||||||
|
serialize.flag = applicationFlag;
|
||||||
|
foreach (var ele in elements)
|
||||||
|
{
|
||||||
|
if (ele is NodeView nodeView)
|
||||||
|
{
|
||||||
|
serialize.nodes.Add(nodeView.actionNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return JsonUtility.ToJson(serialize);
|
||||||
|
};
|
||||||
|
canPasteSerializedData += (string data) => { return data.Contains(applicationFlag); };
|
||||||
|
unserializeAndPaste += (string operationName, string data) =>
|
||||||
|
{
|
||||||
|
ClearSelection();
|
||||||
|
Undo.RecordObject(animationFlow, operationName);
|
||||||
|
Vector2 mousePos = contentViewContainer.WorldToLocal(contentRect.center);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
AnimationFlowSerialize serialize = JsonUtility.FromJson<AnimationFlowSerialize>(data);
|
||||||
|
List<ActionNode> newDatas = new();
|
||||||
|
Dictionary<string, ActionNode> dicUid = new();
|
||||||
|
foreach (ActionNode node in serialize.nodes)
|
||||||
|
{
|
||||||
|
node.nodePos = node.nodePos + mousePos;
|
||||||
|
string uuid = node.uuid;
|
||||||
|
node.uuid = Guid.NewGuid().ToString();
|
||||||
|
NodeView nodeView = AddNodeView(node);
|
||||||
|
AddToSelection(nodeView);
|
||||||
|
newDatas.Add(node);
|
||||||
|
dicUid.Add(uuid, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (ActionNode copyNode in newDatas)
|
||||||
|
{
|
||||||
|
for (int i = copyNode.Childs.Count - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
if (dicUid.TryGetValue(copyNode.Childs[i].uuid, out ActionNode newNode))
|
||||||
|
{
|
||||||
|
copyNode.Childs[i] = newNode;
|
||||||
|
if (dicNodeView.TryGetValue(copyNode.uuid, out NodeView inNode) && dicNodeView.TryGetValue(newNode.uuid, out NodeView outNode))
|
||||||
|
{
|
||||||
|
AddElement(inNode.portOut.ConnectTo(outNode.portIn));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
copyNode.Childs.RemoveAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetEdge()
|
||||||
|
{
|
||||||
|
List<ActionNode> nodes = new List<ActionNode>();
|
||||||
|
foreach (var item in animationFlow.AnimationNodes)
|
||||||
|
{
|
||||||
|
nodes.Add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ActionNode> allNodes = new List<ActionNode>();
|
||||||
|
LoadAllChildNode(nodes, allNodes);
|
||||||
|
|
||||||
|
|
||||||
|
foreach (ActionNode data in allNodes)
|
||||||
|
{
|
||||||
|
foreach (ActionNode node in allNodes)
|
||||||
|
{
|
||||||
|
if (data.Childs.Count > 0 && data.Childs.Find(a => a.uuid == node.uuid) != null)
|
||||||
|
{
|
||||||
|
if (dicNodeView.TryGetValue(data.uuid, out NodeView inNode) && dicNodeView.TryGetValue(node.uuid, out NodeView outNode))
|
||||||
|
{
|
||||||
|
AddElement(inNode.portOut.ConnectTo(outNode.portIn));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private NodeView ResetNodeView(ActionNode data)
|
||||||
|
{
|
||||||
|
NodeView nodeView = new(data, graphWindow);
|
||||||
|
AddElement(nodeView);
|
||||||
|
nodeView.SetPosition(new Rect(data.nodePos, Vector2.zero));
|
||||||
|
dicNodeView.Add(data.uuid, nodeView);
|
||||||
|
return nodeView;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveNodeView(NodeView nodeView)
|
||||||
|
{
|
||||||
|
dicNodeView.Remove(nodeView.actionNode.uuid);
|
||||||
|
pendingNodes.Remove(nodeView.actionNode.uuid);
|
||||||
|
if (nodeView.actionNode is EntryNode)
|
||||||
|
{
|
||||||
|
animationFlow.AnimationNodes.Remove(nodeView.actionNode as EntryNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddStyles()
|
||||||
|
{
|
||||||
|
StyleSheet styleSheet = AssetDatabase.LoadAssetAtPath<StyleSheet>(EditorResourceTool.editorAssets + "/AnimationFlowStyles.uss");
|
||||||
|
styleSheets.Add(styleSheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
private GraphViewChange OnGraphViewChanged(GraphViewChange change)
|
||||||
|
{
|
||||||
|
change.edgesToCreate?.ForEach(edge =>
|
||||||
|
{
|
||||||
|
if (animationFlow == null)
|
||||||
|
{
|
||||||
|
ClearGraph();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Undo.RecordObject(animationFlow, "Create Edge");
|
||||||
|
NodeView nodeIn = edge.input.node as NodeView;
|
||||||
|
NodeView nodeOut = edge.output.node as NodeView;
|
||||||
|
nodeOut.actionNode.Childs.Add(nodeIn.actionNode);
|
||||||
|
EditorUtility.SetDirty(animationFlow);
|
||||||
|
});
|
||||||
|
|
||||||
|
change.elementsToRemove?.ForEach(elem =>
|
||||||
|
{
|
||||||
|
if (animationFlow == null)
|
||||||
|
{
|
||||||
|
ClearGraph();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elem is Edge edge)
|
||||||
|
{
|
||||||
|
Undo.RecordObject(animationFlow, "Rmove Edge");
|
||||||
|
NodeView nodeIn = edge.input.node as NodeView;
|
||||||
|
NodeView nodeOut = edge.output.node as NodeView;
|
||||||
|
nodeOut.actionNode.Childs.Remove(nodeIn.actionNode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elem is NodeView node)
|
||||||
|
{
|
||||||
|
Undo.RecordObject(animationFlow, "Remove Node");
|
||||||
|
RemoveNodeView(node);
|
||||||
|
graphWindow.OnNodeRemove();
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorUtility.SetDirty(animationFlow);
|
||||||
|
});
|
||||||
|
change.movedElements?.ForEach(elem =>
|
||||||
|
{
|
||||||
|
if (animationFlow == null)
|
||||||
|
{
|
||||||
|
ClearGraph();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elem is NodeView nodeView)
|
||||||
|
{
|
||||||
|
Undo.RecordObject(animationFlow, "Move Node");
|
||||||
|
nodeView.actionNode.nodePos = nodeView.GetPosition().position;
|
||||||
|
}
|
||||||
|
|
||||||
|
EditorUtility.SetDirty(animationFlow);
|
||||||
|
});
|
||||||
|
return change;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void BuildContextualMenu(ContextualMenuPopulateEvent evt)
|
||||||
|
{
|
||||||
|
SearchWindow.Open(new SearchWindowContext(GUIUtility.GUIToScreenPoint(evt.mousePosition)), searchWindowProvider);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override List<Port> GetCompatiblePorts(Port startPort, NodeAdapter nodeAdapter)
|
||||||
|
{
|
||||||
|
List<Port> compatiblePorts = new();
|
||||||
|
ports.ForEach(port =>
|
||||||
|
{
|
||||||
|
if (startPort == port)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startPort.node == port.node)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startPort.direction == port.direction)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startPort.portType != port.portType)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
compatiblePorts.Add(port);
|
||||||
|
});
|
||||||
|
|
||||||
|
return compatiblePorts;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool canDeleteSelection => base.canDeleteSelection && !Application.isPlaying && animationFlow != null && !animationFlow.InPlaying;
|
||||||
|
protected override bool canCopySelection => base.canCopySelection && !Application.isPlaying && animationFlow != null && !animationFlow.InPlaying;
|
||||||
|
protected override bool canCutSelection => base.canCutSelection && !Application.isPlaying && animationFlow != null && !animationFlow.InPlaying;
|
||||||
|
protected override bool canDuplicateSelection => base.canDuplicateSelection && !Application.isPlaying && animationFlow != null && !animationFlow.InPlaying;
|
||||||
|
protected override bool canPaste => base.canPaste && !Application.isPlaying && animationFlow != null;
|
||||||
|
|
||||||
|
public NodeView AddNodeView(ActionNode node)
|
||||||
|
{
|
||||||
|
if (animationFlow == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
Undo.RecordObject(animationFlow, "Create Node");
|
||||||
|
if (node is EntryNode)
|
||||||
|
{
|
||||||
|
animationFlow.AnimationNodes.Add(node as EntryNode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pendingNodes.Add(node.uuid, node);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ResetNodeView(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ClearGraph()
|
||||||
|
{
|
||||||
|
graphElements.ForEach(g => RemoveElement(g));
|
||||||
|
dicNodeView.Clear();
|
||||||
|
animationFlow = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SetAnimationFlow(AnimationFlow animationFlow)
|
||||||
|
{
|
||||||
|
this.animationFlow = animationFlow;
|
||||||
|
|
||||||
|
List<ActionNode> nodes = new List<ActionNode>();
|
||||||
|
foreach (var VARIABLE in animationFlow.AnimationNodes)
|
||||||
|
{
|
||||||
|
nodes.Add(VARIABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
List<ActionNode> allNodes = new List<ActionNode>();
|
||||||
|
LoadAllChildNode(nodes, allNodes);
|
||||||
|
|
||||||
|
foreach (ActionNode data in allNodes)
|
||||||
|
{
|
||||||
|
ResetNodeView(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
ResetEdge();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadAllChildNode(List<ActionNode> nodes, List<ActionNode> collector)
|
||||||
|
{
|
||||||
|
foreach (var item in nodes)
|
||||||
|
{
|
||||||
|
collector.Add(item);
|
||||||
|
if (item.Childs.Count > 0) LoadAllChildNode(item.Childs, collector);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void ResetView()
|
||||||
|
{
|
||||||
|
foreach (NodeView nodeView in dicNodeView.Values)
|
||||||
|
{
|
||||||
|
nodeView.RemoveProgress();
|
||||||
|
nodeView.RemoveComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void OnNodeEnter(ActionNode actionNode)
|
||||||
|
{
|
||||||
|
if (dicNodeView.TryGetValue(actionNode.uuid, out NodeView nodeView))
|
||||||
|
{
|
||||||
|
nodeView.AddProgress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNodeExit(ActionNode actionNode)
|
||||||
|
{
|
||||||
|
if (dicNodeView.TryGetValue(actionNode.uuid, out NodeView nodeView))
|
||||||
|
{
|
||||||
|
nodeView.RemoveProgress();
|
||||||
|
nodeView.AddComplete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnNodeUpdate(ActionNode actionNode)
|
||||||
|
{
|
||||||
|
if (dicNodeView.TryGetValue(actionNode.uuid, out NodeView nodeView))
|
||||||
|
{
|
||||||
|
nodeView.UpdateProgress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: aa836d91ab8e3774aa28fe2995f18b6b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
123
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Graph/NodeView.cs
vendored
Normal file
123
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Graph/NodeView.cs
vendored
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using AnimationFlowCore;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
using static UnityEditor.Experimental.GraphView.Port;
|
||||||
|
|
||||||
|
namespace AnimationFlowEditor {
|
||||||
|
public class NodeView : Node {
|
||||||
|
public readonly ActionNode actionNode;
|
||||||
|
public Port portIn;
|
||||||
|
public Port portOut;
|
||||||
|
private readonly GraphWindow graphWindow;
|
||||||
|
private ProgressBar progressPlaying;
|
||||||
|
private Image imageComplete;
|
||||||
|
private Image imageWarning;
|
||||||
|
private Label sub_title;
|
||||||
|
|
||||||
|
public NodeView(ActionNode node, GraphWindow graphWindow) {
|
||||||
|
this.actionNode = node;
|
||||||
|
this.graphWindow = graphWindow;
|
||||||
|
Draw();
|
||||||
|
}
|
||||||
|
private void Draw() {
|
||||||
|
Type type = actionNode.GetType();
|
||||||
|
NameAttribute nameAttribute = type.GetCustomAttributes(typeof(NameAttribute), true).FirstOrDefault() as NameAttribute;
|
||||||
|
title = nameAttribute != null && !string.IsNullOrEmpty(nameAttribute.name) ? nameAttribute.name : type.Name;
|
||||||
|
if (actionNode.HasInputPort()) {
|
||||||
|
portIn = InstantiatePort(Orientation.Horizontal, Direction.Input, actionNode.MultiInputPort() ? Capacity.Multi : Capacity.Single, typeof(bool));
|
||||||
|
inputContainer.Add(portIn);
|
||||||
|
portIn.portName = "in";
|
||||||
|
}
|
||||||
|
if (actionNode.HasOutPort()) {
|
||||||
|
portOut = InstantiatePort(Orientation.Horizontal, Direction.Output, actionNode.MultiOutPort() ? Capacity.Multi : Capacity.Single, typeof(bool));
|
||||||
|
outputContainer.Add(portOut);
|
||||||
|
portOut.portName = "out";
|
||||||
|
}
|
||||||
|
titleContainer.Remove(titleButtonContainer);
|
||||||
|
imageComplete = new() {
|
||||||
|
image = AssetDatabase.LoadAssetAtPath<Texture2D>(EditorResourceTool.editorAssets + "/Complete.png"),
|
||||||
|
tintColor = new Color(0.4f, 0.7f, 0.2f),
|
||||||
|
style = { marginLeft = 3, marginRight = 10, visibility = Visibility.Hidden }
|
||||||
|
};
|
||||||
|
titleContainer.Add(imageComplete);
|
||||||
|
|
||||||
|
imageWarning = new() {
|
||||||
|
image = AssetDatabase.LoadAssetAtPath<Texture2D>(EditorResourceTool.editorAssets + "/Warning.png"),
|
||||||
|
tintColor = Color.red,
|
||||||
|
style = { position = Position.Absolute, right = 0, top = 5 }
|
||||||
|
};
|
||||||
|
titleContainer.Add(imageWarning);
|
||||||
|
|
||||||
|
RefreshState();
|
||||||
|
|
||||||
|
if (actionNode.HasSubTitle()) {
|
||||||
|
sub_title = new(actionNode.SubTitle()) {
|
||||||
|
style = { fontSize = 12, paddingLeft = 8, paddingBottom = 5, backgroundColor = new Color(0.23f, 0.23f, 0.23f, 1f) }
|
||||||
|
};
|
||||||
|
this.Q<VisualElement>("node-border").Insert(1, sub_title);
|
||||||
|
}
|
||||||
|
this.Q<VisualElement>("title").style.height = 25;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RefreshState() {
|
||||||
|
imageWarning.style.visibility = actionNode.Valid() ? Visibility.Hidden : Visibility.Visible;
|
||||||
|
if (sub_title != null) {
|
||||||
|
if (string.IsNullOrEmpty(actionNode.SubTitle())) {
|
||||||
|
sub_title.text = "<Empty>";
|
||||||
|
sub_title.style.color = Color.red;
|
||||||
|
} else {
|
||||||
|
sub_title.text = actionNode.SubTitle();
|
||||||
|
sub_title.style.color = new Color(0.82f, 0.82f, 0.82f, 1f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddComplete() {
|
||||||
|
imageComplete.style.visibility = Visibility.Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveComplete() {
|
||||||
|
imageComplete.style.visibility = Visibility.Hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddProgress() {
|
||||||
|
if (actionNode.Duration() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
progressPlaying = new();
|
||||||
|
progressPlaying.style.height = 10;
|
||||||
|
contentContainer.Add(progressPlaying);
|
||||||
|
progressPlaying.highValue = actionNode.Duration();
|
||||||
|
progressPlaying.value = 0;
|
||||||
|
RefreshExpandedState();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UpdateProgress() {
|
||||||
|
if (actionNode.Duration() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (progressPlaying == null) {
|
||||||
|
AddProgress();
|
||||||
|
}
|
||||||
|
progressPlaying.value = actionNode.elapsedTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveProgress() {
|
||||||
|
if (progressPlaying == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
contentContainer.Remove(progressPlaying);
|
||||||
|
progressPlaying = null;
|
||||||
|
RefreshExpandedState();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void OnSelected() {
|
||||||
|
base.OnSelected();
|
||||||
|
graphWindow.OnSelect(this);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 7381de95d5725314b926b1525ca31ac2
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using AnimationFlowCore;
|
||||||
|
using UnityEditor.Experimental.GraphView;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace AnimationFlowEditor {
|
||||||
|
public class SearchWindowProvider : ScriptableObject, ISearchWindowProvider {
|
||||||
|
private GraphWindow graphWindow;
|
||||||
|
private GraphView graphView;
|
||||||
|
private Texture2D icon;
|
||||||
|
|
||||||
|
public void Initialize(GraphWindow graphWindow, GraphView graphView) {
|
||||||
|
this.graphWindow = graphWindow;
|
||||||
|
this.graphView = graphView;
|
||||||
|
icon = new Texture2D(1, 1);
|
||||||
|
icon.SetPixel(0, 0, Color.clear);
|
||||||
|
icon.Apply();
|
||||||
|
}
|
||||||
|
|
||||||
|
List<SearchTreeEntry> ISearchWindowProvider.CreateSearchTree(SearchWindowContext context) {
|
||||||
|
List<SearchTreeEntry> entries = new() {
|
||||||
|
new SearchTreeGroupEntry(new GUIContent("Create Node",icon))
|
||||||
|
};
|
||||||
|
Dictionary<string, List<Type>> dicType = new();
|
||||||
|
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) {
|
||||||
|
foreach (var type in assembly.GetTypes()) {
|
||||||
|
if (type.IsClass && !type.IsAbstract && type.IsSubclassOf(typeof(ActionNode))) {
|
||||||
|
CategoryAttribute categoryAttribute = type.GetCustomAttributes(typeof(CategoryAttribute), true).FirstOrDefault() as CategoryAttribute;
|
||||||
|
if (categoryAttribute == null || string.IsNullOrEmpty(categoryAttribute.category)) {
|
||||||
|
NameAttribute nameAttribute = type.GetCustomAttributes(typeof(NameAttribute), true).FirstOrDefault() as NameAttribute;
|
||||||
|
entries.Add(new SearchTreeEntry(new GUIContent(nameAttribute != null && !string.IsNullOrEmpty(nameAttribute.name) ? nameAttribute.name : type.Name, icon)) { level = 1, userData = type });
|
||||||
|
} else {
|
||||||
|
if (dicType.TryGetValue(categoryAttribute.category, out var list)) {
|
||||||
|
list.Add(type);
|
||||||
|
} else {
|
||||||
|
dicType.Add(categoryAttribute.category, new List<Type>() { type });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var kv in dicType) {
|
||||||
|
entries.Add(new SearchTreeGroupEntry(new GUIContent(kv.Key), 1));
|
||||||
|
foreach (Type type in kv.Value) {
|
||||||
|
NameAttribute nameAttribute = type.GetCustomAttributes(typeof(NameAttribute), true).FirstOrDefault() as NameAttribute;
|
||||||
|
entries.Add(new SearchTreeEntry(new GUIContent(nameAttribute != null && !string.IsNullOrEmpty(nameAttribute.name) ? nameAttribute.name : type.Name, icon)) { level = 2, userData = type });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ISearchWindowProvider.OnSelectEntry(SearchTreeEntry searchTreeEntry, SearchWindowContext context) {
|
||||||
|
var type = searchTreeEntry.userData as Type;
|
||||||
|
var data = Activator.CreateInstance(type) as ActionNode;
|
||||||
|
data.uuid = Guid.NewGuid().ToString();
|
||||||
|
data.nodePos = graphView.contentViewContainer.WorldToLocal(context.screenMousePosition - graphWindow.position.position);
|
||||||
|
graphView.AddNodeView(data);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: 38ab1dba8d514e34ca60e2d5bddecacc
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Inspector.meta
vendored
Normal file
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Inspector.meta
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: be8bbf3b671f5b549ac4485743768611
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,45 @@
|
|||||||
|
using System;
|
||||||
|
using System.Linq;
|
||||||
|
using AnimationFlowCore;
|
||||||
|
using Sirenix.OdinInspector.Editor;
|
||||||
|
using UnityEditor;
|
||||||
|
using UnityEngine;
|
||||||
|
using UnityEngine.UIElements;
|
||||||
|
|
||||||
|
namespace AnimationFlowEditor
|
||||||
|
{
|
||||||
|
public class GraphInspector : VisualElement
|
||||||
|
{
|
||||||
|
private PropertyTree propertyTree;
|
||||||
|
|
||||||
|
public void DrawNode(NodeView nodeView)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
|
if (nodeView.actionNode == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用 Odin PropertyTree 来处理非 UnityEngine.Object 对象
|
||||||
|
propertyTree = PropertyTree.Create(nodeView.actionNode);
|
||||||
|
|
||||||
|
var imguiContainer = new IMGUIContainer(() =>
|
||||||
|
{
|
||||||
|
if (propertyTree == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
propertyTree.Draw(false);
|
||||||
|
// 手动调用 Odin 的 Apply,处理数据更新后的逻辑
|
||||||
|
if (propertyTree.ApplyChanges())
|
||||||
|
{
|
||||||
|
nodeView.RefreshState();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Add(imguiContainer);
|
||||||
|
propertyTree.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: fc069d3bbdbfd0a4a8e8591e50c4239b
|
||||||
|
MonoImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
serializedVersion: 2
|
||||||
|
defaultReferences: []
|
||||||
|
executionOrder: 0
|
||||||
|
icon: {instanceID: 0}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Misc.meta
vendored
Normal file
8
Client/Packages/com.alicizax.unity.ui/Runtime/ThirdParty/AnimationFlow/Editor/Misc.meta
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
fileFormatVersion: 2
|
||||||
|
guid: bfc0e8c84445633439f791523d34f21a
|
||||||
|
folderAsset: yes
|
||||||
|
DefaultImporter:
|
||||||
|
externalObjects: {}
|
||||||
|
userData:
|
||||||
|
assetBundleName:
|
||||||
|
assetBundleVariant:
|
||||||
@ -0,0 +1,44 @@
|
|||||||
|
using System.Collections.Generic;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace AnimationFlowEditor {
|
||||||
|
public static class EditorResourceTool {
|
||||||
|
public static string editorAssets;
|
||||||
|
|
||||||
|
public static bool LocateEditorAssets() {
|
||||||
|
string projectPath = Application.dataPath;
|
||||||
|
if (projectPath.EndsWith("/Assets")) {
|
||||||
|
projectPath = projectPath.Remove(projectPath.Length - ("Assets".Length));
|
||||||
|
}
|
||||||
|
editorAssets = "Packages/com.yuliuren.alicizaframework/ThirdParty/AnimationFlow/Editor/Styles";
|
||||||
|
if (!System.IO.File.Exists(projectPath + editorAssets + "/AnimationFlowStyles.uss")) {
|
||||||
|
var sdir = new System.IO.DirectoryInfo(Application.dataPath);
|
||||||
|
var dirQueue = new Queue<System.IO.DirectoryInfo>();
|
||||||
|
dirQueue.Enqueue(sdir);
|
||||||
|
bool found = false;
|
||||||
|
while (dirQueue.Count > 0) {
|
||||||
|
System.IO.DirectoryInfo dir = dirQueue.Dequeue();
|
||||||
|
if (System.IO.File.Exists(dir.FullName + "/AnimationFlowStyles.uss")) {
|
||||||
|
string path = dir.FullName.Replace('\\', '/');
|
||||||
|
found = true;
|
||||||
|
path = path.Replace(projectPath, "");
|
||||||
|
if (path.StartsWith("/")) {
|
||||||
|
path = path.Remove(0, 1);
|
||||||
|
}
|
||||||
|
editorAssets = path;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
var dirs = dir.GetDirectories();
|
||||||
|
for (int i = 0; i < dirs.Length; i++) {
|
||||||
|
dirQueue.Enqueue(dirs[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!found) {
|
||||||
|
Debug.LogWarning("Could not locate editor assets folder. Make sure you have imported the package correctly.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user