feat: 受击音效更新类别控制

This commit is contained in:
m0_75251201
2025-11-05 21:34:21 +08:00
parent 5d69efbc3f
commit 786025f720
50 changed files with 2078 additions and 501 deletions

View File

@@ -0,0 +1,73 @@
using Duckov.UI;
using Duckov.Utilities;
using TMPro;
using UIFrame.Utilities;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
namespace UIFrame
{
public class GameOriginMainMenuUI
{
public GameObject mainMenuContainer;
public Image? title;
public TMP_Text[]? allTexts;
public Sprite titleSprite;
public bool linkMainMenu=false;
public void Initialize()
{
SceneLoader.onAfterSceneInitialize += OnAfterSceneInitialize;
}
public void Cleanup()
{
SceneLoader.onAfterSceneInitialize -= OnAfterSceneInitialize;
}
private void OnAfterSceneInitialize(SceneLoadingContext sceneLoadingContext)
{
linkMainMenu = false;
LinkMainMenuObj();
}
public void LinkMainMenuObj()
{
mainMenuContainer = GameObject.Find("MainMenuContainer");
if(!mainMenuContainer)
{
Debug.LogWarning("Could not find Main Menu Container");
return;
}
Debug.Log("Main Menu Container initialized");
allTexts = mainMenuContainer.GetComponentsInChildren<TMP_Text>();
title = GameObjectTool.FindChildByName(mainMenuContainer.transform, "MainTitle")?.GetComponent<Image>();
linkMainMenu = true;
}
public bool SetFont(TMP_FontAsset font)
{
if(allTexts == null || allTexts.Length == 0)
return false;
foreach (var text in allTexts)
{
text.font = font;
}
return true;
}
public bool SetTitle(Sprite texture)
{
titleSprite=texture;
if(title==null)
return false;
title.sprite = texture;
return true;
}
}
}

View File

@@ -0,0 +1,7 @@
namespace UIFrame.Manager
{
public class TextureManager
{
}
}

View File

@@ -1,19 +1,69 @@
using System;
using Duckov.Modding;
using Duckov.Options.UI;
using Duckov.UI;
using Duckov.UI.Animations;
using Duckov.Utilities;
using HarmonyLib;
using UnityEngine;
namespace UIFrame
{
public class ModBehaviour:Duckov.Modding.ModBehaviour
{
private const string MOD_ID="UIFrame";
private GameObject? workerObject;
private Harmony? harmony;
protected override void OnAfterSetup()
{
Debug.Log("OnAfterSetup");
CreateAPIObject();
if (harmony == null)
{
harmony=new HarmonyLib.Harmony(MOD_ID);
}
harmony.PatchAll();
Test();
}
protected override void OnBeforeDeactivate()
{
Debug.Log("OnBeforeDeactivate");
ClearAPIObject();
harmony?.UnpatchAll(MOD_ID);
harmony = null;
}
private void CreateAPIObject()
{
if(workerObject)
return;
workerObject = new GameObject($"{MOD_ID}_APIObject");
workerObject.AddComponent<UIFrameWorker>();
}
private void ClearAPIObject()
{
if(!workerObject)
return;
Destroy(workerObject);
workerObject = null;
}
private void Test()
{
if(!UIFrameAPI.Initialize())
return;
if (UIFrameAPI.SetGameTitle(@"C:\Users\Lenovo\Pictures\异噬.png"))
{
Debug.Log("设置标题完成");
}
else
{
Debug.Log("标题设置失败");
}
}
}
}

View File

@@ -0,0 +1,15 @@
using UnityEngine;
namespace UIFrame.Patch
{
[HarmonyLib.HarmonyPatch(typeof(SceneLoader), "LoadMainMenu")]
public class PatchSceneLoaderLoadMainMenu
{
public static void Postfix()
{
Debug.Log("LoadMainMenu called");
}
}
}

38
UIFrame/Singleton.cs Normal file
View File

