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

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

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

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

Unity

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

Q&A

解決済

3回答

2166閲覧

Unity:ボールの移動範囲を状況に応じて自動で変更する

Midget2

総合スコア34

C#

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

Unity

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

0グッド

0クリップ

投稿2018/10/24 05:31

編集2018/10/24 05:34

前提・実現したいこと

Unityの2Dで開発しております。

四角や円の箱が複数あります。
それらの箱の中に,球が複数,自由に転がっています。
ボールが箱の内壁に当たると,その衝撃で箱は少し動きます。
箱は,ドラッグして移動することができます。
ここまではできました。

本題です。
箱をドラッグして,箱同士を接触させたとき,その接触した付近で,ボールが箱を行き来できるようにしたいのです。
画像を見ていただけると幸いです。
また,複数の箱の接触も検討しています。
イメージ説明

ここから何をつかって,どのようなコードを書けばうまくいくかわかららず苦戦しております。
何卒ご教授ください。
よろしくお願いします。

試したこと

3DオブジェクトのCubeなどを組み合わせて箱を作った。
ボールと箱にリジットボディをコンポーネントして,壁に球が衝突しても箱から出ないようにした。
NavMeshなどを使ったらできるのかなぁと思ってみたが,よくわからなかった。

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

windows10
unity2018 C#にて開発

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

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

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

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

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

guest

回答3

0

ベストアンサー

投稿2018/10/24 07:33

sakura_hana

総合スコア11427

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

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

Midget2

2018/10/24 07:41

おぉ!何やら良い感じですね。 動画を見る限りでは,箱の外壁同士がすり抜けてしまうようになっていますが,外壁同士の衝突も実装できそうでしょうか?
sakura_hana

2018/10/24 11:12

試したこと無いので推測になりますが…… 外壁用オブジェクトを作成→そこにColliderを付与→Layer設定で外壁用同士だけが衝突する(CompositeColliderには影響しない)ように設定→実際の箱の見た目とCompositeColliderは外壁用オブジェクトの子にする とかで出来るかもしれません。
Midget2

2018/10/26 11:36

ありがとうございます。 外壁を実装するには至っておりませんが,自動でコライダーを変更することができております。 CompositeColliderを使うことで,諸問題が2つほど出ております。 ①ボックスコライダーではうまくまわりに壁(コライダー)を作ることができますが,サークルコライダーでは壁ができず,円の形のコライダーのままをいう問題。 ②複合のコライダーでは,その子にSquareなどにコライダーをつけて入れ込む形になりますが,入れた子たちに2Dリジットボディーをコンポートすると,複合のコライダーとして機能しなくなります。箱自体に2Dリジットボディーがないため,箱の中で球が内壁にあたった場合,箱は個別に動作せず,2つの箱が一体となって動いてしまいます。 ①についてはできないのではないかという見解ですがいかがでしょう? ②についての回避方法も検討していますが,思いつかず,行き詰ってしまいました…。
sakura_hana

2018/10/29 01:33

ベストアンサー付いてますが一応。 ①についてはUnityの仕様だと思います。多角形が作れれば代用出来そうですが無理なら無理かも。 ②親子関係で無理ならば、 外箱オブジェクトとCompositeColliderオブジェクト完全に別物にする。スクリプトで「CompositeColliderオブジェクトは外箱オブジェクトと同位置にする」ようにする。Layer指定で外箱同士、CompositeCollider同士のみで衝突するように設定。 とかでしょうか。 まぁ負荷が高そうなので、「CompositeColliderの衝突検知→どっち方向にぶつかったか取得→その方向には動かせないようにする」が可能ならそっちの方がいいかもしれません。
Midget2

2018/11/03 07:09

