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

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

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

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

Unity3D

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

Q&A

解決済

【Unity】ビリヤードゲームの作成について

M.hosokawa
M.H

総合スコア19

C#

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

Unity3D

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

2回答

0グッド

0クリップ

739閲覧

投稿2018/05/13 13:52

前提・実現したいこと

簡単なビリヤードゲームをUnityで作ろうとしています。
まずは手玉がほかのボール(1~9)に当たった瞬間に、各ボールが弾くという処理を実装したいです。

発生している問題・エラーメッセージ

9つのボールをくっつけた状態でゲームを開始すると、再生ボタンを押した瞬間にそれぞれの方向にボールが飛んで行ってしまいます。

該当のソースコード

C#

1// 手玉にアタッチするスクリプト 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class MyBallMove : MonoBehaviour { 7 8 public float moveSpeed; 9 private Rigidbody rb; 10 11 // Use this for initialization 12 void Start () { 13 this.GetComponent<Rigidbody>().AddForce( 14 (transform.forward + transform.right) * moveSpeed, 15 ForceMode.VelocityChange); 16 } 17 18 // Update is called once per frame 19 void Update () { 20 21 22 } 23 24 void OnCollisionEnter(Collision other) 25 { 26 //Ballタグは9つのボールのタグ 27 if (other.gameObject.CompareTag("Ball")){ 28 this.GetComponent<Rigidbody>().AddForce( 29 (transform.forward + transform.right) * moveSpeed, 30 ForceMode.VelocityChange); 31 } 32 } 33}
//1~9のボールにアタッチするスクリプト using System.Collections; using System.Collections.Generic; using UnityEngine; public class ReboundBall : MonoBehaviour { private float moveSpeed = 2.0f; private GameObject targetBall; // Use this for initialization void Start () { GameObject.Find("One").SetActive(false); GameObject.Find("Two").SetActive(false); GameObject.Find("Three").SetActive(false); GameObject.Find("Four").SetActive(false); GameObject.Find("Five").SetActive(false); GameObject.Find("Six").SetActive(false); GameObject.Find("Seven").SetActive(false); GameObject.Find("Eight").SetActive(false); GameObject.Find("Nine").SetActive(false); } // Update is called once per frame void Update () { } void OnCollisionEnter(Collision other) { if (other.gameObject.CompareTag("Ball")) { this.GetComponent<Rigidbody>().AddForce( (transform.forward + transform.right) * moveSpeed, ForceMode.VelocityChange); } } }

試したこと

9つのボールを非アクティブにし、手玉が当たった瞬間にアクティブ状態にすれば手玉が当たった瞬間に各ボールが弾かれる動きをするか
と思いましたが、GameObject.Find("ボールの名前").SetActive(false);
では、再生ボタンを押した瞬間にボールが消えてしまい、うまくいきません。

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

基礎的なことかもしれませんが、ご教示頂きたいです。
宜しくお願いいたします。

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

0

アドバイス頂いた内容に変更したらうまくいきました。
ありがとうございます!

投稿2018/05/14 12:32

M.hosokawa

総合スコア19

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

ベストアンサー

症状から予想するに、9つのボールの初期配置にわずかなめり込みがあって、スタートと同時にめり込みの解消が発生して吹っ飛んでいってしまうのかと思います。
初期配置状態でぴったり接触させてしまうのではなく、計算誤差を考慮してボール間にごくわずかな隙間をあけてやってはどうでしょうか?

※ブレイクショット時の手玉を発射する部分はともかく、それ以外のボール同士の衝突の際の反発をOnCollisionEnterとAddForceで制御しようとするのはやめたほうがいいかもしれません。非KinematicなRigidbodyなら衝突すれば自動的に互いに跳ね返り合うはずですので、そこにさらに余計な力を加えてしまうと動きが奇妙になってしまうのでは...と思うのですが、どうですかね?

投稿2018/05/13 21:58

編集2018/05/13 22:40
Bongo

総合スコア10629

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

M.hosokawa

2018/05/13 22:47

回答ありがとうございます! >症状から予想するに、9つのボールの初期配置にわずかなめり込みがあって、スタートと同時にめり込みの解消が発生して吹っ飛んでいってしまうのかと思います。  →確かにその通りの配置にしております。よりリアルにしたいと思い、ボール同士をくっ付けているのですが、肉眼では確認できないわずかな隙間を入れて動作を確かめてみたいと思います。 ボールが跳ね返る動きがなんとなくおかしな動きをしていました。。。 OnCollisionEnterとAddForceを外して試してみます。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity3D

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