@@ -0,0 +1,38 @@
using System;
namespace UIFrame
{
public abstract class Singleton<T> where T : class
{
private static T? _instance;
private static readonly object _lock = new object(); // 用于多线程安全
public static T? Instance
{
get
{
// 在多线程环境下,确保只有一个线程能够创建实例
lock (_lock)
{
if (_instance == null)
{
_instance = Activator.CreateInstance(typeof(T), true) as T;
if (_instance == null)
{
throw new InvalidOperationException($"无法为类型 {typeof(T).Name} 创建单例实例。" +
"请确保它有一个私有的无参构造函数。");
}
}
return _instance;
}
}
}
protected Singleton()
{
if (_instance != null)
{
throw new InvalidOperationException($"试图创建第二个单例实例 {typeof(T).Name}。请通过 Singleton<{typeof(T).Name}>.Instance 访问。");
}
}
}
}

View File

@@ -18,5 +18,8 @@
<Reference Include="$(DuckovPath)\Duckov_Data\Managed\Unity*" Private="False" />
<Reference Include="$(DuckovPath)\Duckov_Data\Managed\FMODUnity.dll" Private="False" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Lib.Harmony" Version="2.4.1" />
</ItemGroup>
</Project>

View File

@@ -1,7 +1,99 @@
using System.Collections.Generic;
using UIFrameAPI;
using UnityEngine;
//改为自己的命名空间更好,这是一个画布单元,一个命名空间一个画布
namespace UIFrame
{
public class UIFrameAPI
//反射虽然很好用,但我认为用组件传递高效
public static class UIFrameAPI
{
private static UIFrameAPIComponent? _apiComponent;
private static bool createdCanvas = false;
private static readonly string NameSpace = typeof(UIFrameAPI).Namespace ?? "UIFrame";
public static Dictionary<string, Texture2D> textureCache = new Dictionary<string, Texture2D>();
public static Dictionary<string, Sprite> spriteCache = new Dictionary<string, Sprite>();
/// <summary>
/// 初始化API
/// </summary>
/// <returns></returns>
public static bool Initialize()
{
if (_apiComponent!=null)
return true;
_apiComponent = Object.FindObjectOfType<UIFrameAPIComponent>();
return _apiComponent;
}
/// <summary>
/// 设置标题图片(游戏中的标题是图片)
/// </summary>
/// <param name="imageFilePath">图片路径</param>
/// <returns></returns>
public static bool SetGameTitle(string imageFilePath)
{
var texture=LoadSprite(imageFilePath);
if(texture==null)
{
return false;
}
return _apiComponent&&_apiComponent.SetTitleImage(texture);
}
/// <summary>
/// 设置标题图片(游戏中的标题是图片)
/// </summary>
/// <param name="sprite">贴图</param>
/// <returns></returns>
public static bool SetGameTitle(Sprite sprite)
{
return _apiComponent&&_apiComponent.SetTitleImage(sprite);
}
/// <summary>
/// 加载图片文件为Texture2D
/// Texture2D实际存储了图片图片的数据会上传显卡
/// 此函数默认加载后不保留内存备份,即不可读像素
/// 函数会建立文件到图片的索引缓存
/// </summary>
/// <param name="imageFilePath"></param>
/// <returns></returns>
public static Texture2D? LoadImage(string imageFilePath)
{
if (!textureCache.ContainsKey(imageFilePath))
{
var texture=_apiComponent.LoadTexture(imageFilePath);
if (texture != null)
{
textureCache[imageFilePath] = texture;
}
else
{
Debug.LogError($"加载图片:{imageFilePath}失败");
return null;
}
}
return textureCache[imageFilePath];
}
/// <summary>
/// 加载图片为Sprite
/// 直接简单的调用LoadImage再创建一个代表此图片的Sprite
/// Sprite只是表明了图片的处理方式所以为了灵活性建议自己创建
/// 此函数会缓存地址到Sprite的索引
/// </summary>
/// <param name="imageFilePath"></param>
/// <returns></returns>
public static Sprite? LoadSprite(string imageFilePath)
{
var texture=LoadImage(imageFilePath);
if (texture==null)
return null;
if (!spriteCache.ContainsKey(imageFilePath))
{
spriteCache[imageFilePath] = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
}
return spriteCache[imageFilePath];
}
}
}

View File

@@ -0,0 +1,21 @@
using TMPro;
using UnityEngine;
namespace UIFrameAPI
{
public abstract class UIFrameAPIComponent:MonoBehaviour
{
public abstract bool CreateCanvas(string name);
//设置游戏主菜单的原版标题
public abstract bool SetTitleImage(Sprite sprite);
//创建一个TMP字体
public abstract TMP_FontAsset CreateFontAsset(string fontFilePath);
//设置游戏字体
public abstract bool SetFont(TMP_FontAsset font);
public abstract Texture2D? LoadTexture(string imageFilePath);
}
}

