FPSを作ってみよう11-装備武器の能力を設定するスクリプトの作成-

前回

FPSゲームでキャラクターが視点を上下した時に持っている銃も視点の先に向くようにしていきます。 視点の上下によってキャラクターの中身が見えてしまう対処もしていきます。

でキャラクターの視点の方向に銃口の先を向けるように出来ました。

今回は前回までの記事の修正(ゲーム性を上げる為の)と武器の違いによって攻撃力や射程距離を変更したいという事も出てくると思うので、武器に能力を設定するスクリプトを作成しておきます。

スポンサーリンク

前回までの銃を撃つ処理を修正していく

今回の記事を作成する前に以前の記事で作成した内容をいくつか修正したいと思います。

それは銃を撃った時の処理になります。

以前の処理だと銃を撃ってから次に銃を撃つまでには銃を撃つアニメーションが終了しないとキーを押しても銃は撃てません。

こういう仕様で作りたい人はそのままでいいんですが、キーを押したら必ず銃を撃つようにした方がゲーム性があがります。

そこでMyCharaスクリプト、Shotアニメーションパラメータの変更、Animatorの条件の変更、Behaviourの追加をします。

まずはShotアニメーションパラメータの変更とAnimatorの遷移条件の変更です。

AnimatorのParametersでShotをTriggerで作成していましたがそれを削除して、+を押しBoolのShotを作成します。

WaitShot→Shotの条件をShotがtrue
Shot→WaitShotの条件をShotがfalse

の時に変更します。

また、

Shot→WaitShotの条件のHas Exit Timeのチェックを外しておきます。

これで銃を撃つアニメーションの終了をまたずともすぐに銃が撃てるようになります。

次にMyCharaスクリプトの修正です。

animator.SetTrigger(“Shot”) → animator.SetBool(“Shot”, true)

と変更します。

このままだとShotがfalseになる事がないのでShotのインスペクタのAdd Behaviourをクリックし新しいビヘイビアEndShotを作成します。

resetTimeは銃を撃ってからShotをfalseにするまでの時間でインスペクタで設定出来るようにします。

nowTimeは経過時間を入れるフィールドです。

OnStateEnterはShotの状態に入ってきた時に実行する関数でnowTimeを初期化しています。

OnStateUpdateはShotの状態にいる間ずっと実行する関数で時間を計測しnowTimeがresetTimeを越えたらShotをfalseにしています。

Shot状態のインスペクタでEndShotのパラメータを設定

Shot状態を選択してインスペクタを表示し、EndShotのresetTimeに0.25を設定しました。

連続ショットのサンプル動画

↑の動画のように連続で銃を撃てるようになりました。

撃った後が早すぎるような気がしますが、見た目を取るかキーのレスポンスを取るかになってきます・・・・(-.-)

銃を撃つ為のボタンを押したら必ず撃ちたい場合はresetTimeを0にする事で待ち時間がなくなります。

Shot→WaitShotのSettingsのInterruption SourceでNext Stateにするとすぐに次の打つ処理に移行する事も出来ます。

とりあえずこれで処理の修正が完了です。

銃の能力を設定するスクリプトFPSWeaponStatusスクリプトの作成

銃にはそれぞれ攻撃力、射程距離、装填出来る弾の数を設定しておくスクリプトを設定しておきたいと思います。

今後、武器を切り替える機能を取りつけた場合に弾が敵に当たったかを銃に設定されているFPSWeaponStatusの設定値を見て決めるようにしたいと思います。

現状ではハンドガンしか持ってないのでハンドガンの能力を考えパラメータを設定出来るようにします。

インスペクタで銃の能力を変更出来るように宣言しておきます。

それぞれのパラメータはメソッドで取得出来るようにし、銃の能力を取得したい時はメソッドを介して値を取得し利用するようにします。

例えば銃を撃った時に敵との距離が銃の射程距離内であるかどうか?や

敵に弾が当たった時に銃の攻撃力を取得し敵に与えるダメージを計算する時に銃の能力のパラメータを返すメソッドを呼び出しその値を使うようにします。

これで銃の能力を設定するスクリプトが完成しました。

FPSを作ってみようカテゴリ記事の終了

さて突然ですが今回の記事を持ってFPSを作ってみようカテゴリの記事は終了となります。

今までありがとうございました。

 
 
 
 
 
 
 
 
 
 
 
 
 
と言ってみたかったりして・・・・(-.-)ボソッ

