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

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

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

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

Unity

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

Q&A

解決済

1回答

194閲覧

2D格闘ゲームの押し合い判定機能を動作するようにしたい

saisaisan

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2024/03/23 16:58

実現したいこと

  • 2D格闘ゲームの押し合い判定機能を動作するようにしたい

前提

Unity2Dで格闘ゲームを製作しています。
以下、ストゼミ7時間目にあるような、押し合い判定を実現したいと思っています。
https://game.capcom.com/cfn/sfv/column-130393.html
「押し当たりは四角で作られてますが、ジャンプで相手の押し合い上に乗っかったりはできず、
押し出されて必ずどちらかに落ちる様に設定されてます。」

横から押すことに関しては特に問題ないかと思うのですが、上から乗る際の挙動に悩んでいます。

発生している問題・エラーメッセージ

BoxCollision2Dの上から接触した場合、次のフレームからX座標はBoxCollision2Dの外にぴったり押し出され、
Y座標の移動速度はそのままで落ちる、というようにしたいのですが、
接触点からちょうど外に押し出す距離を測る方法が分かっていません。

該当のソースコード

C#

1 private void OnTriggerEnter2D(Collider2D collision) 2 { 3 if (collision.CompareTag("Enemy")) //敵に当たった時 4 { 5 if (isRight) //右向いていたら 6 { 7 transform.position = new Vector2(transform.position.x - 1f , transform.position.y); 8 } 9 else if (!isRight) //左向いていたら 10 { 11 transform.position = new Vector2(transform.position.x + 1f, transform.position.y); 12 } 13 } 14 }

試したこと

(BoxCollider2D Col)で取得し、
Transform trs = Col.transform;
Vector2 sc = trs.lossyScale;
などでBoxCollision2Dの座標を確認できるかと思いましたがあまり理解できませんでした。

補足情報(FW/ツールのバージョンなど)

Unity2022.3.10f1 <DX11>

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

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

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

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

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

JunSuzukiJapan

2024/03/26 01:27 編集

1フレームで押し出すのは早すぎる気がするんですが、そんなものなのでしょうか?(私が格ゲーに詳しくないだけかも??) 1フレームで押し出す必要がないのでしたら、OnTriggerEnter2Dで押し出し中のフラグを立てて、OnTriggerExit2Dでフラグをクリア。フラグが立っている間はUpdateあるいはFixedUpdate内で徐々にx座標を移動させる手はあると思います。 (もしかすると、OnTriggerExit2Dではなく、地面に着地したときにフラグをクリアでも良いかも?)
saisaisan

2024/03/26 04:02 編集

コメントありがとうございます。ご教示いただいた手法で実装が出来ました。 ベストアンサーとさせていただきたいので同じ内容を回答欄に投稿いただけますでしょうか。 >1フレームで押し出す 質問を書く際にヴァンパイアセイヴァーというゲームをコマ送りして判定を見ながら考えていたのですが、そちらでは「押し合い判定が全く重ならない」「乗る側が1Fで横に全身がぴったり押し出される」「乗られる側は動かない」という仕様になっておりました。 ですが、その後に他のゲームを見ていたところ、「押し合い判定が重なりながら数Fかけて押し出される」「乗る側、乗られる側共に反発して動く」など様々でしたので、コメントいただいた手法を基にゲーム性に合ったものを考えてみようと思います。
JunSuzukiJapan

2024/03/26 04:31

解決できたようでなによりです。 回答欄にコピペしました。
guest

回答1

0

ベストアンサー

1フレームで押し出す必要がないのでしたら、OnTriggerEnter2Dで押し出し中のフラグを立てて、OnTriggerExit2Dでフラグをクリア。フラグが立っている間はUpdateあるいはFixedUpdate内で徐々にx座標を移動させる手はあると思います。
(もしかすると、OnTriggerExit2Dではなく、地面に着地したときにフラグをクリアでも良いかも?)

投稿2024/03/26 04:30

JunSuzukiJapan

総合スコア310

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問