using System.Collections; using System.Collections.Generic; using UnityEngine; using System; #if UNITY_EDITOR using UnityEditor; #endif namespace vnxbqy.UI { public class TalentTreeScriptable : ScriptableObject { [SerializeField] TalentTree talentTrees; [SerializeField] Vector2 m_ContentSizeDelta; [SerializeField] List skillElements; [SerializeField] List arrowElements; public Vector2 contentSizeDelta { get { return m_ContentSizeDelta; } } public int arrowCount { get { return arrowElements == null ? 0 : arrowElements.Count; } } public int skillCount { get { return skillElements == null ? 0 : skillElements.Count; } } public TalentElement GetTalentElement(int index) { if (skillElements != null && index < skillElements.Count) { return skillElements[index]; } return default(TalentElement); } public ArrowElement GetArrowElement(int index) { if (arrowElements != null && index < arrowElements.Count) { return arrowElements[index]; } return default(ArrowElement); } public float GetPercentBySkillElement(int index, float viewHeight, float offset) { if (skillElements != null && index < skillElements.Count) { var element = skillElements[index]; var height = contentSizeDelta.y - Mathf.Abs(element.position.y); var percent = Mathf.Clamp01((height - viewHeight) / (contentSizeDelta.y - viewHeight)); return Mathf.Clamp01(percent + (offset / (contentSizeDelta.y - viewHeight)));//偏移 } return 1; } #if UNITY_EDITOR public void ApplyTalentElement(int index,Vector3 _position) { if (skillElements == null) { skillElements = new List(); } var element = new TalentElement() { position = _position, }; if (index >= skillElements.Count) { skillElements.Add(element); } else { skillElements[index] = element; } } public void SyncTalentElementsCount(int count) { if (count < skillElements.Count) { skillElements.RemoveRange(count, skillElements.Count - count); } } public void ApplyArrowElement(int index, Vector3 _position, Vector2 _sizeDelta, Vector3 _rotation, string _iconKey) { if (arrowElements == null) { arrowElements = new List(); } var element = new ArrowElement() { position = _position, sizeDelta = _sizeDelta, rotation = _rotation, iconKey = _iconKey, }; if (index >= arrowElements.Count) { arrowElements.Add(element); } else { arrowElements[index] = element; } } public void SyncArrowElementsCount(int count) { if (count < arrowElements.Count) { arrowElements.RemoveRange(count, arrowElements.Count - count); } } #endif public bool Belong(int job, int talentType, int talentSeries) { return talentTrees.Belong(job, talentType, talentSeries); } [Serializable] public struct TalentTree { public int[] jobs; public int[] talentTypes; public int[] talentSeriess; public bool Belong(int job, int talentType, int talentSeries) { bool sameJob = false; for (int i = 0; i < jobs.Length; i++) { if (jobs[i] == job) { sameJob = true; break; } } bool sameType = false; for (int i = 0; i < talentTypes.Length; i++) { if (talentTypes[i] == talentType) { sameType = true; break; } } bool sameSeries = false; for (int i = 0; i < talentSeriess.Length; i++) { if (talentSeriess[i] == talentSeries) { sameSeries = true; break; } } return sameJob && sameType && sameSeries; } } [Serializable] public struct TalentElement { public Vector3 position; } [Serializable] public struct ArrowElement { public string iconKey; public Vector3 position; public Vector3 rotation; public Vector2 sizeDelta; } } #if UNITY_EDITOR public class TalentTreeScriptableEditor : Editor { [MenuItem("策划工具/生成天赋配置文件")] static void BuildConfig() { TalentTreeScriptable config = CreateInstance(); string _path = StringUtility.Contact("Assets/ResourcesOut/Refdata/ScriptableObject/SoTalentTree/", "SoTalentTree_", ".asset"); AssetDatabase.CreateAsset(config, _path); AssetDatabase.Refresh(); ProjectWindowUtil.ShowCreatedAsset(config); } } #endif }