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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

1261閲覧

野球ゲームでミートカーソルを動かしボールをいろいろな方向に飛ばす処理を実装したいです。

Abc_.c

総合スコア18

C#

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

Unity3D

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

Unity

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

0グッド

1クリップ

投稿2022/05/20 08:28

質問は題名の通りです。
打つタイミングによって打撃方向が変わる処理はなんとか実装できそうなのですが、ミートカーソルの当たった場所によってボールを飛ばす方向が変わる処理が実装できません。
ミートカーソルにはcolliderをつけています。ボールにもボールと同じぐらいのcolliderをつけておりミートカーソルのcolliderにふれたらボールを反射するような処理をスクリプトから記述しております。Physic Materialは使っておりません。ミートカーソル自体にミートカーソルと同じぐらいのcolliderをつけており、ミートカーソルの上らへんにボールが当たったら上方向に反射させたり、ミートカーソルのcolliderの下方向にボールが衝突したら下方向にボールが飛んでいくという処理を実装したいのですがうまくいきません。最初、ミートカーソルとボールが衝突したローカル座標を取得してそれをもとに条件分岐して上方向に飛ばしたり下方向に飛ばしたりすれば実装できると思って試したのですがうまくいきませんでした。理由は例えば低めを打つ際、ミートカーソルを下方向に持ってきますが、その際のミートカーソルのY座標のローカル座標が0.6だとするとボールがミートカーソルの上にあたろうが、下にあたろうが、0.6という数字をひろってしまうからです。高めを打つ場合も同じです。なのでミートカーソルの上に当たった場合、上方向に飛ばしたり、下方向に当たった場合、下方向に飛ばすという条件分岐が使えないんです。どのように上記のような処理を実装すればよいでしょうか?

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

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

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

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

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

bboydaisuke

2022/05/20 12:26

物理エンジンを使って野球ゲームを作るなら野球盤みたいなものしか作れないでしょう。Collider や Physics Material で制御するのではなく、バットとボールのタイミングからどっちにどのように飛ばすのかを全部プログラミングする、というのが一般的な野球ゲームの作り方だと思います。つまりすごく大変。
Abc_.c

2022/05/20 12:52 編集

例えばミートカーソルの上らへんにボールが当たった場合当然上にボールを飛ばしたいですし、下らへんに当たったら、下に飛ばしたいです。具体的にこれらの処理はどのようにすれば可能なのでしょうか?
bboydaisuke

2022/05/20 14:49 編集

すごーく難しいしとてつもなくめんどくさいのである程度できたものがあるならアドバイスしてくれる人もいるかもしれませんけど、ゼロの状態から「具体的に」って質問されてもなぁ、って感じです。
Abc_.c

2022/05/20 14:59

ミートカーソルについてるcolliderの上の方にボールが当たったら上に飛んでいき、下の方に当たったら下に飛んでくようにif文などで制御するみたいな感じではないのですか?
YT0014

2022/05/20 15:42

当たった時のボールの座標は取得できないのですか? ボールの座標がミートカーソルより上なら上方向、下なら下方向とすれば、それなりに自然になるかと。
bboydaisuke

2022/05/20 17:26 編集

> (前略)みたいな感じではないのですか? それで一回作ってみたらいいんじゃないですか?OnCollisionEnter の引数からは衝突相手の GameObject と接触座標がとれますが、球速とスイングスピードの和があまりに速いとすり抜けたり、ちゃんとした値が取れないかもしれません。
Abc_.c

2022/05/20 23:32 編集

>>YT0014さん それ試したんですよ。ただうまくいかなかったんです。例えば、ミートカーソルのy座標が0.6の位置にあるとしますよね。ボールがミートカーソルに当たったとき、ミートカーソルの位置座標を取得してもy座標0.6しか取得できないから意味ないんです。取得できる座標はミートカーソルがボールに当たった際、ミートカーソル自体が現在存在する位置座標を取得するからなんです。ミートカーソルがy座標0.6の位置にありボールが当たったのは良いものの取得できる座標は0.6でしかないので、ボールが、上か下に当たったかの位置情報は取得できていないので条件分岐ができないというのが現状なんです。y座標0.6という数字は例として出しました。ボールが、ミートカーソルをどの位置に移動しようともミートカーソルにアタッチされているcolliderの上か下にボールが当たったという情報はどのように取得すれば良いのでしょうか?
bboydaisuke

2022/05/21 00:38

今どういうコードを書いてるかは貼れないんですか?this.gameObject.position と書いて「カーソルの座標しか取れない」と言っているのか、Collision.gameObject.transform.position はちゃんと使えてるのかによって周りは対応を変えないといけませんよね。
guest

回答1

0

ベストアンサー

最低限(打球は2パターンのみ)ですが。

csharp

1using UnityEngine; 2using UnityEngine.UI; 3 4public class MeetCursor : MonoBehaviour 5{ 6 [SerializeField] Image _cursor = default; 7 [SerializeField] Vector3 _size = Vector3.one; 8 [SerializeField] LayerMask _meetareaLayer = default; 9 [SerializeField] LayerMask _baseballLayer = default; 10 [SerializeField] Vector3 _homerunVelocity = Vector3.one; 11 [SerializeField] Vector3 _grounderVelocity = Vector3.one; 12 Vector3 _center = default; 13 14 void Start() 15 { 16 Cursor.visible = false; 17 } 18 19 void Update() 20 { 21 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 22 23 if (Physics.Raycast(ray, out RaycastHit hitInfo, 10, _meetareaLayer)) 24 { 25 _cursor.rectTransform.position = Input.mousePosition; 26 _center = hitInfo.point; 27 } 28 29 if (Input.GetMouseButtonDown(0)) 30 { 31 var cols = Physics.OverlapBox(_center, _size, Quaternion.identity, _baseballLayer); 32 33 foreach (var c in cols) 34 { 35 var rb = c.GetComponent<Rigidbody>(); 36 rb.velocity = c.transform.position.y < _center.y ? _grounderVelocity : _homerunVelocity; 37 } 38 } 39 } 40 41 void OnDrawGizmos() 42 { 43 Gizmos.DrawWireCube(_center, _size); 44 } 45 46 void OnApplicationQuit() 47 { 48 Cursor.visible = true; 49 } 50}

イメージ説明

投稿2022/05/21 04:55

bboydaisuke

総合スコア5275

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

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

Abc_.c

2022/05/22 08:26

コードまで書いていただきありがとうございました!だいぶ参考になります!
bboydaisuke

2022/05/22 10:37 編集

次回からはあなたが作ってるものをみんなが動かせる状態にして質問してください。私は質問に書いてある問題の説明が理解できずに、タイトルだけの情報から回答しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問