65
UIFrame/UIFrameWorker.cs Normal file
View File

@@ -0,0 +1,65 @@
using System;
using System.Collections.Generic;
using TMPro;
using UIFrameAPI;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.TextCore.LowLevel;
namespace UIFrame
{
public class UIFrameWorker : UIFrameAPIComponent
{
public GameOriginMainMenuUI gameOriginMainMenuUI = new GameOriginMainMenuUI();
public Dictionary<string, Canvas> canvasDic = new Dictionary<string, Canvas>();
private void Awake()
{
gameOriginMainMenuUI.Initialize();
}
private void OnDestroy()
{
gameOriginMainMenuUI.Cleanup();
}
public override bool CreateCanvas(string name)
{
return false;
}
public override bool SetTitleImage(Sprite sprite)
{
return gameOriginMainMenuUI.SetTitle(sprite);
}
public override TMP_FontAsset CreateFontAsset(string fontFilePath)
{
var font = Font.CreateDynamicFontFromOSFont(fontFilePath, 24);
var tmpFont = TMP_FontAsset.CreateFontAsset(
font,
samplingPointSize: 72, // 采样点大小,影响字体质量
atlasPadding: 4, // 图集内字符间距
renderMode: GlyphRenderMode.SDFAA, // 推荐使用 SDF 抗锯齿模式
atlasWidth: 1024, // 图集宽度 (2的幂)
atlasHeight: 1024, // 图集高度 (2的幂)
atlasPopulationMode: AtlasPopulationMode.Dynamic, // 动态填充
enableMultiAtlasSupport: true // 启用多图集支持
);
return tmpFont;
}
public override bool SetFont(TMP_FontAsset font)
{
return gameOriginMainMenuUI.SetFont(font);
}
public override Texture2D? LoadTexture(string imageFilePath)
{
return Utilities.ImageLoader.LoadImageFromFile(imageFilePath);
}
}
}

View File

@@ -1,7 +0,0 @@
namespace UIFrame
{
public static class UIManager
{
}
}

View File

@@ -0,0 +1,66 @@
using System.Collections.Generic;
using UnityEngine;
namespace UIFrame.Utilities
{
public class GameObjectTool
{
/// <summary>
/// 在指定父对象下查找第一个匹配名称的子GameObject可以是孙子、曾孙等
/// </summary>
/// <param name="parent">要查找的父Transform。</param>
/// <param name="name">要查找的GameObject的名称。</param>
/// <returns>找到的GameObject如果未找到则返回null。</returns>
public static GameObject? FindChildByName(Transform parent, string name)
{
// 查找父对象本身是否就是目标对象
if (parent.name.Equals(name))
{
return parent.gameObject;
}
// 遍历所有直接子对象
foreach (Transform child in parent)
{
// 检查当前子对象是否是目标对象
if (child.name.Equals(name))
{
return child.gameObject;
}
// 递归查找子对象的子对象
var found = FindChildByName(child, name);
if (found)
{
return found;
}
}
return null;
}
/// <summary>
/// 在指定父对象下查找所有匹配名称的子GameObject可以是孙子、曾孙等不区分大小写。
/// </summary>
/// <param name="parent">要查找的父Transform。</param>
/// <param name="name">要查找的GameObject的名称。</param>
/// <returns>所有找到的GameObject列表。</returns>
public static List<GameObject> FindChildrenByName(Transform parent, string name)
{
var foundObjects = new List<GameObject>();
FindChildrenByNameRecursive(parent, name, foundObjects);
return foundObjects;
}
private static void FindChildrenByNameRecursive(Transform currentTransform, string name, List<GameObject> foundObjects)
{
// 检查当前对象是否是目标对象
if (currentTransform.name.Equals(name))
{
foundObjects.Add(currentTransform.gameObject);
}
// 遍历所有子对象并递归查找
foreach (Transform child in currentTransform)
{
FindChildrenByNameRecursive(child, name, foundObjects);
}
}
}
}

View File

