示例#1
0
        // 指定アニメーションへ遷移待ち.
        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);
            }
        }
示例#2
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;
        }
示例#3
0
        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);
        }
示例#4
0
        // 指定アニメーションへ遷移待ち.
        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);
            }
        }
示例#5
0
        // 指定アニメーションへ遷移待ち.
        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);
            }
        }
示例#6
0
        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);
        }
示例#7
0
        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());
        }
示例#8
0
        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();
            }
        }
示例#9
0
        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();
        }
示例#10
0
        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);
        }
示例#11
0
        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();
        }
示例#12
0
        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());
        }
示例#13
0
        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;
            }
        }
示例#14
0
        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();
        }
示例#15
0
        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);
        }