【Unity2d】攻撃判定の付け方
こんにちは。なおキーヌです。
ブログ毎日更新は345日目になります。
攻撃アニメーションの実装が出来たので次はハンマーも一緒に動かして、
そのハンマーに衝突判定を付けていきましょう。
武器の判定は掴む壁と同じでレイヤーやタグで条件分岐をすればOKです。
武器アニメーションの再実装
前回は攻撃アニメーションを再実装したけどハンマーが動いていない状態でした。
オブジェクトと取得してアニメーションを切り替えてあげないといけませんね。
動かせる壁は掴んだときの判定で操作することが出来ましたが、
ハンマーは特に何も繋がってません。
とはいってもスクリプトを付ける程ではないですので、
プレイヤー側でオブジェクトを取得してアニメーターを弄るといった方がシンプルでよさそうです。
早速ハンマーオブジェクトのアニメーターを取得してみましょう。
実行する前にタグに「Weapon」を追加してハンマーオブジェクトに適用します。
基本的にはアニメーションを変更するだけなのでコードを書く場所はState_Playerで良いかと思われます。
// プレイヤーアニメーションコンポーネント
private Animator _animator;
private Animator _hammer;
protected override void Start() {
// コントローラープレイヤースクリプトの取得
_cm = GameObject.FindGameObjectsWithTag("Controller_Manager")[0].GetComponent<Controller_Player>();
// アニメーターを取得
_animator = GameObject.FindGameObjectsWithTag("Player")[0].GetComponent<Animator>();
_hammer = GameObject.FindGameObjectsWithTag("Weapon")[0].GetComponent<Animator>();
}
これで武器のアニメーターを取得できました。
後はプレイヤーが攻撃した時に一緒にアニメーションをチェンジすればよさそうです。
アニメーション遷移用の変数はプレイヤーと同じにしておけば流用出来て楽そうです。
// アニメーション変数設定
protected void setNowAnim(Animator animator, Animator weapon) {
// 省略
// アニメーションの設定
animator.SetInteger("AnimIdx",_nowAnim);
weapon.SetInteger("AnimIdx",_nowAnim);
// 省略
}
関数の引数を増やして同じようにアニメーションを設定してやります。
protected override void Update() {
// 十字キーが一つでも格納されてたら稼働
if (_cm.PushedArrowKeyList.Count > 0) { setDirection(_cm.PushedArrowKeyList); }
// ステートをセットする
setState(_cm.PushedKeyList,_cm.PushedArrowKeyList);
// 向きとステートを元にアニメーションを設定
setNowAnim(_animator, _hammer);
// 移動タイプ変更
setMoveType();
}
プレイヤーのアニメーターと武器のアニメーターを渡せばOKですね。
これで武器を振ることができるようになりました。
後はこの先端に衝突判定が付けば完璧です。
ハンマーに衝突判定を付ける
現状ハンマーは振っていますが判定を付けていません。
このままシンプルにBoxCollider2Dを付けてみましょう。
……意外と良い感じかもしれません。
少し座標はずらしましたが、アニメーションで良い感じに先端に追尾してくれています。
問題が生じるまで一旦これで行きましょう。
衝突判定をどう扱うか
このまま衝突判定のある物体にハンマーを当てると衝突判定が行われます。
物理演算を使っても良いですが、極力2Dゲームでは物理演算を使わないでいきます。
というのもプログラミング上予測できないものが多くなると作る難易度があがってしまうからです。
物理が得意な人でなおかつUnityの物理演算に詳しい人であれば計算してやることはできそうですが、
私みたいに頭がよくない人間には少々荷が重いです。
攻撃の衝突判定はスクリプトで行う
Collider系のプロパティにある「isTrigger」という項目があるのを何度か見ていると思います。
チェックを入れると物理演算的な仕組みが無視されます。
物理的な効果がなくなるだけで衝突判定自体いきているので「OnTriggerEnter2D」関数を使って扱うことが出来ます。
次回は判定に入ったら何かを行うという処理を作ります。
少しネタバレすると、判定にあたった瞬間当てられた側に加速度を与えノックバックしている状態を作ります。
それでは!