//void OnCollisionEnter2D(Collider2D col) //{ // Debug.Log("物体だ☆! col.tag = " + col.tag); //} /// <summary> /// BoxCollider2D(等のPhysics2D), Rigidbody2D の2つをアタッチしているものと接触したとき。 /// </summary> /// <param name="col"></param> void OnTriggerEnter2D(Collider2D col) { #region 当たり判定 if (col.tag == playerScript.OpponentHitboxTag)// 相手の 攻撃当たり判定くん が重なった時 { // ブロックしているかどうか判定☆ //CommonInput.PlayerInput input = CommonInput.player_to_input[playerIndex]; CommonInput.PlayerInput input = CommonInput.Update((PlayerIndex)playerIndex); if (FacingOpponentMoveFwBkSt.Back == playerScript.GetFacingOpponentMoveFwBkSt(input.leverX)) { //if ((int)PlayerIndex.Player1==playerIndex) //{ // Debug.Log("ブロック☆! col.tag = " + col.tag + " input.leverX = " + input.leverX + " Time.deltaTime = " + Time.deltaTime); //} audioSources[1].PlayOneShot(audioSources[1].clip);// 効果音を鳴らすぜ☆ playerScript.Animator.SetTrigger(SceneCommon.TRIGGER_BLOCK); } else { //if ((int)PlayerIndex.Player1 == playerIndex) //{ // Debug.Log("痛っ☆! col.tag = " + col.tag + " input.leverX = " + input.leverX + " Time.deltaTime = " + Time.deltaTime); //} playerScript.DamageHitCount++; // 攻撃を受けた回数。 audioSources[0].PlayOneShot(audioSources[0].clip); // 効果音を鳴らすぜ☆ // 爆発の粒子を作るぜ☆ TakoyakiParticleScript.Add(transform.position.x, transform.position.y); // HPメーター { float damage = playerScript.MainCameraScript.Player_to_attackPower[(int)playerScript.Opponent]; float value = damage * (playerIndex == (int)PlayerIndex.Player1 ? -1 : 1); playerScript.MainCameraScript.OffsetBar(value); if (10 <= playerScript.DamageHitCount) { // ダウン・アニメーションの開始 playerScript.Pull_Down(); } else if (100.0f <= damage) { // ダメージ・アニメーションの開始 playerScript.Pull_DamageH(); } else if (50.0f <= damage) { // ダメージ・アニメーションの開始 playerScript.Pull_DamageM(); } else { // ダメージ・アニメーションの開始 playerScript.Pull_DamageL(); } } // 手番 { // 攻撃を受けた方の手番に変わるぜ☆(^▽^) playerScript.MainCameraScript.SetTeban(playerScript.Opponent); } } } else { //Debug.Log("相手の攻撃じゃないものに当たった☆! col.tag = " + col.tag); } #endregion }
// Update is called once per frame void Update() { // 現在のアニメーター・ステートに紐づいたデータ AcStateRecordable astateRecord = AControl.Instance.GetCurrentAcStateRecord(animator); #region 入力受付と途中参加 CommonInput.PlayerInput input = CommonInput.Update((PlayerIndex)playerIndex); // 人間の途中参加受付 if ( CommonScript.Player_to_computer[playerIndex] && // コンピュータープレイヤーの場合 ( // レバーはコンピューターもいじっているので、区別できない。 // 0 != leverX || // 0 != leverY || 0 != input.leverX || 0 != input.leverY || input.pressingLP || input.pressingMP || input.pressingHP || input.pressingLK || input.pressingMK || input.pressingHK || input.pressingPA || input.pressingCA )) { Debug.Log("途中参加 " + playerIndex + " プレイヤー" + " leverX = " + input.leverX + " leverY = " + input.leverY); // コンピューター・プレイヤー側のゲームパッドで、何かボタンを押したら、人間の参入。 CommonScript.Player_to_computer[playerIndex] = false; // FIXME: 硬直時間を入れたい。 return; } if (CommonScript.Player_to_computer[playerIndex]) { input.leverX = Random.Range(-1.0f, 1.0f); input.pressingLP = false; input.pressingMP = false; input.pressingHP = false; input.pressingLK = false; input.pressingMK = false; input.pressingHK = false; input.pressingPA = false; input.pressingCA = false; } else { input.leverX = Input.GetAxisRaw(CommonInput.PlayerAndInput_to_inputName[playerIndex, (int)InputIndex.Horizontal]); } #endregion if (AControl.Instance.StateHash_to_record[Animator.StringToHash(Select_Cursor_AbstractAControl.BASELAYER_STAY)].Name == astateRecord.Name) { //カーソル移動中でなければ。 if (CommonScript.Player_to_computer[playerIndex])// コンピュータープレイヤーの場合 { if (Select_CameraScript.READY_TIME_LENGTH < mainCameraScript.ReadyingTime) { input.pressingLP = (0.5 < Random.Range(0.0f, 1.0f)); // たまにパンチ・キーを押して決定する。 } } if ( input.pressingLP || input.pressingMP || input.pressingHP || input.pressingLK || input.pressingMK || input.pressingHK || input.pressingPA ) { // 何かボタンを押したら、キャラクター選択。 animator.SetTrigger(SceneCommon.TRIGGER_SELECT); } else if (input.leverX != 0.0f)//左か右を入力したら { //Debug.Log("slide lever x = " + leverX.ToString()); if (input.leverX < 0.0f) { cursorColumn--; if (cursorColumn < 0) { cursorColumn = 2; } } else { cursorColumn++; if (2 < cursorColumn) { cursorColumn = 0; } } //Debug.Log("slide pos = " + cursorColumn[iPlayerIndex]); animator.SetTrigger(SceneCommon.TRIGGER_MOVE); ChangeCharacter(); //入力方向へ移動 //rigidbody2Ds[iPlayerIndex].velocity = new Vector2(leverX * cursorSpeed, rigidbody2Ds[iPlayerIndex].velocity.y); SlideIn(); } else // ボタン押下も、レバー左右入力もしていなかったら { //横移動の速度を0にしてピタッと止まるようにする myRigidbody2D.velocity = new Vector2(0, myRigidbody2D.velocity.y); } } else if (AControl.Instance.StateHash_to_record[Animator.StringToHash(Select_Cursor_AbstractAControl.BASELAYER_MOVE)].Name == astateRecord.Name) { } else if (AControl.Instance.StateHash_to_record[Animator.StringToHash(Select_Cursor_AbstractAControl.BASELAYER_READY)].Name == astateRecord.Name) { // キャラクター選択済みのとき if ( !CommonScript.Player_to_computer[playerIndex] // 人間プレイヤーの場合 && ( input.pressingLK || input.pressingMK || input.pressingHK || input.pressingCA )) { // キック・ボタンを押したら、キャンセル☆ animator.SetTrigger(SceneCommon.TRIGGER_STAY); } } }
void Update() { //if ((int)PlayerIndex.Player1 == playerIndex) //{ // //ebug.Log("Update Time.deltaTime = " + Time.deltaTime); //} // 現在のアニメーター・ステートに紐づいたデータ AcState astateRecord = (AcState)AControl.Instance.GetCurrentAcStateRecord(animator); #region 入力受付 CommonInput.PlayerInput input = CommonInput.Update((PlayerIndex)playerIndex); if (isComputer) { if (input.buttonDownLP || input.buttonDownMP || input.buttonDownHP || input.buttonDownLK || input.buttonDownMK || input.buttonDownHK || input.buttonDownPA) { // 人間プレイヤーの乱入☆ 次のフレームから☆ isComputer = false; input.leverX = 0; input.leverY = 0; } else { // コンピューター・プレイヤーの場合。 input.leverX = Random.Range(-1.0f, 1.0f); input.leverY = Random.Range(-1.0f, 1.0f); if (-0.980f < input.leverX && input.leverX < 0.980f) { // きょろきょろするので落ち着かせるぜ☆(^~^) input.leverX = 0.0f; } if (-0.995f < input.leverY && input.leverY < 0.995f) { // ジャンプばっかりするので落ち着かせるぜ☆(^~^) input.leverY = 0.0f; } if (input.pressingLP) { input.buttonUpLP = (0.900f < Random.Range(0.0f, 1.0f)); } else { input.buttonUpLP = false; input.buttonDownLP = (0.900f < Random.Range(0.0f, 1.0f)); } if (input.pressingMP) { input.buttonUpMP = (0.990f < Random.Range(0.0f, 1.0f)); } else { input.buttonUpMP = false; input.buttonDownMP = (0.990f < Random.Range(0.0f, 1.0f)); } if (input.pressingHP) { input.buttonUpHP = (0.995f < Random.Range(0.0f, 1.0f)); } else { input.buttonUpHP = false; input.buttonDownHP = (0.995f < Random.Range(0.0f, 1.0f)); } if (input.pressingLK) { input.buttonUpLK = (0.900f < Random.Range(0.0f, 1.0f)); } else { input.buttonUpLK = false; input.buttonDownLK = (0.900f < Random.Range(0.0f, 1.0f)); } if (input.pressingMK) { input.buttonUpMK = (0.990f < Random.Range(0.0f, 1.0f)); } else { input.buttonUpMK = false; input.buttonDownMK = (0.990f < Random.Range(0.0f, 1.0f)); } if (input.pressingHK) { input.buttonUpHK = (0.995f < Random.Range(0.0f, 1.0f)); } else { input.buttonUpHK = false; input.buttonDownHK = (0.995f < Random.Range(0.0f, 1.0f)); } //buttonUpPA = (0.999f < Random.Range(0.0f, 1.0f)); //buttonDownPA = (0.999f < Random.Range(0.0f, 1.0f)); } } #endregion FacingOpponentMoveFwBkSt facingOpponentMoveFwBkSt = GetFacingOpponentMoveFwBkSt(input.leverX); if (astateRecord.Tags.Contains((int)Animator.StringToHash(AControl.TAG_BLOCK))) { // ブロック中 if (FacingOpponentMoveFwBkSt.Back != facingOpponentMoveFwBkSt) { // バックを解除している場合。 animator.SetTrigger(SceneCommon.TRIGGER_DEBLOCK); } } #region ジャンプ { // キャラクターの下半身に、接地判定用の垂直線を引く // transform.up が -1 のとき、方眼紙の1マス分ぐらい下に相当? isGrounded = Physics2D.Linecast( transform.position + transform.up * 0, // スプライトの中央 transform.position - transform.up * 1.1f, // 足元を少しはみ出すぐらい groundLayer // Linecastが判定するレイヤー // LayerMask.GetMask("Water")// ); //if ((int)PlayerIndex.Player1 == playerIndex) //{ // //ebug.Log("B playerIndex = " + playerIndex + " isGrounded = " + isGrounded + " transform.position.y = " + transform.position.y + " Rigidbody2D.velocity.y = " + Rigidbody2D.velocity.y); //} //Animatorへパラメーターを送る animator.SetFloat(SceneCommon.FLOAT_VEL_Y, Rigidbody2D.velocity.y); // y方向へかかる速度単位,上へいくとプラス、下へいくとマイナス //ebug.Log("Jumping velY="+animator.GetFloat(SceneCommon.FLOAT_VEL_Y)); animator.SetBool(SceneCommon.BOOL_IS_GROUNDED, isGrounded); } #endregion #region 弾を撃つ // 弾を撃つぜ☆ if ( (3 == animator.GetInteger(SceneCommon.INTEGER_LEVER_X_NEUTRAL) % (30)) // レバーを放して、タイミングよく攻撃ボタンを押したとき && ( input.buttonDownLP || input.buttonDownMP || input.buttonDownHP || input.buttonDownLK || input.buttonDownMK || input.buttonDownHK ) ) { float startY; if (0 < input.leverY)// 上段だぜ☆ { startY = 1.2f; } else if (0 == input.leverY)// 中段だぜ☆ { startY = 0.6f; } else // 下段だぜ☆ { startY = 0.0f; } // 弾の作成☆ GameObject newBullet = Instantiate(bullet, transform.position + new Vector3(0f, startY, 0f), transform.rotation); SpriteRenderer newBulletSpriteRenderer = newBullet.GetComponent <SpriteRenderer>(); // 弾の画像を差し替えたいぜ☆(^~^) { int r = Random.Range(0, 14); Sprite[] sprites = Resources.LoadAll <Sprite>("Sprites/Bullet0"); Sprite sprite2; switch (r) { case 0: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_0")); break; //歩 case 1: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_1")); break; //香 case 2: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_2")); break; //桂 case 3: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_3")); break; //銀 case 4: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_4")); break; //金 case 5: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_5")); break; //角 case 6: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_6")); break; //飛 case 7: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_7")); break; //玉 case 8: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_8")); break; //と case 9: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_9")); break; //杏 case 10: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_10")); break; //圭 case 11: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_11")); break; //全 case 12: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_12")); break; //馬 default: sprite2 = System.Array.Find <Sprite>(sprites, (sprite) => sprite.name.Equals("Bullet0_13")); break; //竜 } newBulletSpriteRenderer.sprite = sprite2; } } #endregion #region レバーの押下時間の更新 // レバー・ニュートラル時間と、レバー・プレッシング時間は、8フレームほど重複する部分がある。 if (input.leverX != 0)//左か右を入力したら { animator.SetInteger(SceneCommon.INTEGER_LEVER_X_PRESSING, animator.GetInteger(SceneCommon.INTEGER_LEVER_X_PRESSING) + 1); animator.SetInteger(SceneCommon.INTEGER_LEVER_X_NEUTRAL, 0); animator.SetInteger(SceneCommon.INTEGER_LEVER_X_IDOL, 0); } else //左も右も入力していなかったら { // 感覚的に、左から右に隙間なく切り替えたと思っていても、 // 入力装置的には、左から右(その逆も)に切り替える瞬間、どちらも押していない瞬間が発生する。 if (8 < animator.GetInteger(SceneCommon.INTEGER_LEVER_X_IDOL))// レバーを放した 数フレーム目から、レバーが離れた判定をすることにする。 { animator.SetInteger(SceneCommon.INTEGER_LEVER_X_PRESSING, 0); animator.SetInteger(SceneCommon.INTEGER_LEVER_X_NEUTRAL, animator.GetInteger(SceneCommon.INTEGER_LEVER_X_NEUTRAL) + 1); } else { animator.SetInteger(SceneCommon.INTEGER_LEVER_X_IDOL, animator.GetInteger(SceneCommon.INTEGER_LEVER_X_IDOL) + 1); } } if (0 != input.leverY)// 上か下キーを入力していたら { animator.SetInteger(SceneCommon.INTEGER_LEVER_Y_PRESSING, animator.GetInteger(SceneCommon.INTEGER_LEVER_Y_PRESSING) + 1); animator.SetInteger(SceneCommon.INTEGER_LEVER_Y_NEUTRAL, 0); animator.SetInteger(SceneCommon.INTEGER_LEVER_Y_IDOL, 0); } else // 下も上も入力していなかったら { // 感覚的に、左から右に隙間なく切り替えたと思っていても、 // 入力装置的には、下から上(その逆も)に切り替える瞬間、どちらも押していない瞬間が発生する。 if (8 < animator.GetInteger(SceneCommon.INTEGER_LEVER_Y_IDOL))// レバーを放した 数フレーム目から、レバーが離れた判定をすることにする。 { animator.SetInteger(SceneCommon.INTEGER_LEVER_Y_PRESSING, 0); animator.SetInteger(SceneCommon.INTEGER_LEVER_Y_NEUTRAL, animator.GetInteger(SceneCommon.INTEGER_LEVER_Y_NEUTRAL) + 1); } else { animator.SetInteger(SceneCommon.INTEGER_LEVER_Y_IDOL, animator.GetInteger(SceneCommon.INTEGER_LEVER_Y_IDOL) + 1); } } #endregion #region レバー操作によるアクション //if (!anim.GetBool(CommonScript.BOOL_JMOVE0))//ジャンプ時の屈伸中ではないなら //{ if (input.leverX != 0)//左か右を入力したら { if (!astateRecord.Tags.Contains(Animator.StringToHash(AControl.TAG_BUSYX))) { //入力方向へ移動 Rigidbody2D.velocity = new Vector2(Mathf.Sign(input.leverX) * speedX, Rigidbody2D.velocity.y); } DoFacingOpponent(GetFacingOfOpponentLR()); //ebug.Log("さあ、どっちだ☆ input.leverX = " + input.leverX + " facingOpponentMoveFwBkSt = " + facingOpponentMoveFwBkSt + " Time.deltaTime = " + Time.deltaTime); if (FacingOpponentMoveFwBkSt.Forward == facingOpponentMoveFwBkSt)// 相手に向かってレバーを倒したとき { //if ((int)PlayerIndex.Player1 == playerIndex) //{ // //ebug.Log("相手に向かっていくぜ☆ input.leverX = " + input.leverX); //} Pull_Forward(); //if (isGrounded)// 接地していれば //{ //} //if ((int)ActioningIndex.Dash != anim.GetInteger(CommonScript.INTEGER_ACTIONING)) //{ // // ダッシュ・アニメーションの開始 // //if ((int)PlayerIndex.Player1 == playerIndex) // //{ // // //ebug.Log("Rigidbody2D.velocity.x = " + Rigidbody2D.velocity.x + " ダッシュ!"); // //} //} //else //{ // // 既にダッシュ中なら何もしない //} } else if (FacingOpponentMoveFwBkSt.Back == facingOpponentMoveFwBkSt)// 相手と反対の方向にレバーを倒したとき(バックステップ) { //if ((int)PlayerIndex.Player1 == playerIndex) //{ // //ebug.Log("相手の反対側に向かっていくぜ☆ input.leverX = " + input.leverX); //} Pull_Back(); } else // レバーを倒していない時(ここにはこない?) { //if ((int)PlayerIndex.Player1 == playerIndex) //{ // //ebug.Log("止まっているぜ☆ input.leverX = " + input.leverX); //} } } else// 左も右も入力していなかったら { if (isGrounded)// 接地していれば { // 横移動の速度を0にしてピタッと止まるようにする Rigidbody2D.velocity = new Vector2(0, Rigidbody2D.velocity.y); } // 感覚的に、左から右に隙間なく切り替えたと思っていても、 // 入力装置的には、左から右(その逆も)に切り替える瞬間、どちらも押していない瞬間が発生する。 if (8 < animator.GetInteger(SceneCommon.INTEGER_LEVER_X_NEUTRAL))// レバーを放した 数フレーム目から、レバーが離れた判定をすることにする。 { //if ((int)PlayerIndex.Player1 == playerIndex) //{ // //ebug.Log("Rigidbody2D.velocity.x = " + Rigidbody2D.velocity.x + " ストップ!"); //} if (isGrounded)// 接地していれば { animator.SetInteger(SceneCommon.INTEGER_ACTIONING, (int)TilesetfileType.Stand); } } } //ebug.Log("leverY = "+ leverY + " player_to_rigidbody2D[" + iPlayer + "].velocity = " + player_to_rigidbody2D[iPlayer].velocity); if (0 != input.leverY)// 上か下キーを入力していたら { if (!astateRecord.Tags.Contains(Animator.StringToHash(AControl.TAG_BUSYY))) { if (0 < input.leverY) // 上キーを入力したら { if (isGrounded) // 接地していれば { // ジャンプするぜ☆ Pull_Jump(); } } else if (input.leverY < 0) // 下キーを入力したら { if (isGrounded) // 接地していれば { // 屈むぜ☆ Pull_Crouch(); } } } } else // 下も上も入力していなかったら { } //} #endregion #region 行動 //if (buttonDownHP && buttonDownHK) //{ // //ebug.Log("投了☆!"); // Resign(); //} //else if (input.buttonDownLP) { //ebug.Log("button BUTTON_03_P1_LP"); Pull_LightPunch(); } else if (input.buttonDownMP) { //ebug.Log("button BUTTON_04_P1_MP"); Pull_MediumPunch(); } else if (input.buttonDownHP) { //ebug.Log("button BUTTON_05_P1_HP"); Pull_HardPunch(); } else if (input.buttonDownLK) { //ebug.Log("button BUTTON_06_P1_LK"); Pull_LightKick(); } else if (input.buttonDownMK) { //ebug.Log("button BUTTON_07_P1_MK"); Pull_MediumKick(); } else if (input.buttonDownHK) { //ebug.Log("button BUTTON_08_P1_HK"); Pull_HardKick(); } else if (input.buttonDownPA) { //ebug.Log("button BUTTON_09_P1_PA"); } #endregion if (SceneCommon.READY_TIME_LENGTH < mainCameraScript.ReadyingTime) { // 当たり判定くん Motor.Instance.Update(animator, AControl.Instance, playerIndex, transform, hitboxsSpriteRenderer, weakboxCollider2D); } }