回答ありがとうございます。まだ,解決できず,悩んでおります。 ②については,同じことを考えました。外箱オブジェクトとCompositeColliderオブジェクトをスクリプトで同位置にする方法です。場合分けして考えると,(※ABともに外箱オブジェクト同士の衝突は常にON)  A.外箱オブジェクトと外箱オブジェクトが接触していないとき   外箱オブジェクトとボールの衝突をON。CompositeColliderオブジェクトとボールの衝突をOFF。内壁にボールが当たる→箱が動く。いい感じです。  B.外箱オブジェクトと外箱オブジェクトが接触しているとき   外箱オブジェクトとボールの衝突をOFF。CompositeColliderオブジェクトとボールの衝突をON。接触面でのボールの移動が可能。ここまでは,いい感じです。しかし,そこで問題が起きます。 Bのとき,CompositeColliderオブジェクトとの衝突をONにしているので,当然,ボールはCompositeColliderオブジェクトのリジットボディとの衝突となり,見た目は2つの外箱オブジェクトが,一体となって運動することになります。箱自体の物理的挙動は,独立させたいので,これでは思っていた動きと違います…。 根本として,CompositeColliderを使ってみると,無理なのではないかと,行き詰ってしまいました。一週間こればかり考えていますが,打開策がいまだに見つかりません。
sakura_hana

2018/11/05 01:58

ボールの衝突は常にCompositeColliderとON、外箱とOFFでいいと思います。 「外箱はユーザー入力による移動と外箱同士の衝突に徹する(CompositeColliderやボールには干渉しない)」 「CompositeColliderは自分の外箱の位置をトレースし続ける(その他の物理的挙動はしない)」 「ボールは常にCompositeColliderにだけ影響を受ける」 これで上手くいかないのならCompositeColliderでも無理かもですねー。
guest

0

壁はある程度細かい複数のオブジェクトにしておいて、ボールが壁に当たった時に、当たった先の壁が別のグループの壁と接触していたらボールをワープさせるなり、通過できるようにボールとの当たり判定をなくせばよいのでは?

投稿2018/10/24 06:45

CodeLab

総合スコア1939

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

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

Midget2

2018/10/24 07:32

壁のオブジェクトは,ボールに対してかなり小さいオブジェクトにしないといけませんね。 悩ましいところです。 Cubeなどで一枚の壁とし,面での接触をした場合,接触している面の範囲の座標が取得できれば良いのですが,そのようなこともできるのでしょうか?
guest

0

※質問の内容を勘違いして回答していたため、撤回いたします。

ぱっと思いつくのは、箱のコライダを殺しておいて、それとは別にコライダを用意するという方法です。

#####追記

考えなおしたのですが、壁が接触したらその地点にコライダを発生させ、ボールがそのコライダにあたっている間は壁との当たり判定を無効にするとかはありかもしれません。一方で、ボールがどこかへ行ってしまわないよう、見えない壁用を用意する必要がありそうですが。

黒: もともとあった壁
赤: 黒い壁の当たり判定無効化用のコライダ
緑: 玉がどっか行ってしまわないための壁
イメージ

投稿2018/10/24 05:34

編集2018/10/24 06:42
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Midget2

2018/10/24 05:40

さっそく,ありがとうございます。 別のコライダとはどのようなものでしょうか?メッシュコライダとかですか? また,接触したときの処理はどのようにしたらよいでしょうか?
退会済みユーザー

退会済みユーザー

2018/10/24 05:57 編集

おっと、ごめんなさい。質問を勘違いしていました。回答を撤回しておきます。
Midget2

2018/10/24 07:01

ボールが複数あるので,行き来しているボールもあれば,黒の壁付近のボールもありますので,不用意に動かすと,黒の壁をすり抜けていくボールが出てきてしまいます。
退会済みユーザー

退会済みユーザー

2018/10/24 07:07

tagなどを利用して、トンネルの中にいるやつはトンネルの壁にだけぶつかり、そうでないやつは壁にぶつかる…などと、当たり判定を区別するというのはどうですか?
退会済みユーザー

退会済みユーザー

2018/10/24 07:09

似たようなことをやっているゲームを探し出してきて、どんなふうに実装していそうか観察するという手もあります。
Midget2

2018/10/24 07:33

似たようなことをしているゲームがなかなか見当たらず,また,ソースなどがないため困っております。似たようなものがあればご教授ください。
退会済みユーザー

退会済みユーザー

2018/10/27 03:33

ものすごくありそうな仕組みだとはおもうのですが、思い当たるゲームがありません。もうしわけない…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問