Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / ResourceManager.cs
@小李xl 小李xl on 20 May 2023 3 KB 升级到Godot4.1.dev2
using System.Collections.Generic;
using Godot;

/// <summary>
/// 资源管理器
/// </summary>
public static class ResourceManager
{
    /// <summary>
    /// 颜色混合材质
    /// </summary>
    public static ShaderMaterial BlendMaterial
    {
        get
        {
            if (_shadowMaterial == null)
            {
                _shadowMaterial = Load<ShaderMaterial>(ResourcePath.resource_material_Blend_tres);
            }

            return _shadowMaterial;
        }
    }

    private static ShaderMaterial _shadowMaterial;

    /// <summary>
    /// 颜色混合Shader
    /// </summary>
    public static Shader BlendShader
    {
        get
        {
            if (_shadowShader == null)
            {
                _shadowShader = Load<Shader>(ResourcePath.resource_material_Blend_tres);
            }

            return _shadowShader;
        }
    }

    private static Shader _shadowShader;

    /// <summary>
    /// 默认字体资源, 字体大小16px
    /// </summary>
    public static Font DefaultFont16Px
    {
        get
        {
            if (_defaultFont16Px == null)
            {
                _defaultFont16Px = Load<Font>(ResourcePath.resource_font_VonwaonBitmap16px_ttf);
            }

            return _defaultFont16Px;
        }
    }
    private static Font _defaultFont16Px;
    
    /// <summary>
    /// 默认字体资源, 字体大小12px
    /// </summary>
    public static Font DefaultFont12Px
    {
        get
        {
            if (_defaultFont12Px == null)
            {
                _defaultFont12Px = Load<Font>(ResourcePath.resource_font_VonwaonBitmap12px_ttf);
            }

            return _defaultFont12Px;
        }
    }
    private static Font _defaultFont12Px;
    
    //缓存的资源
    private static readonly Dictionary<string, object> CachePack = new Dictionary<string, object>();

    /// <summary>
    /// 加载资源对象, 并且缓存当前资源对象, 可频繁获取
    /// </summary>
    /// <param name="path">资源路径</param>
    /// <param name="useCache">是否使用缓存中的资源</param>
    public static T Load<T>(string path, bool useCache = true) where T : class
    {
        if (!useCache)
        {
            var res = ResourceLoader.Load<T>(path, null, ResourceLoader.CacheMode.Ignore);
            if (res == null)
            {
                GD.PrintErr("加载资源失败, 未找到资源: " + path);
                return default;
            }

            return res;
        }

        if (CachePack.TryGetValue(path, out var pack))
        {
            return pack as T;
        }

        pack = ResourceLoader.Load<T>(path);
        if (pack != null)
        {
            CachePack.Add(path, pack);
            return pack as T;
        }
        else
        {
            GD.PrintErr("加载资源失败, 未找到资源: " + path);
        }

        return default;
    }

    /// <summary>
    /// 加载并且实例化场景, 并返回
    /// </summary>
    /// <param name="path">场景路径</param>
    public static T LoadAndInstantiate<T>(string path) where T : Node
    {
        var packedScene = Load<PackedScene>(path);
        return packedScene.Instantiate<T>();
    }
}