private void Start() { /*エンジンの回転から前に力を加える処理 * 車体を進行方向に向かせる処理*/ (this).FixedUpdateAsObservable() .Subscribe(_ => { if (mGameSceneManager.SceneState != SceneState.GAME) { return; } float accel = mPlayerInput.Accel.Value; float steer = mPlayerInput.Hundle.Value; float brake = mPlayerInput.Brake.Value; GearState currentGear = mPlayerInput.GetCurrentGear.Value; print("Brake : " + brake); //姿勢制御処理 mAirRide.FixBalance(mRigidbody.velocity); //進行方向修正処理 mDirFix.FixDirection(accel, steer);//傾く //ジャンプ中はブレーキとハンドルは制御させない if (!mAirRide.IsGround) { brake = 0.0f; steer = 0.0f; } RaycastHit hitInfo = new RaycastHit(); mAIPenaltyRay.ForwardBoxCast(out hitInfo); //aiと正面方向が衝突したときaccel無効にする //アクセルを切っても速度は結構生きているかも? steer = SteeringScript.IgnoreLSteer(mWallHitCheck.LHit, steer); steer = SteeringScript.IgnoreRSteer(mWallHitCheck.RHit, steer); //ペナルティ処理 mEngine.GiveWallPenalty(mWallHitCheck.LOrRHit); mEngine.GiveDriftPenalty(mVehicleMove.GetWheelState == WheelState.DRIFT, transform.forward); bool aiPenalty = (hitInfo.transform != null) && hitInfo.transform.gameObject.CompareTag(ConstString.Tag.AI); mEngine.GiveAiPenalty(aiPenalty); float engineRot = mEngine.UpdateRotateEngine(accel, brake, currentGear); steer = SteeringScript.InverseSteer(engineRot, steer); //車を動かす処理 mVehicleMove.UpdateMove(engineRot, steer, brake, mAirRide.IsGround); //データ書き込み処理 WriteToModel(engineRot, currentGear); }); this.OnCollisionStayAsObservable().Subscribe(_ => { mEngine.OnCollisionStay(); }); }
/// <summary>壁に衝突したときの方向修正補助処理</summary> public void FixDirection(float accel, float steer) { RaycastHit hitInfo; bool hit = mFixRay.ForwardBoxCast(out hitInfo); if (!hit) { return; } if (accel < 0.2f) { return; } //衝突している場合 mTransform.Rotate(0.0f, 0.9f * steer, 0.0f); }