private void UpdateTarget(MultiTargetMissileAction.TargetInfo targetInfo) { if (targetInfo == null || targetInfo.missile == null) { return; } if (this.curveType == MultiTargetMissileAction.CurveType.Bezier) { float num = Time.time - targetInfo.timeStamp; if (num > targetInfo.duration) { this.OnReachTarget(targetInfo); return; } float num2 = num / this.BezierDutationMin; num2 *= num2; Vector3 pointAtTime = targetInfo.curveBezier.GetPointAtTime(num2); targetInfo.missile.transform.position = pointAtTime; Vector3 forward = targetInfo.targetPosition - pointAtTime; if (forward.sqrMagnitude > 0.1f) { Quaternion to = Quaternion.LookRotation(forward); this.damping += 0.9f; this.missile.transform.rotation = Quaternion.Slerp(this.missile.transform.rotation, to, Time.deltaTime * this.damping); } } else { if (targetInfo.target != null && !targetInfo.actor.IsDead) { targetInfo.targetPosition = targetInfo.target.transform.position; targetInfo.targetPosition.y = targetInfo.targetPosition.y + this.YOffset; } Vector3 vector = this.Accel * Time.deltaTime; targetInfo.speed.x = Mathf.Clamp(targetInfo.speed.x + vector.x, 1f, this.SpeedMax.x); targetInfo.speed.y = Mathf.Clamp(targetInfo.speed.y + vector.y, 1f, this.SpeedMax.y); targetInfo.speed.z = Mathf.Clamp(targetInfo.speed.z + vector.z, 1f, this.SpeedMax.z); if (this.parabolaAngle <= 0f) { Vector3 vector2 = targetInfo.targetPosition - targetInfo.missile.transform.position; if (vector2 != Vector3.zero) { Quaternion to2 = Quaternion.LookRotation(vector2); this.damping += 0.9f; targetInfo.missile.transform.rotation = Quaternion.Slerp(targetInfo.missile.transform.rotation, to2, Time.deltaTime * this.damping); } Vector3 vector3 = targetInfo.speed * Time.deltaTime; targetInfo.missile.transform.position += vector2.normalized * vector3.x; targetInfo.missile.transform.position += vector2.normalized * vector3.y; targetInfo.missile.transform.position += vector2.normalized * vector3.z; if (vector2.magnitude < vector3.magnitude) { targetInfo.targetPosition.y = targetInfo.targetPosition.y - this.YOffset; this.OnReachTarget(targetInfo); return; } } else { targetInfo.missile.transform.LookAt(targetInfo.targetPosition); float num3 = targetInfo.speed.x * targetInfo.speed.y * targetInfo.speed.z * Time.deltaTime; float num4 = Vector3.Distance(targetInfo.missile.transform.position, targetInfo.targetPosition); float num5 = (targetInfo.distanceToTarget > 0f) ? (Mathf.Min(1f, num4 / targetInfo.distanceToTarget) * this.parabolaAngle) : 0f; num5 = Mathf.Clamp(-num5, -this.parabolaAngle, this.parabolaAngle); targetInfo.missile.transform.rotation = targetInfo.missile.transform.rotation * Quaternion.Euler(num5, 0f, 0f); targetInfo.missile.transform.Translate(Vector3.forward * num3); if (num4 < num3) { targetInfo.targetPosition.y = targetInfo.targetPosition.y - this.YOffset; this.OnReachTarget(targetInfo); return; } } } }
private void OnReachTarget(MultiTargetMissileAction.TargetInfo targetInfo) { if (targetInfo == null) { return; } if (this.explodePrefab != null) { Transform instance = PoolMgr.SpawnParticleSystem(this.explodePrefab.transform, targetInfo.missile.transform.position, Quaternion.identity, 1f); PoolMgr.spawnPool.Despawn(instance, this.explodeLifeTime); } if (targetInfo.missile != null) { PoolMgr.spawnPool.Despawn(targetInfo.missile.transform, this.MissileDeleteDelay); targetInfo.missile = null; } if (base.variables != null && base.variables.skillCaster != null && targetInfo.actor != null) { base.variables.skillCaster.DoEffectOnTarget(base.variables.skillInfo, targetInfo.actor, 0); } }