47 lines
1.7 KiB
C#
47 lines
1.7 KiB
C#
using System.Collections;
|
||
using UnityEngine;
|
||
|
||
namespace BaseGames.Enemies.Boss
|
||
{
|
||
/// <summary>
|
||
/// 嘲风漂浮控制器:负责 Phase 2 进入时上浮、击落时下落的平滑位移。
|
||
/// 使用 Rigidbody2D.MovePosition 做帧级 Lerp 插值,避免物理穿墙。
|
||
/// </summary>
|
||
public class ChaoFengFloatController : MonoBehaviour
|
||
{
|
||
[SerializeField] private float _floatHeight = 5f;
|
||
[SerializeField] private float _riseDuration = 1.5f;
|
||
[SerializeField] private float _fallDuration = 0.8f;
|
||
[SerializeField] private Rigidbody2D _rb;
|
||
|
||
private float _groundY;
|
||
|
||
private void Start() => _groundY = transform.position.y;
|
||
|
||
/// <summary>上浮至悬空高度(切换为 Kinematic 后执行)。</summary>
|
||
public IEnumerator FloatUp()
|
||
{
|
||
_rb.bodyType = RigidbodyType2D.Kinematic;
|
||
_rb.velocity = Vector2.zero;
|
||
yield return TweenY(transform.position.y, _groundY + _floatHeight, _riseDuration);
|
||
}
|
||
|
||
/// <summary>下落回地面(落地后恢复 Dynamic)。</summary>
|
||
public IEnumerator FallDown()
|
||
{
|
||
yield return TweenY(transform.position.y, _groundY, _fallDuration);
|
||
_rb.bodyType = RigidbodyType2D.Dynamic;
|
||
}
|
||
|
||
private IEnumerator TweenY(float from, float to, float duration)
|
||
{
|
||
for (float t = 0f; t < duration; t += Time.deltaTime)
|
||
{
|
||
_rb.MovePosition(new Vector2(transform.position.x, Mathf.Lerp(from, to, t / duration)));
|
||
yield return null;
|
||
}
|
||
_rb.MovePosition(new Vector2(transform.position.x, to));
|
||
}
|
||
}
|
||
}
|