回答編集履歴

1 AnimationEventの使い所を追加

SAM-tak

SAM-tak score 195

2018/07/21 13:21  投稿

自分もUnityで格ゲーつくってるんですが、以下のような感じでやってます
![大パン](673f9a16367a80b08f60450e97155749.jpeg)
* 技ごとの必要な当たり判定・喰らい判定のCollider2Dは予めキャラのプレハブ内に非アクティブの状態で用意しておく。
* AnimationClipでそれらのGameObjectをON/OFFする。
一部の判定(壁押し判定・キャラ押し判定)はアニメーションで大きさ・位置を変更して違う動作用に実体を使いまわしています
* AnimationEventはSEの再生やその他特殊な処理(5フレーム目からキャンセル許可フラグを立てる、など)に使用(当たり判定には関与しない)  
上図では見切れて全部で何個あるのかわかりませんが、LPHitBox(弱パンチの攻撃判定)、LPHurtBox(弱パンチ中のくらい判定)というように動作ごとに別々のGameObjectがずらずらと30~40個ほど並んでます。スマートでない、と感じるかもしれませんが質問者さんがおっしゃる通り当たり判定のInstantiate/Destroyを繰り返すのは賢明ではなく、技ごとに細かく調整したいというゲーム上の都合もあり、**これが一番マシ**、というのが私の結論です。
![攻撃判定のGameObject](b397514bb194d6c3d95d680478eec2b8.jpeg)
* 攻撃があたったとき、食らったときの処理は、当たり判定・喰らい判定用のCollider2DがついているGameObjectにそれ用のスクリプトを貼り付ける。上図のは攻撃判定のもので(DamageDealer.csと命名しました)、こいつにダメージ、ヒット硬直、ガード硬直、ヒットエフェクトの種類、などなどを設定できるようにしました。
自分の場合は思うところがあってOnCollisionEnter2DなどUnityの衝突判定機構を使用せず、自前の矩形当たり判定で処理するようにしたのですが、おそらくそんなことをしなくても、この当たり判定に貼り付けるスクリプトにOnCollisionEnter2D/OnCollisionExit2Dの定義があれば、AnimationClipの指定でActiveになった結果他のCollider2Dと接触したなら、そのOnCollisionEnter2Dが呼び出され、接触しなくなったりAnimationClipから非ActiveになったならOnCollisionExit2Dが呼び出される、となると思います。
質問者さんはOnCollisionEnter2Dに関しておそらく勘違いされているようで、これは接触したときにこちらから呼ぶものではなく、接触したときに「**Unityの側から勝手に呼ばれる**」ものです。tagなどで検索しなくとも、```void OnCollisionEnter2D(Collider2D collider)```の引数colliderで渡されてくるものがぶつかった**相手**で、もう一方のぶつかられた方は、というと、このOnCollisionEnter2Dを持ったMonoBehaviourスクリプトを貼り付けてあるGameObjectが持っているCollider2D、です。
飛び道具に関しては別のやり方をしていますが、それもやはりAnimationClipで弾発生スクリプトを貼り付けてあるGameObjectを1フレだけONにする、というやり方で基本は一緒です。
弾の発射、ヒットエフェクトの発生に関してはとりあえずプレハブをInstantiate/Destroyで良いのではないでしょうか。"GameObject プール"などで検索すると一々Instantiate/Destroyよりも良い方法が出てくると思います。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る