public void Awake(Player player)
        {
            _PlayerLife      = new ReactiveProperty <float> (20);
            PlayerLife       = _PlayerLife.ToReadOnlyReactiveProperty();
            _RemainingUnit   = new ReactiveProperty <int> (10);
            RemainingUnit    = _RemainingUnit;
            DeadAsObservable = PlayerLife.Where(l => l <= 0)
                               .Publish()
                               .RefCount()
                               .AsUnitObservable();
            _OnDamageObserver    = new Subject <Unit> ();
            OnDamageAsObservable = _OnDamageObserver;

            //TODO:死亡後のイベントなどを追加しないと駄目
            DeadAsObservable
            .Throttle(TimeSpan.FromSeconds(0.5f))
            .Subscribe(_ =>
            {
                _RemainingUnit.Value--;

                //_PlayerLife.Value = _MaxLife;
            });

            DeadAsObservable.Subscribe(_ => Debug.Log("Dead"));
            _PlayerLife.Value    = _MaxLife;
            _RemainingUnit.Value = _MaxRemainingUnit;
            player.OnTriggerEnter2DAsObservable()
            .ThrottleFirst(TimeSpan.FromSeconds(0.05))
            .Subscribe(c =>
            {
                var d = c.GetComponent <IDamage> ();
                if (d == null)
                {
                    return;
                }
                _PlayerLife.Value -= d.Damage;

                if (_PlayerLife.Value <= 0)
                {
                    return;
                }
                _OnDamageObserver.OnNext(Unit.Default);
            });
            DeadAsObservable.Subscribe(_ => AudioManager.SoundEmitter.PlaySE(AudioManager.PlayerSound.DeadSound));

            var currentLife = (float)MaxLife;
            var deltaTime   = 0.0f;

            LifeRegenerateStartAsObservable = OnDamageAsObservable
                                              .Throttle(TimeSpan.FromSeconds(_RegenerateStartTime)).Publish()
                                              .RefCount();

            LifeRegenerateStartAsObservable
            .Subscribe(_ =>
            {
                currentLife = _PlayerLife.Value;
                var ratio   = currentLife / _MaxLife;
                deltaTime   = 0.0f;
                player.UpdateAsObservable()
                .TakeUntil(OnDamageAsObservable)
                .TakeUntil(DeadAsObservable)
                .Where(__ => _PlayerLife.Value > 0)
                .Subscribe(__ =>
                {
                    _PlayerLife.Value = Mathf.Lerp(0, _MaxLife, ratio + deltaTime * _RegenerateSpeed);
                    deltaTime        += TimeManager.PlayerDeltaTime;
                });
            });
        }