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

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

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

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

Unity

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

Q&A

1回答

1373閲覧

Unity2Dでボールをお椀でキャッチするゲームを作りたい

haikaji

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2021/09/29 07:15

前提・実現したいこと

落下するボールをお椀でキャッチする2DゲームをUnityで作成中です。

ボールは画面上部からランダムに自然落下(重力で)してきます。

お椀をボールの落下地点にドラッグして動かしてボールをキャッチするのですが、
キャッチしたボールがお椀の中で動き回ったり、
お椀を素早く動かすとお椀の中からボールが上に飛んでいってしまいます。

キャッチしたボールをお椀の中で動かないように、かつ
お椀の中からボールが飛んでいってしまわないようにする方法を知りたいです。

お椀に入ったボールのイメージ:
イメージ説明

試したこと

キャッチしたボールに対して:

  • Physics Material 2D の Friction:0 Bounciness: 0
  • スクリプトを無効にする
  • velocityをゼロにする
  • drag値を高くする
  • Rigidbody2DのBodyTypeをDynamicからkinematicに変更する
  • Rigidbody2Dを外す
  • コライダーを外す
  • カゴオブジェクトの子オブジェクトにする
  • キャッチしたボールの位置をお椀の相対座標で指定する

※上記は同時に試したわけではないです

c#

1void OnTriggerEnter2D(Collider2D collider) 2{ 3 ball = GetComponent<BallController>(); 4 ball.enabled = false; 5 6 GetComponent<Rigidbody2D>().velocity = Vector2.zero; 7 8 GetComponent<Rigidbody2D>().drag = 50f; 9 10 GetComponent<Rigidbody2D>().isKinematic = true; 11 12 Destroy(GetComponent<Rigidbody2D>()); 13 14 cc2d = GetComponent<CircleCollider2D>(); 15 cc2d.enabled = !cc2d.enabled; 16 17 GameObject owan = GameObject.Find("owan"); 18 transform.SetParent(owan.gameObject.transform); 19 20 Vector3[] owanRow4HoldPositionList = new[] 21 { 22 new Vector3(-0.37f, 0f, 0f), 23 new Vector3(-0.12f, 0f, 0f), 24 new Vector3(0.12f, 0f, 0f), 25 new Vector3(0.37f, 0f, 0f), 26 new Vector3(-0.37f, 0.3f, 0f), 27 new Vector3(-0.12f, 0.3f, 0f), 28 new Vector3(0.12f, 0.3f, 0f), 29 new Vector3(0.37f, 0.3f, 0f), 30 new Vector3(-0.37f, 0.6f, 0f), 31 new Vector3(-0.12f, 0.6f, 0f), 32 new Vector3(0.12f, 0.6f, 0f), 33 new Vector3(0.37f, 0.6f, 0f), 34 35 }; 36 transform.localPosition = owanRow4HoldPositionList[0]; 37 38}

お椀に対して:

  • unity Hierarchy では

親:Owan(Rigidbody2D: kinematic, Box Collider 2D: isTrigger: on)
子:LeftWall(Physics Material 2D の Friction:0 Bounciness: 0)
子:RightWall(Physics Material 2D の Friction:0 Bounciness: 0)
子:BottomWall(Physics Material 2D の Friction:0 Bounciness: 0

コライダー

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

MacBook Pro (Apple M1)
Unity 2020.3.10f1

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

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

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

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

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

stdio

2021/10/03 22:26

すみません。 そのゲームは3Dの方が作りやすいと思うのですが、なぜ2Dにこだわるのか教えて頂けないでしょうか?
haikaji

2021/10/04 01:49

メッセージありがとうございます。 今回は2Dで作りたいというのが理由です。 参考までに、3Dの方が作りやすい理由を教えていただけないでしょうか。
guest

回答1

0

色々と方法はありそうですが、
お椀に入ったボールの重力を非常に大きな数値にしてみてはどうでしょうか。

投稿2021/09/29 07:20

YOshim

総合スコア1085

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

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

haikaji

2021/10/01 09:57

ご回答ありがとうございます。 キャッチしたボールをお椀の子オブジェクトにして、重力を100で試してみたところ、お椀に入ったボール同士が接触するとプルプルと震えて停止しません。 重力を10まで下げるとプルプルが収まりますが、お椀を左右に素早く動かすと、お椀からボールがこぼれてしまいます。 キャッチしたボールがお椀に吸着して、お椀の中で動かない方法をご存知でしたら教えていただけると助かります。
YOshim

2021/10/01 10:26 編集

位置を固定したいなら、ボールがお椀に入った後にお椀の相対位置を常に指定し続ければよいと思います。 入った順番によって位置を多少ずらす必要はあるかもしれませんが、LateUpdate関数内でボールのtransform.position = Owan.transform.positionでよいかと。
haikaji

2021/10/04 11:59

キャッチしたボールをお椀の子オブジェクトにして相対位置を指定することでお椀の中のボールが動かなくなりました。 ご意見ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問