質問するログイン新規登録
C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

3084閲覧

壁間のコライダーをすり抜けてしまいます。

coffeeman

総合スコア8

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

2クリップ

投稿2022/05/08 08:47

編集2022/05/08 09:27

0

2

壁間のコライダーをすり抜けてしまいます。
また、カメラも壁をすり抜けて向こう側が見えてしまいます。
良い解決法がございましたらご教示頂きたいです。

※参考イメージを添付しました。
Cubeを自動生成してダンジョンを構築することを想定しています。

【内容】
①1×1×1のサイズのCubeを生成し、隙間無く並べることで大きな壁を作成します。
②全てのCubeにBoxCollider(Is Triggerはオフ)をアタッチします。
③プレイヤーにはRigidbody(IsKinematicはオフ、InterpolateはNone、Collision DetectionはContinuous Speculative)とCapsule Collider(Is Triggerはオフ)をアタッチします。
④プレイヤーをtransform.positionで壁に向かって移動させる。

上記により、Cube自体はすり抜けませんが、Cube間の隙間(隙間は0な筈なのですが。。)をすり抜けてしまいます。

【試したこと】
④のプレイヤーをtransform.positionではなく、MovePositionを試しましたが改善せず。

【これから試そうと思っていること】
プレイヤーに壁の当たり判定用コライダーを4つイメージ説明アタッチし、壁に触れたらそれ以上は進ませないというスクリプトを作成する。
(if文処理が複雑なので処理負荷が増大しないかが心配です。。)

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

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

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

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

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

bboydaisuke

2022/05/08 09:05 編集

プレイヤーにコライダーがついているかどうか質問に記述がないのですが、プレイヤーにコライダーがついてなければすり抜けますよ。 また、transform.position でプレイヤーを移動させるのはやめましょう。そうしなければならない限り。
bboydaisuke

2022/05/08 09:04 編集

> カメラも壁をすり抜けて向こう側が見えてしまいます。 Cinemachine Collider を使えばいいでしょう。
coffeeman

2022/05/08 13:11 編集

回答ありがとうございます。 申し訳ありません、プレイヤーにはコライダーがついています(Capsule collider)。記載漏れでした。 transform.positionは止めて、Rigidbody系で移動を実装するようにしたいと思います。 Cinemachine colliderは知りませんでした!試してみたいと思います。ありがとうございます。
guest

回答1

0

ベストアンサー

Rigidbody がついているオブジェクトに Transform.position を設定するのは問題外。
Rigidbody.MovePosition についても、isKinematic がオフになっている場合には Transform.position と同様です。

基本的にどちらも、「ワープさせる」ものです。
「ワープさせる」のですから、間に物があっても突き抜けていきます。
(ワープした先でコライダに埋まっていれば、押し戻そうとする力が発生するので、全く効かないわけではありませんが、突き抜けに弱くなります)
言い換えると、コライダを無視してワープさせる場合に、これらを使用します。

Rigidbody で物理制御を保ちつつ移動させるのであれば、Rigidbody.AddForceなどの「力を加える」処理をしてください。

また、一応言っておきますが、これらの物理制御は MonoBehaviour.Update で行わずに、MonoBehaviour.FixedUpdate で行います。

投稿2022/05/09 12:34

katsuko

総合スコア3601

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

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

coffeeman

2022/05/10 12:12

ありがとうございます! AddForceですり抜けなくなりました。 ただ、氷の上を移動するような加速度的な移動開始/終了になったので、キビキビと動けるようにするには調整が必要そうです。本件とは別件の問題であるため、一旦クローズとさせて頂こうと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問