ProcedureBusiness.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using GameFramework.Fsm;
  2. using GameFramework.Procedure;
  3. using GameFramework.Resource;
  4. //using HybridCLR;
  5. using System.Collections.Generic;
  6. using UnityEngine;
  7. using UnityGameFramework.Runtime;
  8. namespace GFMain
  9. {
  10. public class ProcedureBusiness : GameFramework.Procedure.ProcedureBase
  11. {
  12. protected override void OnInit(IFsm<IProcedureManager> procedureOwner)
  13. {
  14. base.OnInit(procedureOwner);
  15. }
  16. protected override void OnEnter(IFsm<IProcedureManager> procedureOwner)
  17. {
  18. base.OnEnter(procedureOwner);
  19. BetterStreamingAssets.Initialize();
  20. #if !UNITY_EDITOR
  21. //LoadMetadataForAOTAssemblies();
  22. //MainEntry.Resource.LoadBinary("Assets/_ProjectWuJiang/ProjectWuJiang.dll.bytes", new LoadBinaryCallbacks(OnLoadSuccess, OnLoadFailed));
  23. InitBusiness();
  24. #else
  25. InitBusiness();
  26. #endif
  27. }
  28. /// <summary>
  29. /// 为aot assembly加载原始metadata, 这个代码放aot或者热更新都行。
  30. /// 一旦加载后,如果AOT泛型函数对应native实现不存在,则自动替换为解释模式执行
  31. /// </summary>
  32. private static void LoadMetadataForAOTAssemblies()
  33. {
  34. //List<string> aotMetaAssemblyFiles = new List<string>()
  35. //{
  36. // "mscorlib.dll",
  37. // "System.dll",
  38. // "System.Core.dll",
  39. //};
  40. ///// 注意,补充元数据是给AOT dll补充元数据,而不是给热更新dll补充元数据。
  41. ///// 热更新dll不缺元数据,不需要补充,如果调用LoadMetadataForAOTAssembly会返回错误
  42. //HomologousImageMode mode = HomologousImageMode.SuperSet;
  43. //foreach (var aotDllName in aotMetaAssemblyFiles)
  44. //{
  45. // byte[] dllBytes = BetterStreamingAssets.ReadAllBytes("_MetadataForAOTAssemblies/" + aotDllName + ".bytes");
  46. // // 加载assembly对应的dll,会自动为它hook。一旦aot泛型函数的native函数不存在,用解释器版本代码
  47. // LoadImageErrorCode err = RuntimeApi.LoadMetadataForAOTAssembly(dllBytes, mode);
  48. // Debug.Log($"LoadMetadataForAOTAssembly:{aotDllName}. mode:{mode} ret:{err}");
  49. //}
  50. }
  51. private void OnLoadFailed(string binaryAssetName, LoadResourceStatus status, string errorMessage, object userData)
  52. {
  53. Log.Error(errorMessage);
  54. MainEntry.CommonUI.messageBox.ShowMessage("123");
  55. }
  56. private void OnLoadSuccess(string binaryAssetName, byte[] binaryBytes, float duration, object userData)
  57. {
  58. System.Reflection.Assembly.Load(binaryBytes);
  59. Debug.Log(binaryAssetName);
  60. InitBusiness();
  61. }
  62. private void InitBusiness()
  63. {
  64. MainEntry.Resource.LoadAsset("Assets/_DTYJ/Scripts/Main/__Main__.prefab", new LoadAssetCallbacks(
  65. (assetName, asset, duration, userData) =>
  66. {//success
  67. Object.Instantiate(asset as GameObject).name = "__Main__";
  68. },
  69. (assetName, asset, duration, userData) =>
  70. {//failure
  71. }));
  72. }
  73. protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds, float realElapseSeconds)
  74. {
  75. base.OnUpdate(procedureOwner, elapseSeconds, realElapseSeconds);
  76. }
  77. }
  78. }