public override void Enter(IActorStateContext context) { base.Enter(context); this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Fall); this.ReceiveRequestMoveOnMove(() => this.owner.StatusController.MoveSpeed); this.owner.Broker.Receive <Landed>() .SubscribeWithState(this, (_, _this) => { _this.owner.StateManager.Change(ActorState.Name.Idle); }) .AddTo(this.events); this.owner.Broker.Receive <RequestJump>() .Where(_ => this.owner.StatusController.CanJump) .SubscribeWithState(this, (_, _this) => { _this.owner.StateManager.Change(ActorState.Name.Jump); }) .AddTo(this.events); this.ReceiveRequestFireOnChangeAttackState(); this.SyncActorDirection(); }
public void Change(ActorState.Name nextState, IActorStateContext context) { Assert.IsTrue(this.states.ContainsKey(nextState), $"{nextState}に対応した{typeof(IActorState)}が存在しません"); this.states[this.currentState].Exit(nextState); this.currentState = nextState; this.states[this.currentState].Enter(context); }
public override void Enter(IActorStateContext context) { base.Enter(context); var stateRunContext = (StateRunContext)context; var newEnterTime = Time.realtimeSinceStartup; var diffTime = newEnterTime - this.enterTime; if (this.CanDash(stateRunContext.Direction, newEnterTime)) { this.owner.StatusController.StartDash(); } this.enterTime = newEnterTime; this.lastDirection = stateRunContext.Direction; this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Run); this.AddMove(stateRunContext.Direction, () => this.owner.StatusController.MoveSpeed); this.ReceiveRequestMoveOnMove(() => this.owner.StatusController.MoveSpeed); this.owner.Broker.Receive <Messages.Idle>() .SubscribeWithState(this, (_, _this) => { _this.owner.StateManager.Change(ActorState.Name.Idle); }) .AddTo(this.events); this.owner.Broker.Receive <RequestJump>() .Where(_ => this.owner.StatusController.CanJump) .SubscribeWithState(this, (_, _this) => { _this.owner.StateManager.Change(ActorState.Name.Jump); }) .AddTo(this.events); this.owner.Broker.Receive <Messages.Fall>() .SubscribeWithState(this, (_, _this) => { _this.owner.StatusController.AddJumpCount(); _this.owner.StateManager.Change(ActorState.Name.Fall); }) .AddTo(this.events); this.ReceiveRequestFireOnChangeAttackState(); this.SyncActorDirection(); this.ReceiveRequestFallOneWayPlatforms(); }
public override void Enter(IActorStateContext context) { base.Enter(context); this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Knockback); // 着地もしくは指定した時間になったらノックバック終了 Observable.Merge( this.owner.Broker.Receive <Landed>().AsUnitObservable(), Observable.Timer(TimeSpan.FromSeconds(Constants.KnockbackDuration)).AsUnitObservable() ) .TakeUntilDestroy(this.owner) .SubscribeWithState(this, (_, _this) => { _this.owner.StateManager.Change(ActorState.Name.Idle); }) .AddTo(this.events); }
public override void Enter(IActorStateContext context) { base.Enter(context); this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Idle); this.owner.Broker.Receive <RequestMove>() .SubscribeWithState(this, (x, _this) => { _this.owner.StateManager.Change(ActorState.Name.Run, new StateRunContext(x.Direction)); }) .AddTo(this.events); this.owner.Broker.Receive <RequestJump>() .Where(_ => this.owner.StatusController.CanJump) .SubscribeWithState(this, (_, _this) => { _this.owner.StateManager.Change(ActorState.Name.Jump); }) .AddTo(this.events); this.owner.Broker.Receive <Messages.Fall>() .SubscribeWithState(this, (_, _this) => { _this.owner.StatusController.AddJumpCount(); _this.owner.StateManager.Change(ActorState.Name.Fall); }) .AddTo(this.events); if (this.owner.StatusController.IsDash) { this.owner.Broker.Receive <Messages.Idle>() .Take(1) .SubscribeWithState(this, (_, _this) => { _this.owner.StatusController.EndDash(); }) .AddTo(this.events); } this.ReceiveRequestFireOnChangeAttackState(); this.ReceiveRequestInvokeGameEventOnInvokeGameEvent(); this.ReceiveRequestFallOneWayPlatforms(); }
public override void Enter(IActorStateContext context) { base.Enter(context); var stateAttackContext = (StateAttackContext)context; Assert.IsNotNull(stateAttackContext); var equippedWeapon = this.owner.StatusController.EquippedWeapons[stateAttackContext.EquippedWeaponIndex]; Assert.IsTrue(equippedWeapon.CanFire, "攻撃不可能な状態なのに攻撃しようとしました"); this.nextStateDelaySeconds = 0.0f; this.owner.AnimationController.StartSequence(this.owner.Context.AnimationSequences.Attack); var weaponRecord = equippedWeapon.InstanceWeapon.WeaponRecord; this.canNextFire = weaponRecord.CanAutoAttack; this.CreateGimmick(equippedWeapon); if (this.canNextFire) { this.owner.Broker.Receive <RequestTerminationFire>() .Where(x => x.EquippedWeaponIndex == stateAttackContext.EquippedWeaponIndex) .SubscribeWithState(this, (_, _this) => { _this.canNextFire = false; }) .AddTo(this.events); } // 恐怖の状態異常にかかったらオート攻撃を終了する this.owner.Broker.Receive <AttachedAbnormalCondition>() .Where(x => x.Type == Constants.AbnormalStatus.Fear) .SubscribeWithState(this, (_, _this) => { _this.canNextFire = false; }) .AddTo(this.events); this.owner.UpdateAsObservable() .SubscribeWithState3(this, weaponRecord, equippedWeapon, (_, _this, _weaponRecord, _equippedWeapon) => { _this.nextStateDelaySeconds += Time.deltaTime * (1.0f + _this.owner.StatusController.ItemModifierEffect.GetPercent(Constants.ItemModifierType.FireSpeedUpRate)); if (_this.nextStateDelaySeconds >= _weaponRecord.NextStateDelaySeconds) { if (this.canNextFire) { _this.CreateGimmick(_equippedWeapon); _this.nextStateDelaySeconds = 0.0f; } else { _this.owner.StateManager.Change(ActorState.Name.Idle); } } }) .AddTo(this.events); var moveSpeed = this.owner.Context.BasicStatus.MoveSpeed; moveSpeed -= moveSpeed * weaponRecord.MoveSpeedAttenuationRate; this.ReceiveRequestMoveOnMove(() => moveSpeed); this.ReceiveRequestJumpOnJump(); this.ReceiveRequestFallOneWayPlatforms(); }
public virtual void Enter(IActorStateContext context) { this.context = context; }