@@ -0,0 +1,67 @@
using System;
using System.IO;
using UnityEngine;
namespace UIFrame.Utilities
{
public class ImageLoader
{
/// <summary>
/// 从指定文件路径加载图片并创建 Texture2D。
/// 支持常用的图片格式 (如 .png, .jpg, .jpeg, .bmp, .tga)
/// </summary>
/// <param name="filePath">图片文件的绝对路径。</param>
/// <param name="createNewTexture">如果为true则创建一个新的Texture2D对象并加载图片数据。如果为false它会尝试加载到默认的空白Texture2D对象上但通常建议使用true。</param>
/// <param name="linear">指定纹理是否加载为线性颜色空间 (true) 或 sRGB 颜色空间 (false)。</param>
/// <returns>加载成功的 Texture2D 对象,如果失败则返回 null。</returns>
public static Texture2D? LoadImageFromFile(string filePath, bool createNewTexture = true, bool linear = false)
{
if (string.IsNullOrEmpty(filePath))
{
Debug.LogError("ImageLoader: 图片文件路径为空或无效。");
return null;
}
if (!File.Exists(filePath))
{
Debug.LogError($"ImageLoader: 文件不存在于路径: {filePath}");
return null;
}
Texture2D? texture = null;
try
{
var fileData = File.ReadAllBytes(filePath);
if (createNewTexture)
{
texture = new Texture2D(2, 2, TextureFormat.RGBA32, false, linear);
}
else if (texture == null)
{
Debug.LogError("ImageLoader: 未能提供现有Texture2D用于加载且createNewTexture为false。");
return null;
}
var success = texture.LoadImage(fileData, true);
if (!success)
{
Debug.LogError($"ImageLoader: 无法加载图片数据到Texture2D。请检查文件是否为有效的图片格式或是否损坏: {filePath}");
UnityEngine.Object.Destroy(texture); // 销毁失败的纹理对象
return null;
}
return texture;
}
catch (Exception ex)
{
Debug.LogError($"ImageLoader: 加载图片时发生错误: {filePath} - {ex.Message}");
if (texture != null)
{
UnityEngine.Object.Destroy(texture); // 发生异常时销毁已创建的纹理
}
return null;
}
}
}
}

View File

