public void setHardwareSpeed(float speed, bool directSpeed = false) { if (speed < 0.0f) { speed = 0.0f; } mTargetSpeed = speed; if (directSpeed) { CommandCharacterChangeSpeed cmd = newCmd(out cmd, false); cmd.mSpeed = mTargetSpeed; pushCommand(cmd, mComponentOwner); } }
public override void update(float elaspedTime) { if (!MathUtility.isFloatEqual(mData.mSpeed, mTargetSpeed)) { if (!MathUtility.isFloatEqual(mNormalAcceleration, mAcceleration)) { mAcceleration = MathUtility.lerp(mAcceleration, mNormalAcceleration, mAccelerationFactor * elaspedTime); } // 当前速度逐渐向目标速度靠近 float speed = MathUtility.lerp(mData.mSpeed, mTargetSpeed, mAcceleration * elaspedTime); // 小于最小间隔时直接设置为目标速度 if ((Mathf.Abs(speed - mTargetSpeed) < mMinDeltaSpeed)) { speed = mTargetSpeed; } // 如果速度降到了0(小于0.01则认为是0),并且角色当前正在跑动,则通知角色停下 if (MathUtility.isFloatZero(speed, 0.01f) && mCharacter.hasState(PLAYER_STATE.PS_RIDING)) { pushCommand <CommandCharacterStop>(mCharacter); } // 速度不为0,并且角色当前正处于休闲状态,则通知角色跑动 else if (speed > 0.0f && mCharacter.hasState(PLAYER_STATE.PS_IDLE)) { pushCommand <CommandCharacterStartRun>(mCharacter); } // 加速 else if (speed > mData.mSpeed) { CommandCharacterSpeedUp cmdSpeedUp = newCmd(out cmdSpeedUp, false); cmdSpeedUp.mSpeed = speed; cmdSpeedUp.mSpeedDelta = speed - mData.mSpeed; pushCommand(cmdSpeedUp, mCharacter); } // 减速 else if (speed < mData.mSpeed) { CommandCharacterSpeedSlow cmdSpeedSlow = newCmd(out cmdSpeedSlow, false); cmdSpeedSlow.mSpeed = speed; pushCommand(cmdSpeedSlow, mCharacter); } // 改变速度 CommandCharacterChangeSpeed cmd = newCmd(out cmd, false); cmd.mSpeed = speed; pushCommand(cmd, mCharacter); } base.update(elaspedTime); }
public override void execute() { Character character = mReceiver as Character; MathUtility.clamp(ref mAngle, 0.0f, 45.0f); CommandCharacterChangeSpeed cmdSpeed = newCmd(out cmdSpeed, false); cmdSpeed.mSpeed = Mathf.Sin(Mathf.Abs(mAngle * Mathf.Deg2Rad)) * character.getCharacterData().mSpeed; pushCommand(cmdSpeed, character); // 同时需要降低硬件速度组件中从当前速度加速到目标速度的快慢 CharacterSpeedHardware speedHardware = character.getFirstComponent <CharacterSpeedHardware>(); speedHardware.setAcceleration(0.0f); if (character.isType(CHARACTER_TYPE.CT_MYSELF)) { GameTools.PLAY_AUDIO_UI(mScriptGlobalAudio.getAudioWindow(), SOUND_DEFINE.SD_HIT_WALL); } }
public override void execute() { Character character = mReceiver as Character; if (!character.isType(CHARACTER_TYPE.CT_OTHER)) { return; } CharacterOther other = character as CharacterOther; // 玩家有护盾时,攻击没有任何影响 if (other.hasState(PLAYER_STATE.PS_PROTECTED)) { return; } if (mAttackSource == SCENE_ITEM.SI_LAND_MINE || mAttackSource == SCENE_ITEM.SI_MISSILE) { // 进入被攻击状态 CommandCharacterAddState cmdState = newCmd(out cmdState); cmdState.mState = PLAYER_STATE.PS_ATTACKED; pushCommand(cmdState, other); // 设置角色的速度,当角色速度小于3km/h时,则不变,否则速度设置为3km/h CommandCharacterChangeSpeed cmd = newCmd(out cmd, false); cmd.mSpeed = Mathf.Min(MathUtility.KMHtoMS(3.0f), other.getCharacterData().mSpeed); pushCommand(cmd, other); // 播放摔倒动作 Animation animation = other.getAnimation(); animation.CrossFade(GameDefine.ANIM_FALL_DOWN); // 当速度为0时,摔到后为站立状态,否则开始骑行 if (other.getCharacterData().mSpeed <= 0.01f) { animation.CrossFadeQueued(GameDefine.ANIM_STANDING); } else { animation.CrossFadeQueued(GameDefine.ANIM_RIDE); } // 同时需要降低硬件速度组件中从当前速度加速到目标速度的快慢 CharacterSpeedHardware speedHardware = other.getFirstComponent <CharacterSpeedHardware>(); speedHardware.setAcceleration(0.0f); } }
public override void leave() { // 速度设置为0 CommandCharacterChangeSpeed cmdSpeed = newCmd(out cmdSpeed, false); cmdSpeed.mSpeed = 0.0f; pushCommand(cmdSpeed, mPlayer); // 禁用自行车物理组件,禁用硬件速度组件 mPlayer.activeFirstComponent <CharacterBikePhysics>(false); mPlayer.activeFirstComponent <CharacterSpeedHardware>(false); // 禁用AI控制器 if (mPlayer.isType(CHARACTER_TYPE.CT_AI)) { mPlayer.activeFirstComponent <CharacterControllerAI>(false); } // 断开摄像机的连接 if (mPlayer.isType(CHARACTER_TYPE.CT_MYSELF)) { pushCommand <CommandCameraLinkTarget>(mCameraManager.getMainCamera()); } }