Files

177 lines
6.1 KiB
C#
Raw Permalink Normal View History

2025-12-12 15:19:10 +08:00
using Convention;
2025-12-15 17:20:55 +08:00
using Demo.Game.Attr;
using Demo.Game.ConfigType;
2025-09-25 19:04:05 +08:00
using System.Collections;
2025-12-02 15:26:41 +08:00
using System.Collections.Generic;
2025-12-16 17:54:51 +08:00
using System.IO;
2025-12-19 15:54:51 +08:00
using System.Linq;
2025-09-25 19:04:05 +08:00
using UnityEngine;
namespace Demo.Game
{
2025-12-16 17:54:51 +08:00
namespace ConfigType
{
public class SkyUpdatementConfig : UpdatementIntConfig
{
public string SkyAssetBundlePath;
public string[] SkyNames;
public int[] SkyIndexs;
public override void Deserialize(BinaryReader reader)
{
SkyAssetBundlePath = BinarySerializeUtility.ReadString(reader);
SkyNames = BinarySerializeUtility.DeserializeStringArray(reader);
SkyIndexs = BinarySerializeUtility.DeserializeIntArray(reader);
base.Deserialize(reader);
2025-12-19 15:54:51 +08:00
var sky = (SkyUpdatement)target;
sky.Load(SkyAssetBundlePath);
for (int i = 0, e = SkyNames.Length; i < e; i++)
{
sky.NameCache.Add(SkyNames[i], SkyIndexs[i]);
sky.IndexCache.Add(SkyIndexs[i], SkyNames[i]);
sky.SkyAssetBundleLoaderStatus++;
IEnumerator Foo()
{
yield return new WaitUntil(() => sky.SkyAssetBundle != null);
var ir = sky.SkyAssetBundle.LoadAssetAsync<Material>(SkyNames[i]);
ir.completed += delegate
{
var mat = ir.asset as Material;
sky.MaterialCache[SkyIndexs[i]] = mat;
sky.SkyAssetBundleLoaderStatus--;
};
yield return ir;
}
ConventionUtility.StartCoroutine(Foo());
}
2025-12-16 17:54:51 +08:00
}
public override void Serialize(BinaryWriter writer)
{
BinarySerializeUtility.WriteString(writer, SkyAssetBundlePath);
2025-12-19 15:54:51 +08:00
var sky = (SkyUpdatement)target;
int e = sky.NameCache.Count;
SkyNames =new string[e];
SkyIndexs=new int[e];
int i = 0;
foreach (var item in sky.NameCache)
{
SkyNames[i] = item.Key;
SkyIndexs[i] = item.Value;
}
2025-12-16 17:54:51 +08:00
BinarySerializeUtility.SerializeArray(writer, SkyNames);
BinarySerializeUtility.SerializeArray(writer, SkyIndexs);
base.Serialize(writer);
}
}
}
2025-12-12 15:19:10 +08:00
[Scriptable]
2025-12-02 15:26:41 +08:00
public class SkyUpdatement : Updatement<int>, IAssetBundleLoader
2025-09-25 19:04:05 +08:00
{
protected override ScriptLoadableConfig MakeConfig()
{
return new SkyUpdatementConfig();
}
2025-09-25 19:04:05 +08:00
public static SkyUpdatement Make()
{
return new GameObject().AddComponent<SkyUpdatement>();
}
2025-12-19 15:54:51 +08:00
internal int SkyAssetBundleLoaderStatus = 0;
internal readonly Dictionary<string, int> NameCache = new();
internal readonly Dictionary<int, string> IndexCache = new();
internal readonly Dictionary<int, Material> MaterialCache = new();
2025-12-02 15:26:41 +08:00
2025-12-19 15:54:51 +08:00
public string SkyAssetBundlePath
{
get => GetConfig<SkyUpdatementConfig>().SkyAssetBundlePath;
set => GetConfig<SkyUpdatementConfig>().SkyAssetBundlePath = value;
}
2025-09-25 19:04:05 +08:00
public AssetBundle SkyAssetBundle;
2025-12-02 15:26:41 +08:00
protected override int Lerp(int begin, int end, float t)
2025-09-25 19:04:05 +08:00
{
return begin;
}
[Content, SerializeField] private int Cache = -1;
protected override IEnumerator DoSomethingDuringApplyScript()
{
yield return base.DoSomethingDuringApplyScript();
yield return new WaitUntil(() => SkyAssetBundleLoaderStatus == 0);
}
2025-09-25 19:04:05 +08:00
2025-12-02 15:26:41 +08:00
protected override void UpdateData(int data)
2025-09-25 19:04:05 +08:00
{
if (string.IsNullOrEmpty(SkyAssetBundlePath))
return;
if (Cache != data)
{
if (data < 0)
RenderSettings.skybox = null;
else
RenderSettings.skybox = MaterialCache[data];
2025-09-25 19:04:05 +08:00
Cache = data;
}
}
public override IEnumerator UnloadScript()
{
2025-12-02 15:26:41 +08:00
Cache = -1;
2025-09-25 19:04:05 +08:00
if (string.IsNullOrEmpty(SkyAssetBundlePath) == false)
yield return this.UnloadAssetBundle(SkyAssetBundlePath);
SkyAssetBundlePath = "";
yield return base.UnloadScript();
}
/// <summary>
/// 对应ab包名称自动匹配对应平台
/// </summary>
/// <param name="ab"></param>
[Convention.RScript.Variable.Attr.Method]
public void Load(string ab)
2025-09-25 19:04:05 +08:00
{
SkyAssetBundleLoaderStatus++;
ConventionUtility.StartCoroutine(this.LoadAssetBundle(ab, x =>
{
SkyAssetBundlePath = ab;
SkyAssetBundle = x;
SkyAssetBundleLoaderStatus--;
}));
2025-09-25 19:04:05 +08:00
}
/// <summary>
/// 在指定时刻切换天空
/// </summary>
/// <param name="time"></param>
/// <param name="sky"></param>
[Convention.RScript.Variable.Attr.Method]
public void Add(float time, string sky)
2025-09-25 19:04:05 +08:00
{
IEnumerator Foo()
{
yield return new WaitUntil(() => SkyAssetBundle != null);
var ir = SkyAssetBundle.LoadAssetAsync<Material>(sky);
ir.completed += delegate
2025-12-02 15:26:41 +08:00
{
var mat = ir.asset as Material;
if (NameCache.TryGetValue(sky, out int id) == false)
{
id = NameCache.Count;
NameCache[sky] = id;
2025-12-19 15:54:51 +08:00
IndexCache[id] = sky;
}
MaterialCache[id] = mat;
ManualAddEntry(time, id, default);
SkyAssetBundleLoaderStatus--;
};
yield return ir;
}
SkyAssetBundleLoaderStatus++;
ConventionUtility.StartCoroutine(Foo());
2025-11-12 10:18:50 +08:00
}
2025-09-25 19:04:05 +08:00
}
}