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

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

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

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

Unity

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

Q&A

2回答

1456閲覧

ボタンを押せば銃弾が上昇するように設定したい

Neet-Saikou

総合スコア11

C#

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

Unity

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

0グッド

0クリップ

投稿2020/01/31 11:19

編集2020/02/13 08:50

前提・実現したいこと

常に真横に発射され続けている銃弾(Bullet)を、「↑(上向きの矢印)」ボタン(UpButton)を押せば上向きの軌道・方向に変えられるように、銃弾とボタンのスクリプトを設定したい。

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

ボタンに効力を持たせるためにコードをアタッチしなければならないのだが、そうした場合ボタン自身がfloat Speed=60で進んでしまう。ボタンを押した場合、ボタンは動かずに、銃弾のみがボタンの効果(public void UpButtonDown())を受けるようにしたい。またボタンを押してない時は常にそのまま(真横に)銃弾が進むようにしたい。
ButtonのInspecterの画像は以下の通りです。
イメージ説明
イメージ説明

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class BulletController : MonoBehaviour 7{ 8 public GameObject Bullet; 9 float speed = 60.0f; 10 11 void Update() 12 { 13 transform.position += new Vector3(this.speed * Time.deltaTime, 0f, 0f); 14 } 15 public void UpButtonDown() 16 { 17 transform.position += new Vector3(this.speed * Time.deltaTime, 0.2f, 0f); 18 } 19 private void OnCollisionEnter2D(Collision2D collision) 20 { 21 if (collision.gameObject.tag == "Building") 22 { 23 Destroy(this.gameObject); 24 } 25 if (collision.gameObject.tag == "Enemy") 26 { 27 Destroy(this.gameObject); 28 } 29 } 30}

試したこと

別の銃弾を作成し、別のコードで、別のPrefabで上向きの銃弾を作ってボタンにアタッチしてみたのですが、その場合だと同時に横(真横)向きの銃弾も発射されてしまうので、なんとか1つの銃弾を、ボタンにて自由に上下に動かせるようにしたいです。

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

Unity 2019 3.0 f5

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

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

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

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

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

Hawn

2020/02/07 01:29

Bulletですが ・public GameObject Bullet;で代入しているオブジェクト ・GameObject.Find("Building"); ・GameObject.Find("Enemy"); どれが正しいでしょうか?
Neet-Saikou

2020/02/12 02:35

質問に質問を返して申し訳ないのですが、Bulletはその3つのコード全ての役割を持っていると思っていたのですが、違うのでしょうか?
Hawn

2020/02/12 02:57

izmktrさんも指摘していますが代入時に上書きされていくので「3つのコード全ての役割を持つ」というのは不可能です。 this.Bullet = GameObject.Find("Enemy"); 現在はこれのみ適用されています。 BulletなのにEnemyオブジェクトを代入するのは違うのではないかと思っています。
Hawn

2020/02/12 03:39 編集

質問の解決には「Buttonに使うクラス」と「Bulletに使うクラス」を分けてしまえば良いのですが、 まずはBulletのオブジェクトを正確に参照出来るようにしないとその修正は無理かと思います。
Neet-Saikou

2020/02/12 06:40

そうだったんですか 詳しくありがとうございます! では下2つのコードを消してpublic GameObject Bullet;のみとした場合はどのようにすればいいでしょうか?
Hawn

2020/02/12 09:58

回答に書きました。 設定を間違えなければボタンを押している間y方向に0.2づつ上がるかと思います。
guest

回答2

0

・ボタンにアタッチするクラス

BulletController.cs

1using UnityEngine; 2 3public class BulletController : MonoBehaviour 4{ 5 public Bullet bullet; 6 7 public void UpButtonDown() 8 { 9 bullet.UpSpeed = 0.2f; 10 } 11 12 public void UpButtonUp() 13 { 14 bullet.UpSpeed = 0f; 15 } 16}

ボタンの押しっぱなしがそのままでは機能しないのでButtonコンポーネントを削除してEventTriggerコンポーネントを使用して下さい。
具体的には下記の様に設定して下さい。

