using Godot; /// <summary> /// 停止移动后自动冻结对象 /// </summary> [Tool] public partial class AutoFreezeObject : ActivityObject { /// <summary> /// 自动播放的动画, 物体会等待该动画播完完成后进入冻结状态, 该动画不能是循环动画 /// </summary> [Export] public string AnimationName { get; set; } /// <summary> /// 在冻结前是否变灰 /// </summary> [Export] public bool AutoToGrey { get; set; } /// <summary> /// 冻结次数 /// </summary> public int FreezeCount { get; private set; } private bool _playFlag = false; private float _grey = 0; /// <summary> /// 冻结时调用 /// </summary> protected virtual void OnFreeze() { } public override void OnInit() { if (!string.IsNullOrEmpty(AnimationName)) { _playFlag = true; AnimatedSprite.AnimationFinished += OnAnimationFinished; AnimatedSprite.Play(AnimationName); } } protected override void Process(float delta) { //落地静止后将弹壳变为静态贴图 if (!_playFlag &&!IsThrowing && Altitude <= 0 && MoveController.IsMotionless()) { if (AutoToGrey && _grey < 1) { //变灰动画时间, 0.5秒 _grey = Mathf.Min(1, _grey + delta / 0.5f); Grey = _grey; return; } if (AffiliationArea != null) { OnFreeze(); Freeze(); FreezeCount++; } else { Debug.Log(Name + "投抛到画布外了, 强制消除..."); Destroy(); } } } private void OnAnimationFinished() { _playFlag = false; } }