// 指定アニメーションへ遷移待ち. private void WaitTransitionStateImmediate() { while (true) { if (UnityUtility.IsNull(this)) { return; } if (UnityUtility.IsNull(gameObject)) { return; } if (!UnityUtility.IsActiveInHierarchy(gameObject)) { break; } if (IsCurrentState(CurrentAnimationName, GetCurrentLayerIndex())) { break; } Animator.Update(0); } }
private void Refresh() { if (!isInitialized) { return; } currentState = State.Stop; isPause = false; pausedSpeed = null; // TimeScaleの影響を受けるか. Animator.updateMode = ignoreTimeScale ? AnimatorUpdateMode.UnscaledTime : AnimatorUpdateMode.Normal; if (UnityUtility.IsActiveInHierarchy(gameObject)) { // 実行中にSampleAnimationしても表示された物が更新されない為、一旦再生して表示物をリセットする. var currentStateInfo = Animator.GetCurrentAnimatorStateInfo(0); Animator.Play(currentStateInfo.fullPathHash, -1, 0.0f); } Animator.speed = DefaultSpeed; }
private void UpdateSnapTarget() { float?nearest = null; GameObject nearestTarget = null; foreach (var target in snapTargets) { if (!UnityUtility.IsActiveInHierarchy(target)) { continue; } var rt = UnityUtility.GetComponent <RectTransform>(target); if (nearest.HasValue) { var distance = Vector3.Distance(transform.position, rt.position); if (distance < nearest.Value) { nearest = distance; nearestTarget = target; } } else { nearest = Vector3.Distance(transform.position, rt.position); nearestTarget = target; } } Snap(nearestTarget); }
// 指定アニメーションへ遷移待ち. private IEnumerator WaitTransitionState() { // ステートの遷移待ち. while (true) { if (UnityUtility.IsNull(this)) { yield break; } if (UnityUtility.IsNull(gameObject)) { yield break; } if (!UnityUtility.IsActiveInHierarchy(gameObject)) { break; } if (IsCurrentState(CurrentAnimationName, GetCurrentLayerIndex())) { break; } yield return(null); } }
// 指定アニメーションへ遷移待ち. private IEnumerator WaitTransitionState() { while (true) { if (UnityUtility.IsNull(this)) { yield break; } if (UnityUtility.IsNull(gameObject)) { yield break; } if (!UnityUtility.IsActiveInHierarchy(gameObject)) { break; } var stateInfo = animatorInfo.Animator.GetCurrentAnimatorStateInfo(0); if (stateInfo.IsName(animationName)) { break; } yield return(null); } }
private bool IsAlive() { if (!UnityUtility.IsActiveInHierarchy(gameObject)) { return(false); } var stateInfo = animatorInfo.Animator.GetCurrentAnimatorStateInfo(0); // 指定ステートへ遷移待ち. if (waitStateTransition) { if (!stateInfo.IsName(animationName) || animatorInfo.Animator.IsInTransition(0)) { return(true); } waitStateTransition = false; } if (!stateInfo.IsName(animationName)) { return(false); } if (1 < stateInfo.normalizedTime && !animatorInfo.Animator.IsInTransition(0)) { return(false); } return(true); }
public IObservable <Unit> Play(string animationName) { if (string.IsNullOrEmpty(animationName)) { return(Observable.ReturnUnit()); } UnityUtility.SetActive(gameObject, true); // ヒエラルキー上で非アクティブでないか. if (!UnityUtility.IsActiveInHierarchy(gameObject)) { Debug.LogErrorFormat("Animation can't play not active in hierarchy.\n{0}", gameObject.transform.name); return(Observable.ReturnUnit()); } this.animationName = animationName; var hash = Animator.StringToHash(animationName); if (animatorInfo.Animator.HasState(0, hash)) { return(Observable.FromCoroutine(() => PlayInternal())); } this.animationName = string.Empty; Debug.LogErrorFormat("Animation State Not found. {0}", animationName); return(Observable.ReturnUnit()); }
private IEnumerator PlayInternal() { UnityUtility.SetActive(gameObject, true); ApplySortingOrder(sortingOrder); while (true) { if (!UnityUtility.IsActiveInHierarchy(gameObject)) { break; } // 状態リセット. ResetContents(); // 開始. SetState(State.Play); for (var i = 0; i < particleInfos.Length; i++) { var particleInfo = particleInfos[i]; // 止まってたら開始. if (!particleInfo.ParticleSystem.isPlaying) { particleInfo.ParticleSystem.Play(); } particleInfo.LifeCycle = LifecycleType.None; } // 再生速度. ApplySpeedRate(); // 終了待ち. var updateYield = Observable.FromMicroCoroutine(() => FrameUpdate()).ToYieldInstruction(); while (!updateYield.IsDone) { yield return(null); } if (endActionType != EndActionType.Loop) { break; } if (State == State.Stop) { break; } } if (!UnityUtility.IsNull(this)) { EndAction(); } }
private IEnumerator PlayInternal(int hash, int layer, float normalizedTime, bool immediate) { while (true) { if (!UnityUtility.IsActiveInHierarchy(gameObject)) { break; } // 指定アニメーションへ遷移待ち. if (!IsCurrentState(CurrentAnimationName, GetCurrentLayerIndex())) { var waitTransitionStateYield = Observable.FromMicroCoroutine(() => WaitTransitionState()).ToYieldInstruction(); while (!waitTransitionStateYield.IsDone) { yield return(null); } } // アニメーション開始通知. if (onEnterAnimation != null) { onEnterAnimation.OnNext(this); } // アニメーションの終了待ち. var waitForEndYield = Observable.FromMicroCoroutine(() => WaitForEndOfAnimation()).ToYieldInstruction(); while (!waitForEndYield.IsDone) { yield return(null); } if (endActionType != EndActionType.Loop) { break; } if (State == State.Stop) { yield break; } // ループ再生の場合は再度再生を行う. PlayAnimator(hash, layer, normalizedTime); } EndAction(); }
private bool IsAlive() { if (!UnityUtility.IsActiveInHierarchy(gameObject)) { return(false); } var layerIndex = GetCurrentLayerIndex(); var stateInfo = Animator.GetCurrentAnimatorStateInfo(layerIndex); // 指定ステートへ遷移待ち. if (waitStateTransition) { if (!stateInfo.IsName(CurrentAnimationName) || Animator.IsInTransition(layerIndex)) { return(true); } waitStateTransition = false; } if (!stateInfo.IsName(CurrentAnimationName)) { return(false); } if (1 < stateInfo.normalizedTime && !Animator.IsInTransition(layerIndex)) { return(false); } // 再生中のアニメーションクリップ. var clipInfo = Animator.GetCurrentAnimatorClipInfo(layerIndex); if (clipInfo.Any()) { var currentClipInfo = clipInfo[0]; if (currentClipInfo.clip.length == 0) { return(false); } } return(true); }
private IEnumerator PlayInternal() { UnityUtility.SetActive(gameObject, true); // ヒエラルキー上で非アクティブでないか. if (!UnityUtility.IsActiveInHierarchy(gameObject)) { Debug.LogErrorFormat("Animation can't play not active in hierarchy.\n{0}", gameObject.transform.name); yield break; } RevertOriginSortingOrder(); ApplySortingOrder(0, sortingOrder); while (true) { if (!UnityUtility.IsActiveInHierarchy(gameObject)) { break; } // 状態リセット. ResetContents(); // 開始. SetState(State.Play); // 止まってたら開始. foreach (var ps in particleSystems.Where(x => !x.ParticleSystem.isPlaying)) { ps.ParticleSystem.Play(); } // 再生速度. ApplySpeedRate(); // 終了待ち. yield return(Observable.FromCoroutine(() => WaitForEndOfAnimation()).ToYieldInstruction()); if (endActionType != EndActionType.Loop) { break; } } EndAction(); }
public IObservable <Unit> Play(string animationName, int layer = -1, float normalizedTime = float.NegativeInfinity, bool immediate = true) { if (string.IsNullOrEmpty(animationName)) { return(Observable.ReturnUnit()); } UnityUtility.SetActive(gameObject, true); // ヒエラルキー上で非アクティブでないか. if (!UnityUtility.IsActiveInHierarchy(gameObject)) { Debug.LogErrorFormat("Animation can't play not active in hierarchy.\n{0}", gameObject.transform.name); return(Observable.ReturnUnit()); } this.layer = layer; CurrentAnimationName = animationName; var hash = Animator.StringToHash(CurrentAnimationName); if (Animator.HasState(GetCurrentLayerIndex(), hash)) { PlayAnimator(hash, layer, normalizedTime); // 指定アニメーションへ遷移待ち. // FromMicroCoroutineは次のフレームから始まるので即時遷移はこのタイミングで実行する. if (immediate) { if (!IsCurrentState(CurrentAnimationName, GetCurrentLayerIndex())) { WaitTransitionStateImmediate(); } } return(Observable.FromMicroCoroutine(() => PlayInternal(hash, layer, normalizedTime, immediate))); } CurrentAnimationName = null; Debug.LogErrorFormat("Animation State Not found. {0}", animationName); return(Observable.ReturnUnit()); }
private void Recovery() { if (!Application.isPlaying) { return; } if (!waitRecovery) { return; } var target = component as Selectable; if (recoveryDisposable != null) { if (recoveryState.HasValue) { target.enabled = recoveryState.Value; recoveryState = null; } recoveryDisposable.Dispose(); recoveryDisposable = null; } if (target != null) { recoveryState = target.enabled; target.enabled = !recoveryState.Value; recoveryDisposable = Observable.EveryUpdate() .SkipWhile(_ => !UnityUtility.IsActiveInHierarchy(target.gameObject)) .Take(1) .Subscribe(_ => target.enabled = recoveryState.Value) .AddTo(this); waitRecovery = false; } }
private IEnumerator PlayInternal() { var hash = Animator.StringToHash(animationName); while (true) { if (!UnityUtility.IsActiveInHierarchy(gameObject)) { break; } // リセット. Refresh(); // 再生速度設定. ApplySpeedRate(); // 再生. currentState = State.Play; animatorInfo.Animator.Play(hash, -1, 0f); // 指定アニメーションへ遷移待ち. yield return(Observable.FromCoroutine(() => WaitTransitionState()).ToYieldInstruction()); // アニメーションの終了待ち. yield return(Observable.FromCoroutine(() => WaitForEndOfAnimation()).ToYieldInstruction()); if (endActionType != EndActionType.Loop) { break; } if (State == State.Stop) { yield break; } } EndAction(); }
private bool IsAliveParticleSystem() { // 毎フレーム呼ばれる処理なのでLinqは使わない. foreach (var element in particleSystems) { var ps = element.ParticleSystem; if (UnityUtility.IsNull(ps)) { continue; } if (!UnityUtility.IsActiveInHierarchy(ps.gameObject)) { continue; } // ループエフェクトは常に生存. if (ps.main.loop) { return(true); } // 再生時間より短いか. if (ps.time < ps.main.duration) { return(true); } // 1つでも生きてるParticleSystemがいたら生存中. // ※ ParticleSystem.IsAlive()が正常に動かない為、particleCountで判定. if (0 < ps.particleCount) { return(true); } } return(false); }