イメージ説明

・Bulletにアタッチするクラス

Bullet.cs

1using UnityEngine; 2 3public class Bullet: MonoBehaviour 4{ 5 float speed = 60.0f; 6 7 private float upSpeed = 0; 8 public float UpSpeed 9 { 10 get { return upSpeed; } 11 set { upSpeed = value; } 12 } 13 14 void Update() 15 { 16 transform.position += new Vector3(this.speed * Time.deltaTime, upSpeed, 0f); 17 } 18 19 private void OnCollisionEnter2D(Collision2D collision) 20 { 21 if (collision.gameObject.tag == "Building") 22 { 23 Destroy(this.gameObject); 24 } 25 if (collision.gameObject.tag == "Enemy") 26 { 27 Destroy(this.gameObject); 28 } 29 } 30}

・画像追加後の追記========================
現在BulletにBulletControllerがアタッチされているのでBulletに付け替えてください。
===================================

投稿2020/02/12 09:57

編集2020/02/13 09:18
Hawn

総合スコア1222

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

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

Neet-Saikou

2020/02/13 06:31

回答ありがとうございます。 提示していただいた通りにコードを作成しました所、コードにエラーは発生せず作成できたのですが、ボタンを押しても全く上昇しませんでした…………… 何か写真以外の場所の設定が間違っているのでしょうか…?
Hawn

2020/02/13 06:40

まずはボタンを押した時にUpButtonDownを通っているか確認して下さい
Hawn

2020/02/13 06:54

と書いても無理そうなのでボタンのInspectorの画像をアップして下さい。
Neet-Saikou

2020/02/13 06:59

UpもDownも確認しました。 中身を別のコードで行った場合しっかり反応していました。
Hawn

2020/02/13 07:15 編集

上昇させたいBulletの参照をミスっているのではないでしょうか。 普通ならそういった参照含めてデバッガで確認するのが当たり前です。 無理ならシーン環境含めて画像アップして下さい。
guest

0

BulletController がどのオブジェクトにアタッチして使うものなのかイマイチわかりかねます

弾を発射する瞬間にUPキーが押されているかチェックし、
その時に弾の速度(向き)を決定する感じだと思います

class Bullet{ public Vector3 speed; void Update(){transform.position += speed;} } // 弾を発射するところ var bullet = Instantiate(bulletPrefab); var up = Input.GetKey(KeyCode.Up) ? 0f : 0.2f; bullet.GetComporment<Bullet>().speed = new Vector3(60f, up, 0f);

あと、以下の部分ですが、上書きされるので最初の行の意味はありませんね

this.Bullet = GameObject.Find("Building"); this.Bullet = GameObject.Find("Enemy");

投稿2020/01/31 18:03

izmktr

総合スコア2856

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

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

Neet-Saikou

2020/02/05 05:45

回答ありがとうございます。 アタッチしたいのはBulletとボタンにです。Bulletにボタンを押すと同時に上に向かって上昇してほしい、って感じです。しかしその為にはボタンにも Bulletにもそれぞれ別のスクリプトをアタッチする必要があるため訳が分からなくなっているという感じです。
Neet-Saikou

2020/02/05 05:48

また var up = Input.GetButton(KeyCode.Up) ? 0f : 0.2f; の部分なのですがエラーが発生し「KeycodeにUpの定義がありません」と出てくるのですがどう定義すればいいのでしょうか?
izmktr

2020/02/05 06:32

まず、説明をちゃんとできるようにしましょう 上キーを押すと何が起こるんですか? すでに発射済みの弾が上に行くのか、銃が上向きの弾を発射するのか… 後者なら、発射済みの弾は何の影響もうけないので、キー入力すら受け取る必要はありません UpArrowかな まぁ、使いたいキーを適当に入れておいてください
Neet-Saikou

2020/02/06 16:44

上ボタンを押すと発射した銃弾(Bullet)が上に上昇します。 前者です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問