void FixedUpdate() // このカメラ切り替えはFixedUpdate()内でないと正常に動かない { if (Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl) || flipCameraButton.GetButtonDown()) { setCameraPositionFrontView(); } else { setCameraPositionNormalView(); } /*if (Input.GetButton ("Fire1")) { // left Ctlr * // Change Front Camera * setCameraPositionFrontView (); * } else if (Input.GetButton ("Fire2")) { //Alt * // Change Jump Camera * setCameraPositionJumpView (); * } else { * // return the camera to standard position and direction * setCameraPositionNormalView (); * }*/ }
// 以下、メイン処理.リジッドボディと絡めるので、FixedUpdate内で処理を行う. void FixedUpdate() { float h = (Input.GetAxis("Horizontal") > 0 ? Input.GetAxis("Horizontal") : -Input.GetAxis("Horizontal")) > (joystick.GetAxis("Horizontal") > 0 ? joystick.GetAxis("Horizontal") : -joystick.GetAxis("Horizontal")) ? Input.GetAxis("Horizontal") : joystick.GetAxis("Horizontal"); // 入力デバイスの水平軸をhで定義 float v = (Input.GetAxis("Vertical") > 0 ? Input.GetAxis("Vertical") : -Input.GetAxis("Vertical")) > (joystick.GetAxis("Vertical") > 0 ? joystick.GetAxis("Vertical") : -joystick.GetAxis("Vertical")) ? Input.GetAxis("Vertical") : joystick.GetAxis("Vertical"); // 入力デバイスの垂直軸をvで定義 anim.SetFloat("Speed", v); // Animator側で設定している"Speed"パラメタにvを渡す anim.SetFloat("Direction", h); // Animator側で設定している"Direction"パラメタにhを渡す anim.speed = animSpeed; // Animatorのモーション再生速度に animSpeedを設定する currentBaseState = anim.GetCurrentAnimatorStateInfo(0); // 参照用のステート変数にBase Layer (0)の現在のステートを設定する rb.useGravity = true; //ジャンプ中に重力を切るので、それ以外は重力の影響を受けるようにする // 以下、キャラクターの移動処理 velocity = Vector3.forward * v; // 上下のキー入力からZ軸方向の移動量を取得 // キャラクターのローカル空間での方向に変換 velocity = transform.TransformDirection(velocity); //以下のvの閾値は、Mecanim側のトランジションと一緒に調整する if (v > 0.1) { velocity *= forwardSpeed; // 移動速度を掛ける } else if (v < -0.1) { velocity *= backwardSpeed; // 移動速度を掛ける } if (transform.parent.parent != null && (Input.GetButtonDown("Jump") || jumpButton.GetButtonDown())) // スペースキーを入力したら //アニメーションのステートがLocomotionの最中のみジャンプできる { if (currentBaseState.fullPathHash == locoState) { //ステート遷移中でなかったらジャンプできる if (!anim.IsInTransition(0)) { rb.velocity = Vector3.zero; rb.AddForce(Vector3.up * jumpPower, ForceMode.VelocityChange); anim.SetBool("Jump", true); // Animatorにジャンプに切り替えるフラグを送る } } } // 上下のキー入力でキャラクターを移動させる transform.localPosition += velocity * Time.fixedDeltaTime; // 左右のキー入力でキャラクタをY軸で旋回させる transform.Rotate(0, h * rotateSpeed, 0); // 以下、Animatorの各ステート中での処理 // Locomotion中 // 現在のベースレイヤーがlocoStateの時 if (currentBaseState.fullPathHash == locoState) { //カーブでコライダ調整をしている時は、念のためにリセットする if (useCurves) { resetCollider(); } } // JUMP中の処理 // 現在のベースレイヤーがjumpStateの時 else if (currentBaseState.fullPathHash == jumpState) { cameraObject.SendMessage("setCameraPositionJumpView"); // ジャンプ中のカメラに変更 // ステートがトランジション中でない場合 if (!anim.IsInTransition(0)) { // 以下、カーブ調整をする場合の処理 if (useCurves) { // 以下JUMP00アニメーションについているカーブJumpHeightとGravityControl // JumpHeight:JUMP00でのジャンプの高さ(0〜1) // GravityControl:1⇒ジャンプ中(重力無効)、0⇒重力有効 float jumpHeight = anim.GetFloat("JumpHeight"); float gravityControl = anim.GetFloat("GravityControl"); if (gravityControl > 0) { rb.useGravity = false; //ジャンプ中の重力の影響を切る } // レイキャストをキャラクターのセンターから落とす Ray ray = new Ray(transform.position + Vector3.up, -Vector3.up); RaycastHit hitInfo = new RaycastHit(); // 高さが useCurvesHeight 以上ある時のみ、コライダーの高さと中心をJUMP00アニメーションについているカーブで調整する if (Physics.Raycast(ray, out hitInfo)) { if (hitInfo.distance > useCurvesHeight) { col.height = orgColHight - jumpHeight; // 調整されたコライダーの高さ float adjCenterY = orgVectColCenter.y + jumpHeight; col.center = new Vector3(0, adjCenterY, 0); // 調整されたコライダーのセンター } else { // 閾値よりも低い時には初期値に戻す(念のため) resetCollider(); } } } // Jump bool値をリセットする(ループしないようにする) anim.SetBool("Jump", false); } } // IDLE中の処理 // 現在のベースレイヤーがidleStateの時 else if (currentBaseState.fullPathHash == idleState) { //カーブでコライダ調整をしている時は、念のためにリセットする if (transform.parent.parent != null && (Input.GetButtonDown("Jump") || jumpButton.GetButtonDown())) { if (!anim.IsInTransition(0)) { rb.velocity = Vector3.zero; rb.AddForce(Vector3.up * jumpPower, ForceMode.VelocityChange); anim.SetBool("Rest", true); // Animatorにジャンプに切り替えるフラグを送る } } if (useCurves) { resetCollider(); } /*// スペースキーを入力したらRest状態になる * if (Input.GetButtonDown("Jump")) { * anim.SetBool("Rest", true); * }*/ } // REST中の処理 // 現在のベースレイヤーがrestStateの時 else if (currentBaseState.fullPathHash == restState) { //cameraObject.SendMessage("setCameraPositionFrontView"); // カメラを正面に切り替える // ステートが遷移中でない場合、Rest bool値をリセットする(ループしないようにする) if (!anim.IsInTransition(0)) { anim.SetBool("Rest", false); } } }