using LTGame; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Gameplay.Unit; namespace Gameplay.Bullet { using Gameplay.Common; using UnityEngine; public class BulletStateUnitLockFly : BaseBulletState { private Vector3 _targetPos; private GameUnit targetUnit; private float _flySpeed; public BulletStateUnitLockFly(ViewBullet owner) : base(owner, EBulletState.UnitLockFly) { } protected override void _OnEnter(NBaseState exitState, object param) { base._OnEnter(exitState, param); this.targetUnit = owner.lockUnit; this._targetPos = targetUnit.transData.pos; _flySpeed = owner.configData.FlySpeed; } protected override void _OnRunning() { base._OnRunning(); var currentPos = owner.rootObj.transform.position; if (!targetUnit.statusData.isDead) { // 更新位置 _targetPos = targetUnit.transData.pos; } var targetPos = _targetPos; var toTargetPos = targetPos - currentPos; var toTargetPosLength = toTargetPos.magnitude; var toTargetPosDir = toTargetPos.normalized; var moveDistance = _flySpeed * Time.deltaTime; if (moveDistance >= toTargetPosLength) { owner.rootObj.transform.position = targetPos; isFinished = true; nextState = EBulletState.DamageUnit; } else { var newPos = currentPos + toTargetPosDir * moveDistance; owner.rootObj.transform.position = newPos; } } } }