@@ -13,7 +13,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("UIFrame")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0206a83f56b5a794fe2f173b4a047cc4f0d4cd90")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5d69efbc3f80a5422cef0884e02fb27adf20b467")]
[assembly: System.Reflection.AssemblyProductAttribute("UIFrame")]
[assembly: System.Reflection.AssemblyTitleAttribute("UIFrame")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
eb1c4a5bd10a6004eb2efc2bf4354383e0389ddf5e8c9585686a601d75e8a73a
2fde23c3fee254f6fc8f4689686f8631f1cec9f5b900327d5b657c6830a03267

View File

@@ -1 +1 @@
26cd918e8bf85dee638761fbef4e2117b1734f804498932e0dc10264a1740877
8df4ddcbe4b7016ad51bf9e0b9ea8b606b36f4d0bbae7f1650b893a49036873e

Binary file not shown.

View File

@@ -49,6 +49,12 @@
"frameworks": {
"netstandard2.1": {
"targetAlias": "netstandard2.1",
"dependencies": {
"Lib.Harmony": {
"target": "Package",
"version": "[2.4.1, )"
}
},
"imports": [
"net461",
"net462",

View File

@@ -1,11 +1,165 @@
{
"version": 3,
"targets": {
".NETStandard,Version=v2.1": {}
".NETStandard,Version=v2.1": {
"Lib.Harmony/2.4.1": {
"type": "package",
"dependencies": {
"Lib.Harmony.Ref": "2.4.1"
},
"compile": {
"lib/netstandard2.0/_._": {}
},
"runtime": {
"lib/netstandard2.0/_._": {}
}
},
"Lib.Harmony.Ref/2.4.1": {
"type": "package",
"dependencies": {
"System.Reflection.Emit": "4.7.0"
},
"compile": {
"ref/netstandard2.0/0Harmony.dll": {
"related": ".xml"
}
}
},
"System.Reflection.Emit/4.7.0": {
"type": "package",
"compile": {
"ref/netstandard2.1/_._": {}
},
"runtime": {
"lib/netstandard2.1/_._": {}
}
}
}
},
"libraries": {
"Lib.Harmony/2.4.1": {
"sha512": "iLTZi/kKKB18jYEIwReZSx2xXyVUh4J1swReMgvYBBBn4tzA1Nd0PJlVyntY5BDdSiXSxzmvjc/3OYfFs0YwFg==",
"type": "package",
"path": "lib.harmony/2.4.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"HarmonyLogo.png",
"LICENSE",
"README.md",
"lib.harmony.2.4.1.nupkg.sha512",
"lib.harmony.nuspec",
"lib/net35/0Harmony.dll",
"lib/net35/0Harmony.pdb",
"lib/net35/0Harmony.xml",
"lib/net452/0Harmony.dll",
"lib/net452/0Harmony.pdb",
"lib/net452/0Harmony.xml",
"lib/net472/0Harmony.dll",
"lib/net472/0Harmony.pdb",
"lib/net472/0Harmony.xml",
"lib/net48/0Harmony.dll",
"lib/net48/0Harmony.pdb",
"lib/net48/0Harmony.xml",
"lib/net5.0/0Harmony.dll",
"lib/net5.0/0Harmony.pdb",
"lib/net5.0/0Harmony.xml",
"lib/net6.0/0Harmony.dll",
"lib/net6.0/0Harmony.pdb",
"lib/net6.0/0Harmony.xml",
"lib/net7.0/0Harmony.dll",
"lib/net7.0/0Harmony.pdb",
"lib/net7.0/0Harmony.xml",
"lib/net8.0/0Harmony.dll",
"lib/net8.0/0Harmony.pdb",
"lib/net8.0/0Harmony.xml",
"lib/net9.0/0Harmony.dll",
"lib/net9.0/0Harmony.pdb",
"lib/net9.0/0Harmony.xml",
"lib/netcoreapp3.0/0Harmony.dll",
"lib/netcoreapp3.0/0Harmony.pdb",
"lib/netcoreapp3.0/0Harmony.xml",
"lib/netcoreapp3.1/0Harmony.dll",
"lib/netcoreapp3.1/0Harmony.pdb",
"lib/netcoreapp3.1/0Harmony.xml",
"lib/netstandard2.0/_._"
]
},
"Lib.Harmony.Ref/2.4.1": {
"sha512": "+u1y2Qd6OlSUQ8JtrsrSo3adnAsrXMJ2YPYtbW+FAmdPI5yw34M9VX4bKl8ZwRuUzaGzZIz+oGMbn/yS4fWtZw==",
"type": "package",
"path": "lib.harmony.ref/2.4.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"HarmonyLogo.png",
"LICENSE",
"README.md",
"lib.harmony.ref.2.4.1.nupkg.sha512",
"lib.harmony.ref.nuspec",
"ref/netstandard2.0/0Harmony.dll",
"ref/netstandard2.0/0Harmony.xml"
]
},
"System.Reflection.Emit/4.7.0": {
"sha512": "VR4kk8XLKebQ4MZuKuIni/7oh+QGFmZW3qORd1GvBq/8026OpW501SzT/oypwiQl4TvT8ErnReh/NzY9u+C6wQ==",
"type": "package",
"path": "system.reflection.emit/4.7.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/MonoAndroid10/_._",
"lib/MonoTouch10/_._",
"lib/net45/_._",
"lib/netcore50/System.Reflection.Emit.dll",
"lib/netcoreapp2.0/_._",
"lib/netstandard1.1/System.Reflection.Emit.dll",
"lib/netstandard1.1/System.Reflection.Emit.xml",
"lib/netstandard1.3/System.Reflection.Emit.dll",
"lib/netstandard2.0/System.Reflection.Emit.dll",
"lib/netstandard2.0/System.Reflection.Emit.xml",
"lib/netstandard2.1/_._",
"lib/xamarinios10/_._",
"lib/xamarinmac20/_._",
"lib/xamarintvos10/_._",
"lib/xamarinwatchos10/_._",
"ref/MonoAndroid10/_._",
"ref/MonoTouch10/_._",
"ref/net45/_._",
"ref/netcoreapp2.0/_._",
"ref/netstandard1.1/System.Reflection.Emit.dll",
"ref/netstandard1.1/System.Reflection.Emit.xml",
"ref/netstandard1.1/de/System.Reflection.Emit.xml",
"ref/netstandard1.1/es/System.Reflection.Emit.xml",
"ref/netstandard1.1/fr/System.Reflection.Emit.xml",
"ref/netstandard1.1/it/System.Reflection.Emit.xml",
"ref/netstandard1.1/ja/System.Reflection.Emit.xml",
"ref/netstandard1.1/ko/System.Reflection.Emit.xml",
"ref/netstandard1.1/ru/System.Reflection.Emit.xml",
"ref/netstandard1.1/zh-hans/System.Reflection.Emit.xml",
"ref/netstandard1.1/zh-hant/System.Reflection.Emit.xml",
"ref/netstandard2.0/System.Reflection.Emit.dll",
"ref/netstandard2.0/System.Reflection.Emit.xml",
"ref/netstandard2.1/_._",
"ref/xamarinios10/_._",
"ref/xamarinmac20/_._",
"ref/xamarintvos10/_._",
"ref/xamarinwatchos10/_._",
"runtimes/aot/lib/netcore50/System.Reflection.Emit.dll",
"runtimes/aot/lib/netcore50/System.Reflection.Emit.xml",
"system.reflection.emit.4.7.0.nupkg.sha512",
"system.reflection.emit.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
}
},
"libraries": {},
"projectFileDependencyGroups": {
".NETStandard,Version=v2.1": []
".NETStandard,Version=v2.1": [
"Lib.Harmony >= 2.4.1"
]
},
"packageFolders": {
"C:\\Users\\Lenovo\\.nuget\\packages\\": {},
@@ -56,6 +210,12 @@
"frameworks": {
"netstandard2.1": {
"targetAlias": "netstandard2.1",
"dependencies": {
"Lib.Harmony": {
"target": "Package",
"version": "[2.4.1, )"
}
},
"imports": [
"net461",
"net462",

View File

@@ -1,8 +1,12 @@
{
"version": 2,
"dgSpecHash": "A4ZumVBkozg=",
"dgSpecHash": "b0JcKXS9rW0=",
"success": true,
"projectFilePath": "D:\\vs_project\\DuckovMods\\UIFrame\\UIFrame.csproj",
"expectedPackageFiles": [],
"expectedPackageFiles": [
"C:\\Users\\Lenovo\\.nuget\\packages\\lib.harmony\\2.4.1\\lib.harmony.2.4.1.nupkg.sha512",
"C:\\Users\\Lenovo\\.nuget\\packages\\lib.harmony.ref\\2.4.1\\lib.harmony.ref.2.4.1.nupkg.sha512",
"C:\\Users\\Lenovo\\.nuget\\packages\\system.reflection.emit\\4.7.0\\system.reflection.emit.4.7.0.nupkg.sha512"
],
"logs": []
}

View File

@@ -1 +1 @@
"restore":{"projectUniqueName":"D:\\vs_project\\DuckovMods\\UIFrame\\UIFrame.csproj","projectName":"UIFrame","projectPath":"D:\\vs_project\\DuckovMods\\UIFrame\\UIFrame.csproj","outputPath":"D:\\vs_project\\DuckovMods\\UIFrame\\obj\\","projectStyle":"PackageReference","fallbackFolders":["D:\\vsShare\\NuGetPackages"],"originalTargetFrameworks":["netstandard2.1"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"NETStandard.Library":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.306\\RuntimeIdentifierGraph.json"}}
"restore":{"projectUniqueName":"D:\\vs_project\\DuckovMods\\UIFrame\\UIFrame.csproj","projectName":"UIFrame","projectPath":"D:\\vs_project\\DuckovMods\\UIFrame\\UIFrame.csproj","outputPath":"D:\\vs_project\\DuckovMods\\UIFrame\\obj\\","projectStyle":"PackageReference","fallbackFolders":["D:\\vsShare\\NuGetPackages"],"originalTargetFrameworks":["netstandard2.1"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"direct"},"SdkAnalysisLevel":"9.0.300"}"frameworks":{"netstandard2.1":{"targetAlias":"netstandard2.1","dependencies":{"Lib.Harmony":{"target":"Package","version":"[2.4.1, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"NETStandard.Library":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\9.0.306\\RuntimeIdentifierGraph.json"}}

View File

@@ -1 +1 @@
17620796287866771
17623343068138064