/// @@@Main関数が長くなってしまっているので、 /// 処理ごとに関数を切るのが良いでしょう /// regionで切るのも良いですが、 /// regionは変数のスコープが長いままにもなりますし /// 今後さらに膨れてきた際にバグの発見が難しくなることや /// チームで仕事をする際に、流れを知らない他の人が目的箇所にたどり着くため /// 上から延々と処理を追うことになってしまうので、 /// 処理の見出しを作るような感覚で、可能な限り関数で小分けにしておくのが良いかと思います /// 自分はVSCODEを使っていますが、 /// VisualStudioにもメソッドの抽出があると思いますので、 /// https://docs.microsoft.com/ja-jp/visualstudio/ide/reference/extract-method?view=vs-2019 /// 積極的に使ってみてください。 public void HurtBoxMain(NekketsuSound NSound) { DamagePattern otherPlayerDmgPtn = DamagePattern.None; float otherPlayerX = 0; float otherPlayerZ = 0; float otherPlayerPunch = 0; float otherPlayerKick = 0; AttackPattern otherPlayerAttack = AttackPattern.None; Rect otherHitBox = new Rect(0, 0, 0, 0); // 自分から見て、他プレイヤーの情報を取得 switch (NAct.gameObject.name) { case "Player1": otherPlayerDmgPtn = NAct.Nmng.Player2.NowDamage; otherPlayerX = NAct.Nmng.Player2.X; otherPlayerZ = NAct.Nmng.Player2.Z; otherPlayerPunch = NAct.Nmng.Player2.st_punch; otherPlayerKick = NAct.Nmng.Player2.st_kick; otherPlayerAttack = NAct.Nmng.Player2.NowAttack; otherHitBox = NAct.Nmng.Player2.hitBox; break; case "Player2": otherPlayerDmgPtn = NAct.Nmng.Player1.NowDamage; otherPlayerX = NAct.Nmng.Player1.X; otherPlayerZ = NAct.Nmng.Player1.Z; otherPlayerPunch = NAct.Nmng.Player1.st_punch; otherPlayerKick = NAct.Nmng.Player1.st_kick; otherPlayerAttack = NAct.Nmng.Player1.NowAttack; otherHitBox = NAct.Nmng.Player1.hitBox; break; } // ダウン状態の時() if (NAct.NowDamage == DamagePattern.UmaTaore || NAct.NowDamage == DamagePattern.UmaTaoreUp) { // まだ失格していない if (NAct.DeathFlag == DeathPattern.None) { // ダウンした瞬間、体力0なら失格 if (NAct.st_life <= 0) { if (NAct.DeathFlag == DeathPattern.None) { NSound.SEPlay(SEPattern.death); } NAct.DeathFlag = DeathPattern.deathNow; } else { // たいりょくがまだあるので起き上がり //現在計測中のダウン時間が、ダウン時間(各キャラのステータス値)を超えた場合 if (NAct.st_downTime < NAct.nowDownTime) { NAct.NowDamage = DamagePattern.SquatGetUp; //起き上がり(しゃがみ) NAct.squatFlag = true; NAct.nowDownTime = 0; } NAct.nowDownTime += Time.deltaTime; } } } else { //ふっとばされ中 if (NAct.BlowUpFlag) { // ふっとび処理 if (NAct.BlowUpNowTime <= NAct.BlowUpInitalVelocityTime) { NAct.Y += 0.1f; if (otherPlayerAttack == AttackPattern.DosukoiBack) { NAct.Z += 0.1f; } if (otherPlayerAttack == AttackPattern.DosukoiFront) { NAct.Z -= 0.1f; } // 他プレイヤーの攻撃が前か後ろか(おおよそ)で、前後に吹っ飛ぶか分ける // @@@相手の位置ではなく向きで攻撃方向をとった方がいいですね // 旋風脚のように相対位置で飛び方向を決めたほうがいいものもあるのでそれは技にフラグをもたせるのが良いです if (otherPlayerX <= NAct.X) { NAct.X += 0.01f; } else { NAct.X -= 0.01f; } } else { //固定吹っ飛び時間終了なので、落下させる NAct.Y -= 0.08f; //ふっとび状態から地面についたら if (NAct.Y <= 0) { NAct.Y = 0; NAct.BlowUpFlag = false;; NAct.downDamage = 0; //ふっとびパターンによってダウン状態(ドット絵)を変更 if (NAct.NowDamage == DamagePattern.UmaBARF) { NAct.NowDamage = DamagePattern.UmaTaoreUp; } else if (NAct.NowDamage == DamagePattern.UmaOttotto) { NAct.NowDamage = DamagePattern.UmaTaore; } NAct.BlowUpNowTime = 0; } } NAct.BlowUpNowTime += Time.deltaTime; } else { // プレイヤー1~4の喰らい判定 if ((otherPlayerZ - 0.4f <= NAct.Z && NAct.Z <= otherPlayerZ + 0.4f) && NAct.hurtBox.Overlaps(otherHitBox) && otherHitBox != Settings.Instance.Attack.AttackNone) { NAct.NowAttack = AttackPattern.None; NAct.dashFlag = false; //被弾したらダッシュ解除 if (NAct.NowDamage == DamagePattern.None) { // 喰らったダメージを計算 switch (otherPlayerAttack) { case AttackPattern.JumpKick: NAct.downDamage += otherPlayerKick; NAct.st_life -= otherPlayerKick; if (NAct.st_life <= 0) { NAct.st_life = 0; } break; default: NAct.downDamage += otherPlayerPunch; NAct.st_life -= otherPlayerPunch; if (NAct.st_life <= 0) { NAct.st_life = 0; } break; } } // 自キャラが空中にいるか? if (!NAct.jumpFlag) { //自キャラが地上にいるので通常のダメージ計算 // ダメージ喰らい状態に変更 if (NAct.downDamage < 20) { if (NAct.vx == 0 && NAct.vz == 0) { if (otherPlayerX <= NAct.X) { NAct.NowDamage = DamagePattern.UmaHitFront; } else { NAct.NowDamage = DamagePattern.UmaHitBack; } } else { NAct.NowDamage = DamagePattern.UmaHogeWalk; } //ダメージ受けた瞬間から、蓄積ダメージリセットまでの時間を計測 NAct.nowHogeTime = 0; } else if (NAct.NowDamage != DamagePattern.UmaHoge && 20 <= NAct.downDamage) { NAct.NowDamage = DamagePattern.UmaHoge; //ダメージ受けた瞬間から、蓄積ダメージリセットまでの時間を計測 NAct.nowHogeTime = 0; } else if (NAct.NowDamage == DamagePattern.UmaHoge && 30 <= NAct.downDamage) { // 他プレイヤーの攻撃が前か後ろか(おおよそ)と、 // 自キャラの向きから吹っ飛びアニメを切り替え if (otherPlayerX <= NAct.X) { if (NAct.leftFlag) { NAct.NowDamage = DamagePattern.UmaBARF; } else { NAct.NowDamage = DamagePattern.UmaOttotto; } } else { if (NAct.leftFlag) { NAct.NowDamage = DamagePattern.UmaOttotto; } else { NAct.NowDamage = DamagePattern.UmaBARF; } } NAct.BlowUpFlag = true; NAct.downDamage = 0; } else { } } else { //自分がジャンプ状態のときに、 //攻撃を受けた際は蓄積ダメージを考慮せず、固定でダウン状態へ // 他プレイヤーの攻撃が前か後ろか(おおよそ)と、 // 自キャラの向きから吹っ飛びアニメを切り替え if (otherPlayerX <= NAct.X) { if (NAct.leftFlag) { NAct.NowDamage = DamagePattern.UmaBARF; } else { NAct.NowDamage = DamagePattern.UmaOttotto; } } else { if (NAct.leftFlag) { NAct.NowDamage = DamagePattern.UmaOttotto; } else { NAct.NowDamage = DamagePattern.UmaBARF; } } NAct.BlowUpFlag = true; NAct.downDamage = 0; //ジャンプ中にダウンしたので、ジャンプ周りをリセット NAct.vy = 0; NAct.jumpFlag = false; NAct.jumpSpeed = 0; } if (NAct.NowDamage == DamagePattern.UmaHitBack || NAct.NowDamage == DamagePattern.UmaHitFront) { // ノックバック処理 if (otherPlayerX <= NAct.X) { if (otherPlayerAttack == AttackPattern.DosukoiBack) { NAct.Z += 0.02f; } else if (otherPlayerAttack == AttackPattern.DosukoiFront) { NAct.Z -= 0.02f; } else { NAct.X += 0.02f; } } else { if (otherPlayerAttack == AttackPattern.DosukoiBack) { NAct.Z += 0.02f; } else if (otherPlayerAttack == AttackPattern.DosukoiFront) { NAct.Z -= 0.02f; } else { NAct.X -= 0.02f; } } } // 攻撃効果音 if (otherPlayerAttack == AttackPattern.Dosukoi || otherPlayerAttack == AttackPattern.DosukoiBack || otherPlayerAttack == AttackPattern.DosukoiFront) { NSound.SEPlay(SEPattern.hit); } else { NSound.SEPlay(SEPattern.hijiHit); } } else { NAct.NowDamage = DamagePattern.None; } // ★デバッグ用 うにうにくんダメージ★ if ((NAct.Nmng.uni.Z - 0.4f <= NAct.Z && NAct.Z <= NAct.Nmng.uni.Z + 0.4f) && NAct.hurtBox.Overlaps(NAct.Nmng.uni.hitBoxTEST)) { NAct.NowDamage = DamagePattern.UmaHoge; if (!NSound.audioSource.isPlaying) { NAct.BlowUpFlag = true; NAct.NowDamage = DamagePattern.UmaBARF; NSound.SEPlay(SEPattern.hit); } //ジャンプ中にダウンを考慮して、ジャンプ周りをリセット NAct.vy = 0; NAct.jumpFlag = false; } } } }
protected override void Start() { base.Start(); damagePattern = DamagePattern.Normal; }