using System; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI; public class SettingsMain : MonoBehaviourSingletonTemplate { public GameObject go_Tables, go_Edit, go_event; public SettingsSelectPopup m_SettingsSelectPopup; public Image[] btns_anim; // 0 Idle ~ public Slider slider; public TextMeshProUGUI label_frame, label_runrepeat; public TMP_InputField Input_speed; Actor m_Actor; float AnimSpeed; string CurAnimName; bool bcomboattack, run_repeat, runAnimOnce = false; List list_AED = new List(); protected override void Awake() { base.Awake(); DSUtil.Get_Clone(go_Tables); Application.targetFrameRate = 60; label_runrepeat.text = "재생하기"; AnimSpeed = 1f; } public void OnSliderValueChange() { if (!run_repeat && m_Actor) { m_Actor.m_animation.Play(CurAnimName, 0, slider.value); Set_FrameInfo(slider.value); } } public void SelectObj(ClassConfigTableData pcdata, MonsterTableData mobdata) { m_SettingsSelectPopup.OnClick_Back(); go_Edit.SetActive(true); if (m_Actor) Destroy(m_Actor.gameObject); if (pcdata != null) { AddrResourceMgr.Ins.LoadObject("Assets/Res_Addr/PC/Ai01.prefab", handle => { m_Actor = DSUtil.Get_Clone(handle.Result); m_Actor.Set(false, null, new ServerData(), pcdata.n_ClassID, false); m_Actor.transform.eulerAngles = Vector3.up * 90f; var go = new GameObject("idle"); OnClick_Anim(go); Destroy(go); }); } else { m_Actor = DSUtil.Get_Clone(mobdata.s_MonsterPrefab); (m_Actor as MobActor).Set_NoUpdate_byTool(mobdata); } } public void OnClick_ObjSelect() { m_SettingsSelectPopup.Set(); } public void OnSubmit_Speed() { float.TryParse(Input_speed.text, out AnimSpeed); if (m_Actor) m_Actor.m_animation.speed = AnimSpeed; } public void OnClick_Anim(GameObject go) { Refresh_Common(); Run_Anim(go.name); } void Run_Anim(string aniname, bool resetpos = true) { for (int i = 0; i < btns_anim.Length; i++) btns_anim[i].color = Color.white; m_Actor.Init_CurAnim(resetpos); CurAnimName = aniname; switch (aniname) { case "idle": m_Actor.Play_Idle(); btns_anim[0].color = Color.gray; break; case "run": m_Actor.Play_Run(); btns_anim[1].color = Color.gray; break; case "hit": m_Actor.Play_Hit(); btns_anim[2].color = Color.gray; break; case "die": m_Actor.Play_Die(); btns_anim[3].color = Color.gray; break; case "attack": m_Actor.Play_Attack(0, 1f); btns_anim[4].color = Color.gray; break; case "attack2": m_Actor.Play_Attack(1, 1f); btns_anim[5].color = Color.gray; break; case "attack3": m_Actor.Play_Attack(2, 1f); btns_anim[6].color = Color.gray; break; case "skill1": m_Actor.Play_Skill(aniname); btns_anim[7].color = Color.gray; break; case "skill2": m_Actor.Play_Skill(aniname); btns_anim[8].color = Color.gray; break; case "comboattack": bcomboattack = true; m_Actor.Play_Attack(0, 1f); btns_anim[9].color = Color.gray; break; case "dodge": m_Actor.Play_Dodge(); btns_anim[10].color = Color.gray; break; case "stun": m_Actor.AnimationPlay("stun"); btns_anim[11].color = Color.gray; break; } m_Actor.m_animation.speed = run_repeat ? AnimSpeed : 0f; Set_FrameInfo(); } private void FixedUpdate() { if (run_repeat && m_Actor) { var curState = m_Actor.m_animation.GetCurrentAnimatorStateInfo(0); if (!curState.IsName(CurAnimName)) { if (bcomboattack) { if (CurAnimName.Equals("comboattack")) Run_Anim("attack1"); else Run_Anim(CurAnimName, false); } else Run_Anim(CurAnimName); return; } Set_FrameInfo(); } } List list_frame = new List { 0, 0 }; // [현재 프레임, 총 프레임] List Get_Frame(float normaltime = -1f) { list_frame[0] = list_frame[1] = 0; var curState = m_Actor.m_animation.GetCurrentAnimatorStateInfo(0); // 애니메이션 클립 배열 확인 var clips = m_Actor.m_animation.GetCurrentAnimatorClipInfo(0); if (clips.Length == 0) return list_frame; // 배열이 비어 있으면 함수 종료 var currentClip = clips[0].clip; // 전체 프레임 수 계산 list_frame[1] = Mathf.RoundToInt(currentClip.frameRate * currentClip.length); // 현재 normalizedTime 계산 float normalizedTime = normaltime < 0f ? curState.normalizedTime % 1 : normaltime; // 현재 프레임 계산 list_frame[0] = (int)(normalizedTime * list_frame[1]); // 애니메이션 완료 체크 if (!runAnimOnce && normalizedTime >= 0.9f) runAnimOnce = true; if (bcomboattack) { if (curState.IsName("attack") && normalizedTime >= 0.9f) CurAnimName = "attack2"; else if (curState.IsName("attack2") && normalizedTime >= 0.9f) CurAnimName = "attack3"; else if (curState.IsName("attack3") && normalizedTime >= 0.9f) CurAnimName = "attack"; } return list_frame; } void Set_FrameInfo(float normaltime = -1f) { var frames = Get_Frame(normaltime); if (frames.Count > 1 && frames[1] != 0) // 배열 길이와 분모가 0이 아닌지 확인 slider.value = (float)frames[0] / frames[1]; else slider.value = 0f; // 또는 다른 기본값을 설정할 수 있습니다. var curState = m_Actor.m_animation.GetCurrentAnimatorStateInfo(0); var curtime = curState.normalizedTime % 1; label_frame.text = DSUtil.Format("{0}/{1}\n{2}", frames[0], frames[1], curtime.ToString("N2")); } void Refresh_Common() { list_AED.ForEach(f => Destroy(f.gameObject)); list_AED.Clear(); bcomboattack = runAnimOnce = false; } public void OnClick_RunRepeat() { run_repeat = !run_repeat; m_Actor.m_animation.speed = run_repeat ? AnimSpeed : 0f; label_runrepeat.text = run_repeat ? "재생중" : "재생하기"; } public void OnClick_Refresh() { Refresh_Common(); Run_Anim(CurAnimName); } public void Add_Event(string eventName, int index = 0, int a = 0, float b = 0f, string c = "") { // index 가 0 이면 매개변수 없음 // index 가 1 이면 int 매개변수 // index 가 2 이면 float 매개변수 // index 가 3 이면 string 매개변수 if (!runAnimOnce) { var frames = Get_Frame(); var mark = DSUtil.Get_Clone(go_event, slider.transform, slider.handleRect.localPosition); list_AED.Add(mark); switch (index) { case 0: mark.Set_Data(frames[0], eventName); break; case 1: mark.Set_Data(frames[0], eventName, a); break; case 2: mark.Set_Data(frames[0], eventName, b); break; case 3: mark.Set_Data(frames[0], eventName, c); break; } } } }