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

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

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

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

Unity

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

Q&A

解決済

1回答

1906閲覧

Unity:キャラが速く走っても、投げたものが一定間隔で前に落ちるようにしたいです

futon-fukafuka

総合スコア9

C#

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

Unity

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

0グッド

0クリップ

投稿2020/06/12 04:59

編集2020/06/12 06:28

発生している問題

放物線上に物を投げるアクションゲームを作っていますが(横スクロール型)、
キャラクターが速く走るほど、飛距離が相対的に縮む格好になり、
最終的には背後に落ちるようになってしまいます。
マリオのファイアボールのように、ダッシュしてもキャラと一定間隔を保って飛ぶ、ということを実現したいと思っています。

単純に歩行速度を落としたり投げるスピードを上げれば、違和感はある程度なくなるかも知れませんが、
たとえばマリオ3でハンマーを投げるときのように、ゆっくりとした放物線を描く場合はどうしても違和感が残ってしまいます(マリオの場合、早く走ってもマリオとハンマーの着地点が縮まらない)。
根本的に、キャラとの相対距離を保つ方法はありますでしょうか?

該当のソースコード

//石(rock)を複製
GameObject rocks = Instantiate(rock) as GameObject;

//力(handforce)を加える
rocks.GetComponent<Rigidbody>().AddForce(handforce);

//位置をhandに調整
rocks.transform.position = hand.position;

試したこと

①投げた物をキャラにペアレント化(transform.SetParent)
⇒投げた物がずっとキャラに追従してしまい、不自然になってしまいました

②キャラのvelocityを、投げる物に加える(Vector3)
⇒キャラのvelocity(Rigidbody内)が0のままのせいか、上手くいかず

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

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

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

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

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

hogefugapiyo

2020/06/12 05:45

追いつくこと自体が駄目って認識であってますか? (たとえば、投げた石とプレイヤーキャラはぶつからないようにするアプローチとかも考えられるのかなと)
Y0241-N

2020/06/12 05:48

結局何をどうしたいんでしょうか? 速度を落とすのもダメ、投げ物のスピードを上げるのもダメで走ると投げ物に追いつきます、追いつかないようにしたいですだと、他にどうしようもないかと思いますが...
futon-fukafuka

2020/06/12 06:02

>hogefugapiyoさん 追い付くことが駄目ということです。言い換えると、「飛距離が縮んだようになることを避けたい」ということです。たとえば、マリオがファイアボールやハンマーを投げるとき、たとえ走っていても飛距離が縮んだようには感じませんよね? 走った分、ハンマー等もプラスで前に進むので…。 >Y0241-Nさん ↑の説明のように、キャラが走っていても、投げた物との相対的な距離を保ってほしいということです。別の例で言うと、高橋名人がダッシュしても、石オノが落ちる距離は常にキャラと一定間隔を保たれるという感じで…。
futon-fukafuka

2020/06/12 06:21

問題点を分かりやすくするため、質問の文面を修正しました。
Y0241-N

2020/06/12 07:48

要は現状は「走りながらの状態で投げる場合と歩き状態(もしくは停止)の時に投げる速度が同じで走っている時に投げると投擲物を追い越す」で、 「走っている状態で投げても投擲物を追い越すことはない」という風にしたいという事でしょうか。 であれば、投擲物に対して「現在の移動速度(キャラのrigidbody.velocityで取得)」を掛ければいいんじゃないでしょうか。
ikadzuchi

2020/06/12 14:58

> マリオがファイアボールやハンマーを投げるとき、たとえ走っていても飛距離が縮んだようには感じませんよね? どのマリオでしょうか。とりあえず確認できたマリオ3とワールドでは走るとファイアボールを追い抜くか追いつきます。 また高橋名人の冒険島でもそのへんの動画を見るに斧の軌道は速度によらず一定(走ると落下点との距離が縮まる)のようです。 既存のゲームの挙動を正しく認識していないとなると求める仕様も本当に望ましい挙動なのか疑わしいです。
guest

回答1

0

ベストアンサー

やりたいことを素直に実装するとすれば、毎フレームごとに
・物体にキャラクターの移動距離を加算する(マイナスの場合は無視)
・物体とキャラクターの距離を閾値以下にならないように調整

というようなコードを入れれば良いと思います。
https://docs.unity3d.com/ja/current/ScriptReference/Vector3.Distance.html

しかし(質問・回答にもありますが)上記の方法では「違和感」がある動作になることが予想されます。
ですので

②キャラのvelocityを、投げる物に加える(Vector3)
⇒キャラのvelocity(Rigidbody内)が0のままのせいか、上手くいかず

すでに試されて「うまくいかず」という結論になっていますが、ここをもう少し踏ん張って解決された方が良いかと思います。
https://docs.unity3d.com/ja/current/ScriptReference/Rigidbody.AddForce.html
https://www.sejuku.net/blog/55084
https://qiita.com/Teach/items/9264627236e98fb566a6

なおキャラクターがトップスピードの状態で投げれば追いつくことはできませんが、
キャラクターの速度が0の状態で投げてそのあとダッシュで追い抜こうとすると、キャラクターの加速度によっては追い越してしまうこともあります(ある意味それが「自然」と思われますが、、)
その場合はキャラクターの「加速度」を調整するか、「トップスピード」を物体と同じ(もしくはそれ以下)にすることで追い越すことはないかと思います。

投稿2020/06/12 15:15

Kapustin

総合スコア1186

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

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

futon-fukafuka

2020/06/13 02:14

ご丁寧にありがとうございます! Velocityを加える方法でもう少し粘ってみようと思います。 リンク先も参考にさせていただきます。 キャラの加速度によって物体を追い抜くのは、おっしゃるように自然なことでもあるので、 そこは数値の微調整で対応しようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問