Unityで装備している武器をキー操作で切り替えられるようにする機能

前回までで、敵キャラ、主人公の双方の攻撃とダメージの機能が出来ました。

Unityで敵キャラが主人公に近づいた時に攻撃をしてくる機能
Unityで主人公が敵に近づいた時に敵が主人公を攻撃してくる機能を作成します
Unityで主人公キャラが敵を攻撃出来るようにする機能
Unityで主人公キャラが剣を振って敵キャラを攻撃出来るようにする機能を作成します

主人公キャラの武器はひとつで固定となっていますが、これを特定のキーを押したら武器を切り替えられるようにしてみます。

初期設定として懐中電灯を持つようにし、キーの1を押すと次の武器の剣に切り替えます。
さらにキーを押すと次の武器または持ち物に変更します。

今回はキーの1を押すごとに順番に武器を切り替える仕様にしています。

装備する武器が増えると面倒になるのが難点ですね、武器が持てる数を制限したり、ちょっと仕様を変えるだけでも使えるようになると思います。

今回はとりあえず武器の切り替えを出来るという最低限の機能を追加します。

スポンサーリンク

武器をキャラクターに持たせる

Equip空オブジェクトの子要素に武器を移動

今まで懐中電灯や剣を右手の子要素として設置していましたが、右手の子要素にEquipという空のオブジェクトを作り、そこに合うように懐中電灯、剣の位置、角度を合わせて配置します。

武器の合わせ方は

Unityでキャラクターに正確に武器を持たせる
Unityでキャラクターの手の位置に正確に武器を持たせるように調整します。なんとなく持たせる位置を設定していた人には朗報かも!?
を参考にしてください。

空オブジェクトEquipは右手の子要素に配置

Equipは上のような感じで配置します。

キャラクターは物を持っているようにアニメーションさせていないので、だいたいの位置で合わせます。

物を持って歩いているアニメーションであればさらにわかりやすいと思います。
手等の一部を部分的にアニメーションさせたい場合は

Unityのレイヤー、アバターマスクを使って体の一部分を別のアニメーションにする
体の一部分だけのアニメーションを変更したい場合はAnimatorControllerのレイヤーとアバターマスクを使う事で実現出来ます。
の記事を参考にしてください。

武器切り替えスクリプトChangeEquipを取りつける

Equipには新しいスクリプトChangeEquipを追加します。publicの値は後で設定します。
Equipは装備を配置する目印なのでMeshとコライダは無効にしておきます。
(間違って3DオブジェクトのCubeでやってしまったのでこうなっています)

ただの空オブジェクトを作成し位置を合わせるだけでOKです。その際Scaleの値は必ず1にしておいてください。

子のTransform(位置情報)は親の位置やScaleの相対値になっていく為、Equipの子要素にも影響が出てしまう為です。

武器を切り替えるスクリプトChageEquip

propertyは持ち物をインスペクタで設定します。

equipは今装備しているオブジェクトが何番目かを入れておく変数processは親が持っているスクリプトProcessMyAttackを入れる変数です。

武器を切り替えた時に当たり判定のコライダの切り替えが必要になる為です。
moveは主人公が今どの状態かを得るために取得します。

transform.rootで一番親を指すので、そこに設定しているProcessMyAttackを取得します。

propertyに設定されているオブジェクトを一旦すべて無効にし、その後装備品を一番最初に設定した懐中電灯にし(equip = 0)そのゲームオブジェクトを有効にします。

キーの1が押された時に主人公の状態がState.waitかState.walkの時に
今装備している武器を無効にし、equipを1足して次のオブジェクトを指すようにし、有効にします。

equipが設定したpropertyの数を超えた時は最初の武器を指すようにしておきます。
今切り替えた武器のコライダを取得し、ProcessMyAttackのSetColliderを呼び出し、コライダの再設定をします。

ProcessMyAttackには上のようにSetColliderを追加します。
ただ単にコライダを切り替えているだけです。

capColは元々CapsuleColliderで宣言していましたが、宣言部分でColliderに変更しておきます。

武器によってはCapsuleColliderではなくBoxCollider等を使う場合を考えてこうしておきます。
いわゆる多態性というやつでコライダは色々あるけどみんなコライダだという扱いをします。
太郎や花子など色々な人はいるけれどみんな人間という種族として取り扱うという事、

つまり、お前の物は俺の物、俺の物は俺の物というジャイアン的発想です(全然違う・・・)

これで二つの武器(というかひとつは懐中電灯ですが・・・)の切り替えが出来るようになりました。

スクリプトで武器をインスタンス化し装備させる方法もある

最初から武器を設定し非アクティブにしておくのではなく、プレハブのインスタンス化をしてEquipの場所に表示するという方法もあります。

これならばヒエラルキー上に武器が何十個も表示される事がなく、スクリプト上でインスタンス化し配置する事が出来ます。

ただし、武器のサイズや角度などの設定によっては変な感じに表示されてしまいます。
以下がスクリプトで武器を生成するサンプルです。

Rotateでxに270と設定しているのは元々のプレハブの角度の影響で指定しています。

つまりプレハブによって角度が変わってしまうので、生成する武器の角度をすべて同じにしておく必要があります。
そうすればスクリプトから武器を生成するのも問題がなくなると思います。

またこのスクリプトだとpublicのパラメータpropertyに指定した武器全部のインスタンスを作成してしまいますが、キー1が押された時に指定のオブジェクトをインスタンス化&元の武器のインスタンスの削除をすればいいと思います。

上記のようにスクリプトで制御出来ます。

しかし、Rotateの角度指定がやっぱり気になります・・・・、この処理を削除してうまくやりたいんですが・・・。
あらかじめ装備させる武器で位置と角度を調べておき、その設定値を使うのがベストなんですかね

これで武器の切り替えが終了しました。
次回は敵に当たったエフェクトを設定してみます。