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

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

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

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

Q&A

2回答

3549閲覧

Unityでチャージショットを実装したいのですが、分かりません

ranerane0101

総合スコア70

Unity

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

0グッド

0クリップ

投稿2020/10/01 13:35

Unity初心者です。5秒間キーを入力し、そして離したらチャージショットを放つようにしたいのですが出来ません。やったこととしてはここで検索をかけて出てきたもの(チャージショットで検索をかければ一番上にくるもの)、あとはググったらTime.timeなども関連したものはありましたが、これはゲームが始まったら時間を経過させてしまうもの、IEnumeraterなるコルーチンも英語の検索結果でいくつかありましたが、これは~秒後ーする、そしてそも~秒後またーするというもの、でどれも解決に至りませんでした。コードが知りたいのは正直ありますが、批判されると思いますしこの先も躓くと思うのでコード、ググり方も教授いただけると嬉しいです。試行錯誤したコードも一応載せておきますが、見にくくてすいません。既に述べた様にTime.timeでは出来ないことは分かっています。あと気になることと言えばprivate float 定義?したtimeが反映されないことの原因とかですかね(コメントアウトした部分です)、、。

コード

public

1 { 2 3 4 public GameObject BusterPrefab; 5 public GameObject chargeshot; 6 public int shotCount; 7 8 private float time = 0.0f; 9 private bool charging = false; 10 private float chargeTime = 0; 11 private float chargeRate = 2f; 12 13 public Text shelllavel; 14 // Start is called before the first frame update 15 void Start() 16 { 17 shelllavel.text = "残弾" + shotCount; 18 19 time = 0.0f; 20 } 21 22 // Update is called once per frame 23 void Update() 24 { 25 //移動制限 26 Vector2 pos = transform.position; 27 transform.position = new Vector2(Mathf.Clamp(pos.x, 0, 2), Mathf.Clamp(pos.y, 1, 3)); 28 29 30 if (Input.GetKey(KeyCode.L)) 31 { 32 StartCoroutine(TimerRoutine()); 33 charging = true; 34 time =+ Time.deltaTime; 35 Debug.Log("カウントしています"); 36 } 37 //if (Input.GetKeyUp(KeyCode.L)) 38 //{ 39 // if (time < 10f) 40 // { 41 42 // Instantiate(BusterPrefab, transform.position, Quaternion.identity); 43 // } 44 // //else 45 // //{ 46 // // Instantiate(chargeshot, transform.position, Quaternion.identity); 47 // //} 48 49 // //if (time > 11.0f) 50 // //{ 51 // // charging = false; 52 // // time = 0.0f; 53 // //} 54 55 // if (shotCount < 1) 56 57 // return; 58 59 // shotCount -= 1; 60 61 // shelllavel.text = "残弾" + shotCount; 62 63 //} 64 if (Input.GetKey(KeyCode.W)) transform.Translate(0,0.1f,0); 65 else if (Input.GetKey(KeyCode.A)) transform.Translate(-0.1f,0,0); 66 else if (Input.GetKey(KeyCode.S)) transform.Translate(0,-0.1f,0); 67 else if (Input.GetKey(KeyCode.D)) transform.Translate(0.1f,0,0); 68 69 70 } 71 72 IEnumerator TimerRoutine() 73 { 74 yield return new WaitForSeconds(5f); 75 chargeTime += chargeRate; 76 Fire(); 77 } 78 79 void Fire() 80 { 81 if (Input.GetKey(KeyCode.L) && Time.time > 5f) 82 { 83 Instantiate(chargeshot,transform.position,transform.rotation); 84 chargeTime = 0; 85 } 86 if (Input.GetKeyUp(KeyCode.L) && Time.time < 5f) 87 { 88 chargeTime = 0; 89 } 90 } 91}

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

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

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

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

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

guest

回答2

0

実装はここで検索をかけて出てきた質問のベストアンサーの内容で良いと思いますよ

ググり方はいきなり全体を調べるより要素要素に分解して、それぞれ調べて自分で組み立てる方が良いです
全体をコピペして値変えて終わりだと頭に残らないと思います
チャージショットなら「キー入力」「経過時間の計算」「判定」「弾を生成して撃つ」を組み合わせたら何となく出来そうですよね
地道に組み立てて実装しましょう

コードだととりあえずDebug.Log("カウントしています");ではなくDebug.Log("Time:" + time);みたいに変数がどう変化しているかを確認する癖をつけた方がいいです

private float time = 0; private void Update() { // キー入力(押してる間) if (Input.GetKey(KeyCode.L)) { // 経過時間の計算 time += Time.deltaTime; } // キー入力(離した時) if (Input.GetKeyUp(KeyCode.L)) { // 判定 if (time < 5.0f) { // 弾を生成して撃つ 通常 } else { // 弾を生成して撃つ チャージショット } time = 0; } Debug.Log("Time:" + time); }

投稿2020/10/01 15:27

編集2020/10/01 15:31
lazh

総合スコア300

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

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

0

行き詰ったときの検索方法ですが、私の場合必要な情報を入れて検索します。
("Unity チャージショット" 等です。)
そしていくつかのページを上からさっと流し読みしてみて、自分に合っていそうなものをピックアップして試してみます。
それでも見つからない場合は、その旨を記載したうえでteratailにて相談させていただいております。

次にチャージショットの実装に関してですが、検討してみましたので下記のコードを試してみてください。
下記コードでは、インスペクターからチャージショットのゲームオブジェクトを指定する必要があります。
発射後のショットの移動などは、生成したゲームオブジェクトにコードを張れば問題ないと思います。

C#

1public class chargeattack : MonoBehaviour 2{ 3 //チャージ中かどうかの判定フラグ 4 public bool isCharging = false; 5 6 //チャージ時間の管理タイマー 7 private float ChargeTime = 5.0f; 8 private float ChargeTimer = 0.0f; 9 10 //ショットのゲームオブジェクト 11 [Header("ノーマルショット")]public GameObject shot1; 12 [Header("チャージショット")]public GameObject shot2; 13 14 private void Update() 15 { 16 //Fire1で設定されているボタンを押したときの条件分岐 17 if(Input.GetButtonDown("Fire1")) 18 { 19 //チャージショットのボタンが押されたときのフラグをたてる 20 isCharging = true; 21 } 22 23 //チャージボタンが押された状態での条件分岐 24 if(isCharging) 25 { 26         //チャージ時間の管理 27   ChargeTimer += Time.deltaTime; 28 //チャージ時間が想定の時間より短い 29 if(ChargeTimer <= ChargeTime) 30 { 31 ChargeTimer += Time.deltaTime; 32 if(Input.GetButtonUp("Fire1")) 33 { 34 //ノーマルショットのゲームオブジェクトを生成し、フラグを下ろす 35 shot1.SetActive(true); 36 isCharging = false; 37 //チャージ時間の初期化 38 ChargeTimer = 0.0f; 39 } 40 } 41 //チャージ時間が想定の時間を超えた 42 else 43 { 44 if(Input.GetButtonUp("Fire1")) 45 { 46 //チャージショットのゲームオブジェクトを生成し、フラグを下ろす 47 shot2.SetActive(true); 48 isCharging = false; 49 50 //チャージ時間の初期化 51 ChargeTimer = 0.0f; 52 } 53 } 54 } 55 } 56}

投稿2020/10/12 15:32

Izayoi-san

総合スコア12

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

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

ranerane0101

2021/01/07 03:23 編集

返信遅くなりすいません。何度も何度も試みましたが出来ませんでした。通常ショットは以下の通りです。 またpublic class chargeattack : MonoBehaviourのように回答者様がプレイヤを動かすスクリプトと別にクラスを作成しているのですが、自分は併存させる形でコードを書いているのでできないのでしょうか? using System.Collections; using System.Collections.Generic; using UnityEngine; public class BusterController : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per fram void Update() { ShotAction(); // 5秒後に自分を削除 Destroy(this.gameObject, 5.0f); transform.Translate(0.2f, 0, 0); if (transform.position.x > 4.53) { //弾を削除 Destroy(gameObject); } } void ShotAction() { if (Input.GetKeyDown(KeyCode.L)) { Instantiate(this, transform.position, transform.rotation); } } //Destroy(gameObject, 2); //2 秒後に削除する private void OnTriggerEnter2D(Collider2D collision) { if (collision.gameObject.tag == "Boss") { Destroy(collision.gameObject); //弾が当たった場所に爆発エフェクトを生成する //Instantiate(m_explosionPrefab, collision.transform.localPosition, Quaternion.identity); FindObjectOfType<ScoreController>().AddPoint(-1); Destroy(gameObject); } }
Izayoi-san

2021/01/07 13:59

まず、うまくいっていないのはチャージショットだとお見受けしています。 なので、ノーマルショットではなく、チャージショットのスクリプトがないとなぜダメだったかこちらにはわかりません。 またノーマルショットのスクリプトを見ただけなので、チャージショットがうまくいかない問題の解決にはならないと思いますが、Updateに何の条件分岐もなくDestroyを使用すると5秒後にこのスクリプトを張り付けたゲームオブジェクトは自壊すると思うで、制御も何もないと思うのですが・・・?
ranerane0101

2021/01/17 08:19

確かにですね。すいません。自壊してしまうのは直しておきました。訂正させてもらったものを張っておきます。 チャージショットのスクリプトです。よろしくお願いします // Update is called once per frame void Update() { Destroy(this.gameObject, 5.0f); transform.Translate(0.2f, 0, 0); if (transform.position.x > 4.53) { //弾を削除 Destroy(gameObject); } }
Izayoi-san

2021/01/20 04:45

このスクリプトを見るに、ゲーム開始(どのタイミングでチャージショットのオブジェクトが生成されるか記述がないので、アクティブ状態でただあるものと仮定しています)から0.2fずつ右側に移動していき、5秒後か4.53f分右に進んだ段階で壊れるだけだと思います。 チャージ時間の管理などは別のスクリプトに記述しているのでしょうか? もし記述していない場合は、チャージショットがうまくいかないのではなくチャージショットに関してのプログラムがそもそもない状態だと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問