using Snxxz.UI; using System.Collections.Generic; using UnityEngine; using System; public class GuardRun : SMB_Base { private Vector3 m_NextPosition; private Vector3 m_LastPosition; private SFXController m_SFXController; private float m_Time; private float m_Duration = 0; private float m_PickUpTime = 0; private float m_PickUpDelayTime = 1.0f; private List dropItems = new List(); private GA_Guard guard; GuardModel model { get { return ModelCenter.Instance.GetModel(); } } protected override void OnEnter(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnEnter(owner, animator, stateInfo, layerIndex); guard = owner as GA_Guard; if (guard == null) { return; } if (m_SFXController == null) { var mountPoint = guard.Root.GetChildTransformDeeply(GAStaticDefine.MountPointBoneName); m_SFXController = SFXPlayUtility.Instance.PlayBattleEffect(guard.pickEffectIds[1], owner); if (m_SFXController != null) { m_SFXController.duration = 0; m_SFXController.transform.SetParent(mountPoint); m_SFXController.transform.localPosition = Vector3.zero; } } else { m_SFXController.SetActive(true); } m_Time = 0; switch (guard.guardState) { case GA_Guard.GuardState.Track: break; case GA_Guard.GuardState.Dance: break; case GA_Guard.GuardState.Inter: { if (guard.targetPlayer == null) { return; } m_NextPosition = guard.targetPlayer.Root.position.SetY(0); m_LastPosition = guard.Root.position; guard.Forward = m_NextPosition - guard.Root.position; m_Duration = Vector3.Distance(m_NextPosition, guard.Root.position) / model.speed; } break; case GA_Guard.GuardState.PickUp: { OnPickUpEnter(); } break; } } public void OnPickUpEnter() { m_PickUpTime = 0.0f; DTC0702_tagDropItemDisappear.OnDropItemDisapperEvent -= OnDropItemDisapperEvent; DTC0702_tagDropItemDisappear.OnDropItemDisapperEvent += OnDropItemDisapperEvent; OnDropItemDisapperEvent(); } private void OnDropItemDisapperEvent() { if (guard == null) { return; } dropItems.Clear(); DropItemManager.TryGetGuardPickUpItem(guard.Root.position, ref dropItems); dropItems.Sort(Compare); RequestDropItem(); } protected override void OnExit(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnExit(owner, animator, stateInfo, layerIndex); ReleaseSFX(); DTC0702_tagDropItemDisappear.OnDropItemDisapperEvent -= OnDropItemDisapperEvent; guard = null; } protected override void OnUpdate(GActor owner, Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { base.OnUpdate(owner, animator, stateInfo, layerIndex); if (owner == null || guard == null) { return; } var hero = guard.targetPlayer; if (guard.targetPlayer == null) { return; } switch (guard.guardState) { case GA_Guard.GuardState.Idle: break; case GA_Guard.GuardState.Track: { var targetPosition = hero.Root.position; if (MathUtility.CalDistance(guard.Root.position, targetPosition) > model.impendRange * model.impendRange) { guard.Root.LookAt(new Vector3(targetPosition.x, targetPosition.y + model.height, targetPosition.z)); guard.Root.Translate(Vector3.forward * hero.ActorInfo.moveSpeed * Time.deltaTime); } else { guard.Idle(); } } break; case GA_Guard.GuardState.Dance: { var targetPosition = hero.Root.position; m_NextPosition = targetPosition + hero.Root.right.normalized * 0.6f - hero.Forward * 0.3f; m_NextPosition.y = targetPosition.y + model.height; var dis = Vector3.Distance(m_NextPosition, guard.Root.position); if (dis > 0.1f) { guard.Forward = m_NextPosition - guard.Root.position; var deltapos = Vector3.Lerp(guard.Root.position, m_NextPosition, hero.ActorInfo.moveSpeed * Time.deltaTime); guard.Root.position = deltapos; } else { guard.Forward = hero.Forward; guard.NextAction = GA_Guard.GuardAction_Dance2; } } break; case GA_Guard.GuardState.Inter: { m_Time += Time.deltaTime; guard.Root.position = Vector3.Lerp(m_LastPosition, m_NextPosition, Mathf.Min(1, m_Time / m_Duration)); if (m_Time >= m_Duration) { ReleaseSFX(); (owner as GA_Guard).Disappear(); } } break; case GA_Guard.GuardState.PickUp: { m_PickUpTime += Time.deltaTime; if (guard.Root.position != m_NextPosition) { m_Time += Time.deltaTime; guard.Root.position = Vector3.Lerp(m_LastPosition, m_NextPosition, Mathf.Min(1, m_Time / m_Duration)); if (m_Time >= m_Duration) { RequestDropItem(); DropItemManager.CheckGuardPickUpItem(guard.Root.position); } } else { RequestDropItem(); } } break; } } int Compare(int x, int y) { Vector3 xpos; Vector3 ypos; DropItemManager.TryGetDropPositionFromInstanceId(x, out xpos); DropItemManager.TryGetDropPositionFromInstanceId(y, out ypos); float xdis = Vector3.Distance(xpos, m_NextPosition); float ydis = Vector3.Distance(ypos, m_NextPosition); return -xdis.CompareTo(ydis); } void RequestDropItem() { m_Time = 0; if (dropItems.Count == 0) { guard.guardState = GA_Guard.GuardState.Track; return; } m_LastPosition = guard.Root.position; if (guard.targetPlayer == null) { return; } if (DropItemManager.TryGetDropPositionFromInstanceId(dropItems[0], out m_NextPosition)) { m_NextPosition.y = guard.targetPlayer.Root.position.y + model.height; guard.Forward = m_NextPosition - m_LastPosition; } if (dropItems.Count > 0 && Vector3.Distance(guard.Root.position, m_NextPosition) < 0.1f && m_PickUpTime >= m_PickUpDelayTime) { m_PickUpTime = 0.0f; DropItemManager.CheckGuardPickUpItem(guard.Root.position); } m_Duration = Vector3.Distance(m_LastPosition, m_NextPosition) / model.speed; } void ReleaseSFX() { if (m_SFXController != null) { SFXPlayUtility.Instance.Release(m_SFXController); m_SFXController = null; } } }