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

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

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

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

Unity

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

Q&A

解決済

1回答

4111閲覧

unity 2Dアクション 攻撃時に敵が吹き飛ぶようにしたい

da-ryo

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2020/10/22 05:27

編集2020/10/23 06:13

#詰まっている状況
現在unityで横スクロールの2Dアクションゲームを作っているのですがプレイヤーが攻撃した際に敵が遠くに飛んでいく処理がうまくいきません。
というよりも重力を減らしたりパワーをけた違いに大きくしても敵が微動だにしない状態です。
ただ、プレイヤー攻撃時に敵がダメージを受けるアニメーション(敵にアタッチしているダメージ時のアニメーション)はうまく再生されるのですがコライダーにあたった侵入物に力を加えるコードは反応しません。

攻撃の判定に関しするスクリプトはユーチューブの動画(https://www.youtube.com/watch?v=dd48ehSfU0M&list=PLEkX-p0oUs8zAlpacJ4xs1rA830iaiXvE&index=3)で紹介されているやり方をそのまま引用しております。

#試したこと
①AddForceで敵(tagをつけて判別)に力を加えるスクリプトをプレイヤーの攻撃時に設定する。

② OnTriggerEnter2D(Collider2D other)内でプレイヤーをtagで判別した後、自分に力を加えるスクリプトを敵にアタッチする。

一応このような形で挑んだのですがうまくいきません。どなたか教えていただけると幸いですのでよろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

基本的にRigidbodyに対してAddForceするだけで動かせるはずです。
まずは適当なオブジェクトを動かせるかをチェックしてみてはどうでしょうか?
https://docs.unity3d.com/ja/current/ScriptReference/Rigidbody.AddForce.html

コードがないのでわからないのですが
ジャンプや大きくふっとばすような処理は ForceMode.Impulseを設定すると思います。確認してみてください。

C#

1rb.AddForce(0, 0, thrust, ForceMode.Impulse);

気になる所は
・ForceModeの確認
・力の大きさ(小さすぎて動いてるのに気づかない)
・Rigidbodyがちゃんとコンポーネントが追加されているか?
・Rigidbody.isKinematic がオンになっていないか?

投稿2020/10/25 04:20

newBee

総合スコア82

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

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

da-ryo

2020/10/25 07:38

回答ありがとうございます。 いただいたスクリプトでやってみたのですが「引数4を指定するメソッド "AddForce" のオーバーロードはありません」となってしまったため下記のスクリプトに変更して実行してみましたがやはり反応ありません。確認用に設定しているDebug.Log"Attack!"はしっかりと表示されるのですが。。 void Update() { Debug.Log("Attack!"); this.gameObject.SetActive(false); } void OnTriggerStay2D(Collider2D other) { if (other.gameObject.CompareTag("enemy")) { Rigidbody2D enemyRb = other.gameObject.GetComponent<Rigidbody2D>(); enemyRb.AddForce(transform.up * thrust, ForceMode2D.Impulse); } } 気になるところについてですが ・ForceMode → impulseです ・力の大きさ → 数字を極端に大きく(10000)しても反応がないためその点は大丈夫そうです。 ・Rigidbodyがついているか → 吹っ飛ぶ相手(敵)にはRigidbodyをつけております。確認のため攻撃時の当たり判定を行う(敵を吹き飛ばす)オブジェクトにもつけてみましたが反応ないです。 ・IsKinematicがオンになっていないか → Dynamicになっているので大丈夫だと思います。 このような状況でも機能しないので自分なりに考えてみたのですが、今回の攻撃判定はマウスをクリックしたときにプレイヤーの目の前に当たり判定のオブジェクトが一時的に出現し、攻撃終了後に消えるというものなので以下の可能性を追求しようと思っております。 ①オブジェクトが出てきてから消えるまでのスピードが速すぎて吹き飛ぶ処理が可視化できていない ②当たり判定のオブジェクトがスタート地点にとどまったままで移動していない。 ②に関してはプレイヤーの子オブジェクトに当たり判定オブジェクトを入れているのでっ大丈夫だと思うのですがもう少し確認してみます。
newBee

2020/10/25 13:26 編集

攻撃範囲のオブジェクトを生成してそれに接触した敵に力を加えたいのですね。 上のコードをみるとUpdateとOnTriggerStay2Dのタイミングですね enemyRb.AddForce(transform.up * thrust, ForceMode2D.Impulse); この下にオブジェクトを非表示にするコードを記述すればいけそうです。 ただ、this.gameObject.SetActive(false);もちゃんと実行できているか確認してみてください。(自身をスクリプトからSetActive(false)可能かどうかうる覚えですが) 実装するときに機能をひとつずつ確認しながらやると問題が起こったときにバグの箇所が理解しやすいです。 1、攻撃判定オブジェクトの生成 2、接触した相手が敵の場合、何か実行させる発生させる(Degub.logなどで確認) 3、相手をふっとばすメソッドを単体で作成して試す 4、3を2に組み込む 5、一定時間後に攻撃判定オブジェクトを非表示、無効にする 上記の手順で1つずつどこが問題なのかをチェックして試してみてください。 それでまた問題があったら、その箇所を新たな質問として(この質問はクローズして)投稿してみてはいかがでしょうか。
da-ryo

2020/10/26 07:54

教えていただいた通り一つ一つ確認していくとうまく実行できました! 初めての制作でプログラミングにも触り始めたばかりなので後半のアドバイスはとてもタメになります。 また、引き続き作成していく過程で起こった問題を切り分けて建設的にアプローチした後、質問させていただきます。 ひとまず今回の課題解決にあたってくださった皆様ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問