using UnityEngine; public class FoFollow : FlyObject { protected Vector3 m_PrevPosition; private SoFoFollow m_FoFollow; public sealed override bool Initialize(InitInfo initInfo) { bool _result = base.Initialize(initInfo); m_FoFollow = m_Config as SoFoFollow; if (m_Config == null) { return false; } m_HSpeed = m_FoFollow.hspeed; m_VSpeed = m_FoFollow.vspeed; m_PrevPosition = m_Position; return _result; } protected sealed override void OnUpdate() { GActorFight _target = GAMgr.Instance.GetByCID(m_InitInfo.mainTargetClientInstID) as GActorFight; Vector3 _calculatePos = m_Position; if (_target != null) { m_Direction = (_target.MP_Hit.position - m_Position).normalized; } // 处理水平方向的位移 // 计算此次位移距离 Vector3 _currentMovePos = m_HSpeed * m_Direction * Time.deltaTime; // 已经移动的位移距离 m_MoveDistance += _currentMovePos; // 如果此次的位移将超过配置的最远距离 if (m_MoveDistance.sqrMagnitude < m_FoFollow.distance * m_FoFollow.distance) { // 设定水平位移位置 _calculatePos += _currentMovePos; } else { _calculatePos = m_FoFollow.distance * m_Direction; } // 处理垂直方向上的位移 _calculatePos.y += m_VSpeed * Time.deltaTime; m_Position = _calculatePos; if (m_Ammo) { m_Ammo.transform.LookAt(m_Position); m_Ammo.transform.position = m_Position; } if (m_FoFollow.acceleration != 0) { m_HSpeed += m_FoFollow.acceleration; } if (m_FoFollow.gravity != 0) { m_VSpeed += m_FoFollow.gravity; } } public sealed override bool IsOver() { bool _result = base.IsOver(); return _result || (m_MoveDistance.magnitude >= m_FoFollow.distance); } }