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

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

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

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

Unity3D

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

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Unity

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

Q&A

1回答

875閲覧

「はじめてのWii」にあるタンクをUnityで作りたいのですが、ポインターの位置に弾を発射する挙動について困っています。

tanomuyo

総合スコア0

C#

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

Unity3D

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

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Unity

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

0グッド

0クリップ

投稿2023/10/16 07:06

実現したいこと

画面上にポインター(マウスカーソル)を表示して、左クリックでポインターの位置に弾を発射できるようにしたい。

前提

現在、Unity(3D)でマップ(Map)とタンク(GameObject)と弾(bullet)は作れました。弾はプレハブに入れています。ポインターとなるアイコン画像はUnity内に保存済みで、マウスカーソルの位置にポインターを表示することはできました。しかし、タンクからそのポインターの位置に弾を発射するScriptを書いたところ、自分が思う挙動をとってくれません。
プレイ画面はマップをほぼほぼ真上から見ている感じにする予定です。
タンクはBody、Head、Nozzleで構成されていて、Nozzleオブジェクトから発射されるようにしたいです。

該当のソースコード

以下のコードが自分が作った発射プログラムです。(C#)

using System.Collections;
using System.Collections.Generic;
using UnityEditor.Experimental.GraphView;
using UnityEngine;

public class Shooting : MonoBehaviour
{
public GameObject bulletPrefab;
public float bulletSpeed = 10.0f;

// Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { //マウスの左クリックを検出 if(Input.GetButtonDown("Fire1")) { Shoot(); } } void Shoot() { // マウスカーソルの位置をワールド座標に変換 Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); // 弾の位置をマウスカーソルの位置に設定 transform.position = mousePosition; //弾のインスタンスを作成し、発射位置に配置 GameObject bullet = Instantiate(bulletPrefab, transform.position, Quaternion.identity); //弾の方向を設定 Vector3 direction = (mousePosition - transform.position).normalized; //弾に速度を与える Rigidbody rb = bullet.GetComponent<Rigidbody>(); rb.velocity = direction * bulletSpeed; }

試したこと

このコードで実際にプレイして、左クリックをすると弾が謎の座標から出現して、ただ落ちるだけとなってしまいました。

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

初めての質問で分かりにくいかもしれませんが、答えていただけると幸いです。

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

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

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

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

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

guest

回答1

1

こんにちは。

Unity の仕組みは詳しくないのでどうすれば動くとはっきりと言えませんが、パッと見で変なところが、

csharp

1 // 弾の位置をマウスカーソルの位置に設定 2 transform.position = mousePosition;

と書いたら、transform.positionmousePosition は同じ値になるんじゃないでしょうか。
そうしたら、(mousePosition - transform.position) は常にゼロなのではないでしょうか。

投稿2023/10/16 07:55

tamoto

総合スコア4333

tanomuyo👍を押しています

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

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

tanomuyo

2023/10/16 08:35

回答ありがとうございます。 そこを改善したらnozzzleから発射されるようにはなったのですが、なんか画面に向かって球が飛んでくるようになってしまいました。
tamoto

2023/10/16 08:40

改善したコードの提示が無い以上想像の話しか出来ませんが、 方向を決定しているのは `direction` の値だけなので、このベクトルがちゃんと向けたい方向を向くように計算式を考えてください。 `mousePosition` の中身がどんな数値なのかを改めて確認してみることをおすすめします。
tanomuyo

2023/10/16 08:41

<補足> 単純に // 弾の位置をマウスカーソルの位置に設定 transform.position = mousePosition; を消しました。
fana

2023/10/18 02:10

全く Unity を知らない人の戯言なのですが, > Camera.main.ScreenToWorldPoint(Input.mousePosition); という記述を見ると「大丈夫なのかな?」とか思ったりします. なんとなくググった雰囲気では Input.mousePosition というのは (x,y,0) を返す(zが0になる)らしいですが, ScreenToWorldPoint の引数にコレをそのまま与えて良いのでしょうか? 何かしら適切なz座標を与えねばならないのではないか?とも見えます. ※ここで「適切な」というのは,「用途に応じた」という意味.ここでは「transform.position とちゃんと比較できるような値を得るためにはどうしたらいいのか」的な.
UnitySoldier

2023/10/19 06:09 編集

>という記述を見ると「大丈夫なのかな?」とか思ったりします. OpenGLの人にこんな事言うの釈迦に説法な気がするのですが..💦 これは大丈夫な時と大丈夫じゃないときがあります。 所謂透視投影の時はZにカメラの最小描写距離、 `Camera.nearClipPlane` を突っ込むことが多いですね。 Unityは3Dとか限らず並行投影の2Dなこともあるのでそういう時はそのまま入れたりするのですが今回は 前者ならCamera.nearClipPlaneを入れないと描写されない気がしますねえ (そういやこのゲーム3Dなんだろうか....わからないとなんともいえないような)
tanomuyo

2023/10/24 08:18

すみません!回答していただいたのに全然気づかなくて、 お二人とも回答ありがとうございます。 試行錯誤してみます。 はじめてのWiiのタンク!って3Dなのか2Dなのかわかりにくいんですよね(たぶん3Dな気がします)。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問