前回
でキャラクターの視点の方向に銃口の先を向けるように出来ました。
今回は前回までの記事の修正(ゲーム性を上げる為の)と武器の違いによって攻撃力や射程距離を変更したいという事も出てくると思うので、武器に能力を設定するスクリプトを作成しておきます。
前回までの銃を撃つ処理を修正していく
今回の記事を作成する前に以前の記事で作成した内容をいくつか修正したいと思います。
それは銃を撃った時の処理になります。
以前の処理だと銃を撃ってから次に銃を撃つまでには銃を撃つアニメーションが終了しないとキーを押しても銃は撃てません。
こういう仕様で作りたい人はそのままでいいんですが、キーを押したら必ず銃を撃つようにした方がゲーム性があがります。
そこで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を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | using UnityEngine; using System.Collections; public class EndShot : StateMachineBehaviour { // リセット時間 [SerializeField] private float resetTime = 0.2f; private float nowTime = 0f; // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { nowTime = 0f; if (Mathf.Approximately (resetTime, 0f)) { animator.SetBool ("Shot", false); } } // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { nowTime += Time.deltaTime; if (nowTime >= resetTime) { animator.SetBool ("Shot", false); } } // OnStateExit is called when a transition ends and the state machine finishes evaluating this state //override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateMove is called right after Animator.OnAnimatorMove(). Code that processes and affects root motion should be implemented here //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} // OnStateIK is called right after Animator.OnAnimatorIK(). Code that sets up animation IK (inverse kinematics) should be implemented here. //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { // //} } |
resetTimeは銃を撃ってからShotをfalseにするまでの時間でインスペクタで設定出来るようにします。
nowTimeは経過時間を入れるフィールドです。
OnStateEnterはShotの状態に入ってきた時に実行する関数でnowTimeを初期化しています。
OnStateUpdateはShotの状態にいる間ずっと実行する関数で時間を計測しnowTimeがresetTimeを越えたらShotをfalseにしています。
Shot状態を選択してインスペクタを表示し、EndShotのresetTimeに0.25を設定しました。
↑の動画のように連続で銃を撃てるようになりました。
撃った後が早すぎるような気がしますが、見た目を取るかキーのレスポンスを取るかになってきます・・・・(-.-)
銃を撃つ為のボタンを押したら必ず撃ちたい場合はresetTimeを0にする事で待ち時間がなくなります。
Shot→WaitShotのSettingsのInterruption SourceでNext Stateにするとすぐに次の打つ処理に移行する事も出来ます。
とりあえずこれで処理の修正が完了です。
銃の能力を設定するスクリプトFPSWeaponStatusスクリプトの作成
銃にはそれぞれ攻撃力、射程距離、装填出来る弾の数を設定しておくスクリプトを設定しておきたいと思います。
今後、武器を切り替える機能を取りつけた場合に弾が敵に当たったかを銃に設定されているFPSWeaponStatusの設定値を見て決めるようにしたいと思います。
現状ではハンドガンしか持ってないのでハンドガンの能力を考えパラメータを設定出来るようにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | using UnityEngine; using System.Collections; public class FPSWeaponStatus : MonoBehaviour { public enum WeaponType { HandGun, ShotGun }; // 銃の攻撃力 [SerializeField] private float power = 1f; // 銃の射程距離 [SerializeField] private float range = 10f; // 弾の最大装填数 [SerializeField] private int maxCharge = 20; // 銃の種類 [SerializeField] private WeaponType weaponType = WeaponType.HandGun; public float GetPower() { return power; } public float GetRange() { return range; } public int GetMaxCharge() { return maxCharge; } public WeaponType GetWeaponType() { return weaponType; } } |
インスペクタで銃の能力を変更出来るように宣言しておきます。
それぞれのパラメータはメソッドで取得出来るようにし、銃の能力を取得したい時はメソッドを介して値を取得し利用するようにします。
例えば銃を撃った時に敵との距離が銃の射程距離内であるかどうか?や
敵に弾が当たった時に銃の攻撃力を取得し敵に与えるダメージを計算する時に銃の能力のパラメータを返すメソッドを呼び出しその値を使うようにします。
これで銃の能力を設定するスクリプトが完成しました。
FPSを作ってみようカテゴリ記事の終了
さて突然ですが今回の記事を持ってFPSを作ってみようカテゴリの記事は終了となります。
今までありがとうございました。
と言ってみたかったりして・・・・(-.-)ボソッ
悪い冗談ですねまったく(`Д´) ムキー!
あまりにFPSカテゴリ記事のアクセスがない為にちょっと言ってみたかっただけです。
FPSカテゴリ記事にあてはまらず独自ドメイン以降の記事が軒並みなんですけどね(^_^;)
次回は銃を撃って敵に当たったかどうかの機能を作成するのでその時に今回のスクリプトを使用する事になります。
今回の記事はちょっとした休憩記事ですね・・・( ´△`)y-~~
今回のような修正は自分だけでゲーム作ってる場合は勝手に直せばいいんですが、ブログの記事で連続した内容を記述している場合は大変です・・・(^_^;)
前にずっとその内容で書いてきた記事も修正しなくてはならなくなりますからね。
しかし、今回の修正はあくまで銃を撃つ反応を早くするというカスタマイズなので前の記事は修正しません!
なんだかんだ(叫んだって♪)
言ってもただ面倒くさいだけですね・・・・(-_-)/~~~ピシー!ピシー!
久しぶりのFPSカテゴリの記事ですが、次回はいつになるやら・・・。
また、しばらくお待ちくださいm(__)m