悪い冗談ですねまったく(`Д´) ムキー!

あまりにFPSカテゴリ記事のアクセスがない為にちょっと言ってみたかっただけです。
FPSカテゴリ記事にあてはまらず独自ドメイン以降の記事が軒並みなんですけどね(^_^;)

次回は銃を撃って敵に当たったかどうかの機能を作成するのでその時に今回のスクリプトを使用する事になります。

今回の記事はちょっとした休憩記事ですね・・・( ´△`)y-~~

今回のような修正は自分だけでゲーム作ってる場合は勝手に直せばいいんですが、ブログの記事で連続した内容を記述している場合は大変です・・・(^_^;)

前にずっとその内容で書いてきた記事も修正しなくてはならなくなりますからね。

しかし、今回の修正はあくまで銃を撃つ反応を早くするというカスタマイズなので前の記事は修正しません!

なんだかんだ(叫んだって♪)
言ってもただ面倒くさいだけですね・・・・(-_-)/~~~ピシー!ピシー!

久しぶりのFPSカテゴリの記事ですが、次回はいつになるやら・・・。
また、しばらくお待ちくださいm(__)m

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. 匿名 より:

    無事思い通りの動きができるようになりました!
    お二方ともありがとうございます!

  2. 匿名 より:

    FPSによくある銃を構えずに撃つと弾がバラける仕様はどのように実装すればいいのでしょうか?

    • こんにちは(^^)/

      わたくし自身はFPSをほぼやったことがないので、どのような機能なのかがわかりません。

      YouTube等の動画サイトのその機能を見れるURLを貼ったり、細かい仕様を書いて頂くとお手伝いが出来るかもしれません。

      「銃を構えず持ちながら歩いている時に銃を撃つボタンを押すと広範囲の敵に弾がヒットする」等

      • 匿名 より:

        https://gameisbest.jp/archives/23750
        こんな感じの機能です!
        「銃を構えずに撃つと弾がランダムに飛んでいき弾が全くまっすぐ飛ばない」といった感じでしょうか
        スクリプトはC#を使用しています。

        • わかめさんが返答してくださったような銃を発射する位置をランダムに回転させて、敵との当たり判定をするようにすれば真っすぐに飛ばないという仕様に出来そうですね。(^^)v

          わたくしの記事であれば

          https://gametukurikata.com/fps/collisiondetection

          で銃の発射口を銃の弾が出る位置に空のゲームオブジェクト(Muzzle)で作っており、Muzzleの前方(弾が出る先)が銃口の先となっております。

          なのでMuzzleの現在の角度を保持しておき、銃を構えていない状態の時に銃を撃つボタンを押したらMuzzleを回転させて前方をランダムにすれば弾が飛ぶ位置を変える事が出来ます。

          銃を撃って判定が終わった後はMuzzleの角度を元に戻してあげれば良さそうです。

    • わかめ より:

      ばらけさせるだけのスクリプトですが、こんな感じでどうでしょうか。おそらく思い通りの動きになるはずです。unityのエディットでバラける範囲を変えることもできますので、ここから派生させることも可能なハズです。

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;

      public class bullet : MonoBehaviour {
      public float Loose; //バラける範囲の制限
      public static bool Correct; //構えているか。プレイヤーのスクリプトで制御してください
      // Use this for initialization
      void Start () {
      if (Correct == false)
      {
      transform.Rotate(new Vector3(Random.Range(0f, Loose), Random.Range(0f, Loose), 0f)); //ランダムにばらけます
      }
      }

      // Update is called once per frame
      void Update () {

      }
      }

    • わかめ より:

      すみません、訂正です。

      sing System.Collections;
      using System.Collections.Generic;
      using UnityEngine;

      public class bullet : MonoBehaviour {
      public float Loose; //バラける範囲の制限
      float LowLoose;
      // Use this for initialization
      void Start () {
      LowLoose -= Loose;
      if (Player.Correct == false) //Playerのスクリプトでpublic static bool Correctをつくり、よくねらっている時にtrue、そうでない時にfalseにしてください
      {
      transform.Rotate(new Vector3(Random.Range(LowLoose, Loose), Random.Range(LowLoose, Loose), 0f)); //ランダムにばらけます
      }
      }

      // Update is called once per frame
      void Update () {

      }
      }