質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

3344閲覧

Unity2Dで攻撃のヒットボックスの作り方がわからない

hangesho_32

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

2クリップ

投稿2018/07/19 03:29

Unityで2D格闘ゲームを作りたいと思っています。(Live2Dモデルのアニメーション使用)
様々なサイト様を参考にさせてもらいましたが、当たり判定のヒットボックスを出現させる行程がわかりません。

・Animationにイベントを追加して、呼び出す…とまでは検討はついているのですが、スクリプトの方をどう書いていけばいいのか…。

Instantiateでヒットボックスを呼び出してDestroyするやり方しか思いつかなくて、困っています。(負荷がかかります)
Colliderを子オブジェクトにつけてON、OFFすればいいのでしょうか…?
その具体的なやり方も、Colliderの位置を指定して出現させるやり方もわかりません。

・パンチモーションがあったとします。
自キャラの目の前、拳の位置に攻撃モーションのヒットボックスを一時的に置きたいです。
Animationでいうと、パンチを出すのは0f目~60f目だとして、その攻撃判定を30f~60fに指定して、当たり判定を1回だけ取る。というようなことが理想です。
他にも連続攻撃等も想定しているので、その辺りには回数制限のカウンターのための関数でも用意しようかと思っています。

・Collider同士で接触判定を取る場合、「Pubic Void OnCollisionEnter2D(Collision2D collision)~」のvoidしか知りません。
この関数の場合、Animationのイベントとして呼び出すことが出来ません…。
void 〇〇(){~~~~}の中にどうすれば当たり判定を取るスクリプトが書けますか?
tagで相手の当たり判定Colliderを判別させるものを構想しています。

ヒットボックスを出現させた上でその中の当たり判定を取るスクリプトがつくりたいです。

myta👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Live2Dの場合、Animationが通常のUnityのAnimationでいいのか分かりませんが、考え方の方針だけ。
「AnimationはColliderの位置変更とオンオフだけする」「Colliderの衝突はUnityのシステムに任せる」という方向です。

  1. 空のオブジェクトを作成し、そこにColliderを付けておきます。
  2. 1のオブジェクトに当たり判定用スクリプトを付けます。
  3. Animationの付いたオブジェクトにCollider操作用スクリプトを付けます。
  4. AnimationEventなどでCollider操作用スクリプトを呼び出します。

C#

1//当たり判定用 2public class HitController : MonoBehaviour 3{ 4 pubic Void OnCollisionEnter2D(Collision2D collision) 5 { 6 //衝突した時の処理 7 } 8} 9 10//Collider操作用 11public class ColliderController : MonoBehaviour 12{ 13 public Collider collider; //1で作成したColliderをインスペクタから入れておく。 14 15 void Start () 16 { 17 //最初はColliderをオフにしておく 18 collider.enabled = false; 19 } 20 21 //AnimationEventなどから呼ぶ 22 public void PunchOn() 23 { 24 //例えばColliderの位置を変える 25 collider.transform.position = new Vector3(移動先の座標); 26 //Colliderオン 27 collider.enabled = true; 28 } 29 30 //AnimationEventなどから呼ぶ 31 public void PunchOff() 32 { 33 //Colliderオフ 34 collider.enabled = true; 35 } 36}

参考:アニメーションイベントの使用 - Unity マニュアル

投稿2018/07/20 00:00

sakura_hana

総合スコア11427

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自分もUnityで格ゲーつくってるんですが、以下のような感じでやってます

大パン

  • 技ごとの必要な当たり判定・喰らい判定のCollider2Dは予めキャラのプレハブ内に非アクティブの状態で用意しておく。
  • AnimationClipでそれらのGameObjectをON/OFFする。

一部の判定(壁押し判定・キャラ押し判定)はアニメーションで大きさ・位置を変更して違う動作用に実体を使いまわしています

  • AnimationEventはSEの再生やその他特殊な処理(5フレーム目からキャンセル許可フラグを立てる、など)に使用(当たり判定には関与しない)

上図では見切れて全部で何個あるのかわかりませんが、LPHitBox(弱パンチの攻撃判定)、LPHurtBox(弱パンチ中のくらい判定)というように動作ごとに別々のGameObjectがずらずらと30~40個ほど並んでます。スマートでない、と感じるかもしれませんが質問者さんがおっしゃる通り当たり判定のInstantiate/Destroyを繰り返すのは賢明ではなく、技ごとに細かく調整したいというゲーム上の都合もあり、これが一番マシ、というのが私の結論です。

攻撃判定のGameObject

  • 攻撃があたったとき、食らったときの処理は、当たり判定・喰らい判定用の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よりも良い方法が出てくると思います。

投稿2018/07/21 04:15

編集2018/07/21 04:21
SAM-tak

総合スコア199

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問