Core/GameEngine/Model/Config/TalentConfig.cs
New file @@ -0,0 +1,59 @@ //-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Tuesday, August 21, 2018 //-------------------------------------------------------- using UnityEngine; using System; namespace TableConfig { public partial class TalentConfig : ConfigBase { public int SkillId { get ; private set ; } public int series { get ; private set ; } public int talentType { get ; private set ; } public int SkillLv { get ; private set ; } public int property { get ; private set ; } public int propertyValue { get ; private set ; } public int seriesCondition { get ; private set ; } public int point { get ; private set ; } public override string getKey() { return SkillId.ToString(); } public override void Parse() { try { SkillId=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; series=IsNumeric(rawContents[1]) ? int.Parse(rawContents[1]):0; talentType=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0; SkillLv=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0; property=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0; propertyValue=IsNumeric(rawContents[5]) ? int.Parse(rawContents[5]):0; seriesCondition=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0; point=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0; } catch (Exception ex) { DebugEx.Log(ex); } } } } Core/GameEngine/Model/Config/TalentConfig.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 86eb4a564c7dcb047bb4509cf2e2758a timeCreated: 1534837559 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: Core/GameEngine/Model/ConfigManager.cs
@@ -188,6 +188,7 @@ AddAsyncTask<OrderInfoConfig>(); AddAsyncTask<TrialExchangeConfig>(); AddAsyncTask<TrialRewardsConfig>(); AddAsyncTask<TalentConfig>(); while (!AllCompleted()) { System/Skill/SkillPanel.cs
@@ -62,6 +62,15 @@ private void OnTalentFunc() { CloseChild(); functionOrder = 2; if (windowState == WindowState.Opened) { WindowCenter.Instance.OpenWithoutAnimation<TalentWin>(); } else { WindowCenter.Instance.Open<TalentWin>(); } } private void OnAccordFunc() @@ -83,7 +92,7 @@ protected override void OnActived() { base.OnActived(); functionButtonTalent.state = TitleBtnState.Locked; //functionButtonTalent.state = TitleBtnState.Locked; if (functionOrder == 0 && model.jumpToPass) { @@ -123,6 +132,10 @@ if (WindowCenter.Instance.CheckOpen<SkillPassWin>()) { WindowCenter.Instance.CloseImmediately<SkillPassWin>(); } if (WindowCenter.Instance.CheckOpen<TalentWin>()) { WindowCenter.Instance.CloseImmediately<TalentWin>(); } } } } System/Skill/TalentButtonBehaviour.cs
New file @@ -0,0 +1,54 @@ using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class TalentButtonBehaviour : MonoBehaviour { [SerializeField] Button m_Button; [SerializeField] Image m_Icon; [SerializeField] Text m_TalentType; [SerializeField] Text m_TalentPoint; TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } } int talentType = 0; int series = 0; private void Awake() { m_Button.onClick.AddListener(SelectType); } private void SelectType() { if (talentType != 0) { model.selectTalentType = talentType; } } public void Display(int _series, int _type) { series = _series; talentType = _type; OnSelectTalentTypeEvnet(); model.OnSelectTalentTypeEvnet -= OnSelectTalentTypeEvnet; model.OnSelectTalentTypeEvnet += OnSelectTalentTypeEvnet; } public void Dispose() { model.OnSelectTalentTypeEvnet -= OnSelectTalentTypeEvnet; } private void OnSelectTalentTypeEvnet() { m_Button.image.SetSprite(talentType == model.selectTalentType ? "Title_TabRight" : "Title_TabDark"); } } } System/Skill/TalentButtonBehaviour.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 44434ba8a44224c408afd5e00a00f571 timeCreated: 1533004940 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: System/Skill/TalentModel.cs
New file @@ -0,0 +1,258 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using TableConfig; using System; namespace Snxxz.UI { public class TalentModel : Model, IPlayerLoginOk, IBeforePlayerDataInitialize { Dictionary<int, TalentSkill> talentSkillDict = new Dictionary<int, TalentSkill>(); Dictionary<int, Dictionary<int, List<int>>> talentSkills = new Dictionary<int, Dictionary<int, List<int>>>(); int m_SelectSeries; public int selectSeries { get { return m_SelectSeries; } set { if (m_SelectSeries != value && OnSelectSeriesEvent != null) { m_SelectSeries = value; OnSelectSeriesEvent(); } m_SelectSeries = value; } } int m_SelectTalentType; public int selectTalentType { get { return m_SelectTalentType; } set { if (m_SelectTalentType != value && OnSelectTalentTypeEvnet != null) { m_SelectTalentType = value; OnSelectTalentTypeEvnet(); } m_SelectTalentType = value; } } int m_SelectSkill; public int selectSkill { get { return m_SelectSkill; } set { if (m_SelectSkill != value && OnSelectSkillEvent != null) { m_SelectSkill = value; OnSelectSkillEvent(); } m_SelectSkill = value; } } public event Action OnSelectTalentTypeEvnet; public event Action OnSelectSeriesEvent; public event Action OnSelectSkillEvent; public event Action talentPointUpdate; public event Action<int> talentSkillUpdate; public override void Init() { //ParseConfig(); FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent; } public void OnBeforePlayerDataInitialize() { foreach (var talent in talentSkillDict.Values) { talent.level = 0; } } public void OnPlayerLoginOk() { } public override void UnInit() { FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent; } private void OnFuncStateChangeEvent(int _id) { if (_id == (int)FuncOpenEnum.Talent) { UpdateRedpoint(); } } void ParseConfig() { var configs = ConfigManager.Instance.GetAllValues<TalentConfig>(); for (int i = 0; i < configs.Count; i++) { var skillId = configs[i].SkillId; var skillConfig = ConfigManager.Instance.GetTemplate<SkillConfig>(skillId); TalentSkill talent; if (!TryGetTalent(skillConfig.SkillTypeID, out talent)) { talent = new TalentSkill(skillConfig.SkillTypeID, skillConfig.SkillMaxLV); talent.level = 0; talentSkillDict.Add(skillConfig.SkillTypeID, talent); Dictionary<int, List<int>> dict = null; if (!talentSkills.TryGetValue(skillConfig.UseType, out dict)) { dict = new Dictionary<int, List<int>>(); talentSkills.Add(skillConfig.UseType, dict); } List<int> list = null; var type = configs[i].series * 10 + configs[i].talentType; if (!dict.TryGetValue(type, out list)) { list = new List<int>(); dict.Add(type, list); } list.Add(skillConfig.SkillTypeID); } } } public bool TryGetTalents(int job, int series, int talentType, out List<int> talents) { talents = null; Dictionary<int, List<int>> dict = null; var _job = (int)Math.Pow(2, job); talentSkills.TryGetValue(_job, out dict); if (null != dict) { return dict.TryGetValue(series * 10 + talentType, out talents); } return false; } public bool TryGetTalent(int talentId,out TalentSkill talent) { return talentSkillDict.TryGetValue(talentId, out talent); } public int GetTalentTypeTotalPoint(int series, int talentType) { var job = (int)Math.Pow(PlayerDatas.Instance.baseData.Job, 2); List<int> list; var point = 0; if (TryGetTalents(job, series, talentType, out list)) { for (int i = 0; i < list.Count; i++) { TalentSkill talent; if (TryGetTalent(list[i], out talent)) { point += talent.level; } } } return point; } public bool SatisfyLevelUp(int talentId, out int error) { error = 0; TalentSkill talent; if (TryGetTalent(talentId, out talent)) { if (talent.level >= talent.max) { error = 1; return false; } if (talentPoint <= 0) { error = 2; return false; } var talentConfig = ConfigManager.Instance.GetTemplate<TalentConfig>(talent.skillId + talent.level); if (talentConfig.property != 0) { if (UIHelper.GetPropertyMapPlayerData((AttrEnum)talentConfig.property) < talentConfig.propertyValue) { error = 3; return false; } } if (talentConfig.seriesCondition != 0) { if (GetTalentTypeTotalPoint(talentConfig.series, talentConfig.seriesCondition) < talentConfig.point) { error = 4; return false; } } var skillConfig = ConfigManager.Instance.GetTemplate<SkillConfig>(talent.skillId + talent.level); if (skillConfig.LearnSkillReq != 0) { TalentSkill learnTalent; if (TryGetTalent(skillConfig.LearnSkillReq, out learnTalent)) { if (learnTalent.level < skillConfig.LearnSkillLV) { error = 5; return false; } } } } return true; } public void ProcessLevelUpError(int error) { } #region 服务端数据 public int talentPoint { get; private set; } public void UpdateTalent() { UpdateRedpoint(); } #endregion #region 红点 Redpoint talentRedpoint = new Redpoint(103, 10303); void UpdateRedpoint() { talentRedpoint.state = RedPointState.None; if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Talent)) { return; } if (talentPoint > 0) { talentRedpoint.state = RedPointState.Simple; } } #endregion } public class TalentSkill { public int skillId { get; private set; } public int level { get; set; } public int max { get; private set; } public TalentSkill(int id, int maxLevel) { skillId = id; max = maxLevel; } } } System/Skill/TalentModel.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 94d2b0e6415910d47a88b77e252ec3a0 timeCreated: 1532942625 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: System/Skill/TalentSkillBehaviour.cs
New file @@ -0,0 +1,70 @@ using System; using System.Collections; using System.Collections.Generic; using TableConfig; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class TalentSkillBehaviour : MonoBehaviour { [SerializeField] Image m_Icon; [SerializeField] Text m_Level; [SerializeField] Button m_Button; int skillId = 0; TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } } private void Awake() { m_Button.onClick.AddListener(SelectSkill); } public void Display(int _skillId) { skillId = _skillId; model.talentSkillUpdate -= TalentSkillUpdate; model.talentSkillUpdate += TalentSkillUpdate; Display(); } private void Display() { TalentSkill talent; if (model.TryGetTalent(skillId, out talent)) { var config = ConfigManager.Instance.GetTemplate<SkillConfig>(talent.skillId); if (config != null) { m_Icon.SetSprite(config.IconName); } m_Level.text = StringUtility.Contact(talent.level, "/", talent.max); m_Icon.material = talent.level > 0 ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial(); } } private void TalentSkillUpdate(int _skillid) { if (skillId == _skillid) { Display(); } } public void Dispose() { model.talentSkillUpdate -= TalentSkillUpdate; } private void SelectSkill() { if (skillId != 0) { model.selectSkill = skillId; } } } } System/Skill/TalentSkillBehaviour.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 5359bc88b0bc7cd439412a99efda7dbb timeCreated: 1533007965 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: System/Skill/TalentSkillScriptableObject.cs
New file @@ -0,0 +1,60 @@ using System.Collections; using System.Collections.Generic; using UnityEngine; using System; #if UNITY_EDITOR using UnityEditor; #endif public class TalentSkillScriptableObject : ScriptableObject { [SerializeField] Vector3[] m_SkillPositions; [SerializeField] Arrow[] m_Arows; [SerializeField] float m_ContentHeight; public Vector3 GetSkillPosition(int index) { if (m_SkillPositions != null && index >= 0 && index < m_SkillPositions.Length) { return m_SkillPositions[index]; } return Vector3.zero; } public Arrow GetArrow(int index) { if (m_Arows != null && index >= 0 && index < m_Arows.Length) { return m_Arows[index]; } return default(Arrow); } public float contentHeight { get { return m_ContentHeight; } } [Serializable] public struct Arrow { public int type; public Vector3 position; public Vector3 eulerAngle; public Vector2 sizeDelta; } #if UNITY_EDITOR [MenuItem("策划工具/生成天赋技能配置文件")] static void BuildMeridianConfig() { TalentSkillScriptableObject _config = CreateInstance<TalentSkillScriptableObject>(); string _path = StringUtility.Contact("Assets/Resources/ScriptableObject/Config/", "TalentSkill_", ".asset"); AssetDatabase.CreateAsset(_config, _path); AssetDatabase.Refresh(); ProjectWindowUtil.ShowCreatedAsset(_config); } #endif } System/Skill/TalentSkillScriptableObject.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: c1f6808b9ef29b446814b830489cc141 timeCreated: 1533016268 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: System/Skill/TalentWin.cs
New file @@ -0,0 +1,340 @@ //-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Tuesday, July 31, 2018 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using TableConfig; using UnityEngine; using UnityEngine.UI; namespace Snxxz.UI { public class TalentWin : Window { [SerializeField] TalentButtonBehaviour m_TalentAtkBehaviour; [SerializeField] TalentButtonBehaviour m_TalentDefBehaviour; [SerializeField] TalentButtonBehaviour m_TalentGeneralBehaviour; [SerializeField] TalentSkillScriptableObject m_TalentAtkConfig; [SerializeField] TalentSkillScriptableObject m_TalentDefConfig; [SerializeField] TalentSkillScriptableObject m_TalentGeneralConfig; [SerializeField] RectTransform m_ContainerSelect; [SerializeField] Button m_TalentSeriesSelect; [SerializeField] Text m_TalentSeries; [SerializeField] ScrollRect m_SkillScroller; [SerializeField] RectTransform m_SkillContent; [SerializeField] TalentSkillBehaviour[] m_SkillBehaviours; [SerializeField] Image[] m_Arrows; [SerializeField] RectTransform m_ContainerSelectSkill; [SerializeField] Image m_SelectSkillIcon; [SerializeField] Text m_SelectSkillLevel; [SerializeField] Text m_SelectSkillName; [SerializeField] Text[] m_SelectConditions; [SerializeField] RectTransform m_ContainerSelectEffect; [SerializeField] Text m_SelectSkillEffect; [SerializeField] RectTransform m_ContainerNextEffect; [SerializeField] Text m_SelectNextEffect; [SerializeField] Button m_ResetPoint; [SerializeField] Button m_AddPoint; [SerializeField] Text m_AddPointBtnText; [SerializeField] Text m_SurplusPoint; TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } } #region Built-in protected override void BindController() { } protected override void AddListeners() { m_TalentSeriesSelect.onClick.AddListener(TalentSelectSeries); m_ResetPoint.onClick.AddListener(ResetPoint); m_AddPoint.onClick.AddListener(AddPoint); } protected override void OnPreOpen() { model.selectSeries = 1; model.selectTalentType = 1; Display(); model.OnSelectTalentTypeEvnet += OnSelectTalentTypeEvnet; model.OnSelectSeriesEvent += OnSelectSeriesEvent; model.OnSelectSkillEvent += OnSelectSkillEvent; model.talentSkillUpdate += TalentSkillUpdate; model.talentPointUpdate += TalentPointUpdate; } protected override void OnAfterOpen() { } protected override void OnPreClose() { model.OnSelectTalentTypeEvnet -= OnSelectTalentTypeEvnet; model.OnSelectSeriesEvent -= OnSelectSeriesEvent; model.OnSelectSkillEvent -= OnSelectSkillEvent; model.talentSkillUpdate -= TalentSkillUpdate; model.talentPointUpdate -= TalentPointUpdate; m_TalentAtkBehaviour.Dispose(); m_TalentDefBehaviour.Dispose(); m_TalentGeneralBehaviour.Dispose(); for (int i = 0; i < m_SkillBehaviours.Length; i++) { m_SkillBehaviours[i].Dispose(); } } protected override void OnAfterClose() { } #endregion void Display() { m_TalentAtkBehaviour.Display(model.selectSeries, 1); m_TalentDefBehaviour.Display(model.selectSeries, 2); m_TalentGeneralBehaviour.Display(model.selectSeries, 3); DisplaySkills(); DisplaySeries(); DisplaySelectSkill(); DisplayTalentPoint(); } void DisplaySkills() { var job = PlayerDatas.Instance.baseData.Job; List<int> talentSkills; model.TryGetTalents(job, model.selectSeries, model.selectTalentType, out talentSkills); var config = model.selectTalentType == 1 ? m_TalentAtkConfig : model.selectTalentType == 2 ? m_TalentDefConfig : m_TalentGeneralConfig; m_SkillScroller.verticalNormalizedPosition = 1; m_SkillContent.sizeDelta = m_SkillContent.sizeDelta.SetY(config == null ? 0 : config.contentHeight); for (int i = 0; i < m_SkillBehaviours.Length; i++) { if (talentSkills != null && i < talentSkills.Count) { m_SkillBehaviours[i].gameObject.SetActive(true); var position = config == null ? Vector3.zero : config.GetSkillPosition(i); m_SkillBehaviours[i].transform.localPosition = position; m_SkillBehaviours[i].Display(talentSkills[i]); } else { m_SkillBehaviours[i].Dispose(); m_SkillBehaviours[i].gameObject.SetActive(false); } } model.selectSkill = talentSkills != null ? talentSkills[0] : 0; } void DisplaySeries() { var point = 0; point += model.GetTalentTypeTotalPoint(model.selectSeries, 1); point += model.GetTalentTypeTotalPoint(model.selectSeries, 2); point += model.GetTalentTypeTotalPoint(model.selectSeries, 3); m_TalentSeries.text = model.selectSeries == 1 ? string.Format("智力天赋({0})", point) : string.Format("力量天赋({0})", point); } void DisplaySelectSkill() { m_ContainerSelect.gameObject.SetActive(false); var job = PlayerDatas.Instance.baseData.Job; List<int> talentSkills; model.TryGetTalents(job, model.selectSeries, model.selectTalentType, out talentSkills); if (talentSkills != null) { var index = talentSkills.FindIndex((x) => { return x == model.selectSkill; }); if (index != -1) { if (index < m_SkillBehaviours.Length) { m_ContainerSelect.gameObject.SetActive(true); m_ContainerSelect.SetParent(m_SkillBehaviours[index].transform); m_ContainerSelect.localPosition = Vector3.zero; } } } DisplaySkillInfo(); DisplayConditions(); DisplaySkillEffect(); } void DisplayConditions() { TalentSkill talent; var index = 0; if (model.TryGetTalent(model.selectSkill, out talent)) { var talentConfig = ConfigManager.Instance.GetTemplate<TalentConfig>(talent.skillId + talent.level); var skillConfig = ConfigManager.Instance.GetTemplate<SkillConfig>(talent.skillId + talent.level); if (talentConfig != null) { if (talentConfig.property != 0 && index < m_SelectConditions.Length) { var propertyConfig = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(talentConfig.property); m_SelectConditions[index].gameObject.SetActive(true); m_SelectConditions[index].text = StringUtility.Contact( string.Format("需要{0}点:", propertyConfig.Name), UIHelper.GetPropertyMapPlayerData((AttrEnum)talentConfig.property), "/", talentConfig.propertyValue ); index++; } if (talentConfig.seriesCondition != 0 && index < m_SelectConditions.Length) { m_SelectConditions[index].gameObject.SetActive(true); m_SelectConditions[index].text = StringUtility.Contact(0, "/", talentConfig.point); index++; } } if (skillConfig != null && index < m_SelectConditions.Length) { TalentSkill learnTalent; if (skillConfig.LearnSkillReq != 0 && model.TryGetTalent(skillConfig.LearnSkillReq, out learnTalent)) { var learnSkillConfig = ConfigManager.Instance.GetTemplate<SkillConfig>(skillConfig.LearnSkillReq); m_SelectConditions[index].gameObject.SetActive(true); m_SelectConditions[index].text = StringUtility.Contact( "前置天赋: ", learnSkillConfig.SkillName, " ", learnTalent.level, "/", learnSkillConfig.LearnSkillLV ); index++; } } } for (int i = index; i < m_SelectConditions.Length; i++) { m_SelectConditions[i].gameObject.SetActive(false); } } void DisplaySkillInfo() { TalentSkill talent; m_ContainerSelectSkill.gameObject.SetActive(false); if (model.TryGetTalent(model.selectSkill, out talent)) { m_ContainerSelectSkill.gameObject.SetActive(true); var config = ConfigManager.Instance.GetTemplate<SkillConfig>(talent.skillId + talent.level); m_SelectSkillIcon.SetSprite(config.IconName); m_SelectSkillLevel.text = StringUtility.Contact(talent.level, "/", talent.max); m_SelectSkillName.text = config.SkillName; } } void DisplaySkillEffect() { TalentSkill talent; if (model.TryGetTalent(model.selectSkill, out talent)) { var config = ConfigManager.Instance.GetTemplate<SkillConfig>(talent.skillId + talent.level); m_SelectSkillEffect.text = config.Description; m_ContainerNextEffect.gameObject.SetActive(talent.level < talent.max); if (talent.level < talent.max) { var nextConfig = ConfigManager.Instance.GetTemplate<SkillConfig>(talent.skillId + talent.level + 1); m_SelectNextEffect.text = nextConfig.Description; } } } void DisplayTalentPoint() { m_SurplusPoint.text = model.talentPoint.ToString(); } private void TalentSkillUpdate(int _skillId) { if (_skillId == model.selectSkill) { DisplaySkillInfo(); DisplayConditions(); DisplaySkillEffect(); } } private void TalentPointUpdate() { DisplayTalentPoint(); } private void OnSelectTalentTypeEvnet() { DisplaySkills(); } private void OnSelectSeriesEvent() { model.selectTalentType = 1; Display(); } private void OnSelectSkillEvent() { DisplaySelectSkill(); } private void TalentSelectSeries() { model.selectSeries = model.selectSeries == 1 ? 2 : 1; } private void AddPoint() { TalentSkill talent; if (model.TryGetTalent(model.selectSkill, out talent)) { int error; if (!model.SatisfyLevelUp(model.selectSkill, out error)) { model.ProcessLevelUpError(error); return; } } } private void ResetPoint() { } #if UNITY_EDITOR [SerializeField] TalentSkillScriptableObject viewConfig; [ContextMenu("预览配置")] void ViewPositionConfig() { if (viewConfig == null) { return; } for (int i = 0; i < m_SkillBehaviours.Length; i++) { m_SkillBehaviours[i].transform.localPosition = viewConfig.GetSkillPosition(i); } } #endif } } System/Skill/TalentWin.cs.meta
New file @@ -0,0 +1,12 @@ fileFormatVersion: 2 guid: 0bfe355d392770544ad6c5a5d59852f1 timeCreated: 1533002943 licenseType: Pro MonoImporter: serializedVersion: 2 defaultReferences: [] executionOrder: 0 icon: {instanceID: 0} userData: assetBundleName: assetBundleVariant: