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

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

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

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

Unity3D

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

Unity

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1664閲覧

Lv毎の処理の遷移の仕方

GOTOken

総合スコア54

C#

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

Unity3D

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

Unity

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/03 00:50

編集2018/07/03 03:00

問題点

以下のスクリプトを記述したとき、最後のInstantiateの部分の処理のみが通っており、Lvに応じたif文が機能していない。
deltaTimeの初期化ができない。

実装したいこと

押している時間に応じて、弾の種類(形状)を変化させるようにしたい。
今回の場合、Lv1 → 押したら
Lv2 → 2~4秒間の間
Lv3 → それ以降
という流れを組もうと思っています。

試したこと、やったこと

時間を計測し、時間に応じた処理をしようとした。
bool型の変数を用意し、それぞれの場合に合わせて変えれるようにしようとした。
これらのことを試しましたが、Lv3まで処理が飛んでしまっているので、どのように分岐すれば段階別にすることができるのか案をご教授していただきたいです。
また、再度計測させるためにそれぞれの処理の最後にdeltaTimeを=0(初期化)するようにした。

c#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class playerCont : MonoBehaviour { 6 7 public int PlayerHP; 8 public int PlayerBUlletGun;//Playerの撃てる弾数設定用 9 public float Playerspped = 3; 10 public float BulletCount; 11 public float bulletSpeed; 12 public bool Lv1; 13 public bool Lv2; 14 public bool Lv3; 15 16 17 public Bullet BulletPrefab;//弾Prefab格納 18 public Transform target_to_Move; 19 public GameObject tarGet; 20 public AudioClip clip; 21 22 private Vector2 prevPos; 23 24 public Transform my_Trans; 25 private Rigidbody2D rb2d; 26 private float delta; 27 private AudioSource audiosource; 28 29 // Use this for initialization 30 void Start () { 31 this.rb2d = GetComponent<Rigidbody2D>(); 32 // this.anim = GetComponent<Animator>(); 33 this.audiosource = GetComponent<AudioSource>(); 34 35 } 36 37 // Update is called once per frame 38 void Update () { 39 if (Input.GetKey(KeyCode.Joystick1Button1)) 40 { 41 delta+= Time.deltaTime ; 42 Lv1 = true; 43 // 泡弾 Lv.1 44 if (delta > 2 && Lv1) 45 { 46 Instantiate(BulletPrefab, prevPos, my_Trans.rotation); 47 delta = 0; 48 Debug.Log("Lv.1"); 49 Lv1 = false; 50 Lv2 = true; 51 52 //泡弾 Lv.2 53 if (delta > 4 && Lv2) 54 { 55 BulletPrefab.transform.localScale = new Vector3(3, 3, 3); 56 Instantiate(BulletPrefab, prevPos, my_Trans.rotation); 57 delta = 0; 58 Lv2 = false; 59 Lv3 = true; 60 Debug.Log("Lv.2"); 61 62 //泡弾 Lv.3 63 if (delta > 7 && Lv3) 64 65 { 66 BulletPrefab.transform.localScale = new Vector3(6, 6, 6); 67 Instantiate(BulletPrefab, prevPos, my_Trans.rotation); 68 delta = 0; 69 Debug.Log("Lv3"); 70 Lv3 = false; 71 72 } 73 } 74 75 } 76 } 77 //ボタンなしの連射機能 78 //delta += Time.deltaTime; 79 //if (delta > BulletCount) 80 //{ 81 // delta = 0; 82 // Instantiate(BulletPrefab, prevPos, my_Trans.rotation); 83 // audiosource.PlayOneShot(clip); 84 // // Debug.Log("生成"); 85 //} 86 87 // } 88 } 89 void setup() 90 { 91 prevPos = this.transform.position; 92 } 93 private void FixedUpdate() 94 { 95 PlayerMove(); 96 } 97 void PlayerMove() 98 { 99 //移動処理 100 float dy = Input.GetAxis("Vertical") * Playerspped; 101 float dx = Input.GetAxis("Horizontal") * Playerspped; 102 rb2d.Sleep(); 103 104 if ((dx > -0.2f && dx < 0.2f) && (dy < 0.2f && dy > -0.2f)) 105 { 106 107 return; 108 } 109 110 rb2d.velocity = new Vector2(dx, dy); 111 112 //スティック傾き取得 113 float angle = Mathf.Atan2(-dx, dy); 114 float p_angle = (angle) / (Mathf.PI * 2) * 360; 115 this.transform.rotation = Quaternion.Euler(0, 0, p_angle); 116 117 if (dy != 0 || dx != 0) 118 { 119 var diff = (target_to_Move.position - transform.position).normalized; 120 transform.rotation = Quaternion.FromToRotation(Vector3.up, diff); 121 122 } 123 124 125 ////角度計算 126 var nowPos = this.transform.position; 127 128 float x = this.transform.position.x - prevPos.x; 129 float y = this.transform.position.y - prevPos.y; 130 131 Vector2 vec = new Vector2(x, y).normalized; 132 133 134 float rot = Mathf.Atan2(vec.y, vec.x) * 180 / Mathf.PI; 135 if (rot > 180) rot -= 360; 136 if (rot < -180) rot += 360; 137 138 prevPos = nowPos; 139 140 // Debug.Log("Angle = " + rot); 141 prevPos = this.transform.position; 142 143 144 // ShootNWay(,bulletSpeed,BulletCount) 145 146 147 } 148 149 private void OnTriggerEnter2D(Collider2D collision) 150 {    151 //Playerのダメージ計算 152 if(collision.gameObject.name == "Enemy") 153 { 154 PlayerHP = PlayerHP - 1; 155 } 156 } 157} 158 159

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

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

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

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

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

coco_bauer

2018/07/03 01:15

updateは、どこから呼び出されるのですか? BulletPrefab, prevPos, my_Transなど、定義が判らない変数が多数でてきますから、コードの一部のみが質問に書かれているのではないかと思われます。動作が理解できるぐらいのコードは必須です。「しようとした」と書かれていますが、やった結果はどうなったのでしょうか。何が問題で、どこで躓いているのかを明らかにしてください。
YAmaGNZ

2018/07/03 01:23

まず、提示されたコードではLV2以降の判断へ到達できません。 「最後のInstantiateの部分の処理のみが通っており」とはLV3の処理と読み取れますが合ってますか?
GOTOken

2018/07/03 01:31

coco_bauer さん すみません。原因箇所がそこだけで大丈夫という自身の認識のみでしてしまいました。
GOTOken

2018/07/03 01:35

YAmaGNZ さん そうですね。 if (delta > 7 && Lv3) { BulletPrefab.transform.localScale = new Vector3(6, 6, 6); Instantiate(BulletPrefab, prevPos, my_Trans.rotation); delta = 0; Debug.Log("Lv3"); Lv3 = false; return; }ここの箇所のことを指しています。
guest

回答1

0

ベストアンサー

掲載コードを簡略化すると下記のようになります。

C#

1if (delta > 2) //-------① 2{ 3 delta = 0; 4 Debug.Log("Lv.1"); 5 if (delta > 4) 6 { 7 delta = 0; 8 Debug.Log("Lv.2"); 9 if (delta > 7) 10 { 11 Debug.Log("Lv.3"); 12 } 13 } 14}

deltaが2より大きくなったときに①のif文の条件を満たします。
それで、そのif文の中でdeltaを0にしているので、これ以降の判断(LV2以降の判断)は絶対に条件を満たしません。

これで、LV3の部分が実行されるというのは考えられないのですが、本当に掲載コードは合っていますか?
また、Debug.Logの出力時がそのレベルに到達した時だと思いますが、この条件を素直に読むと
deltaが
0~2:LV.0
2~4:LV.1
4~7:LV.2
7~ :LV.3
と読めますが、どうなのでしょうか?

これだけだとなんなので、提示条件ですと、

C#

1int LV =0; //事前に定義 2 3//Update内 4if (delta < 2){ 5 if (LV != 1) 6 { 7 Debug.Log("Lv.1 Start"); 8 LV = 1; 9 } 10 Debug.Log("Lv.1"); 11} 12else if (2 <= delta && delta < 4){ 13 if (LV != 2) 14 { 15 Debug.Log("Lv.2 Start"); 16 LV = 2; 17 } 18 Debug.Log("Lv.2"); 19} 20else if (4 <= delta){ 21 if (LV != 3) 22 { 23 Debug.Log("Lv.3 Start"); 24 LV = 3; 25 } 26 Debug.Log("Lv.3"); 27} 28 29//ボタンが離された時 30if (Input.GetKeyUp(KeyCode.Joystick1Button1)) 31{ 32 switch (LV) 33 { 34 case 1: 35 //LV1発射 36 break; 37 case 2: 38 //LV2発射 39 break; 40 case 3: 41 //LV3発射 42 break; 43 } 44 delta = 0; 45 LV = 0; 46}

と書くなりできます。
参考にしてください。

投稿2018/07/03 02:20

編集2018/07/03 03:05
YAmaGNZ

総合スコア10222

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

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

GOTOken

2018/07/03 02:32

ソースコードはそのまま記載しました。 実行画面でみると、生成する際のLv1時に設定しているサイズより大きいオブジェクトが生成されたので、処理がLv3が通っているという認識を持っていました。 なるほど。その通った処理の終了後に初期化のような処理をしようとしていたのですが、それでは駄目だったのですね。 ありがとうございます。実際に試して見ます。
YAmaGNZ

2018/07/03 02:40

各レベルで初回のみ処理したいことがあるのなら、レベルで分岐した後にフラグ等で判断すればよいかと思います。
GOTOken

2018/07/03 02:51

自分なりに考えた案ですが、 if (Input.GetKey(KeyCode.Joystick1Button1)) { Debug.Log("押した"); delta += Time.deltaTime; Lv1 = true; //泡弾 Lv1 if (Lv1) { if (Input.GetKeyUp(KeyCode.Joystick1Button1)) Instantiate(BulletPrefab, prevPos, my_Trans.rotation); Debug.Log("Lv.1"); Lv1 = false; delta = 0; } //Lv2 泡弾時間計測判定 if (delta > 5) { Lv2 = true; if (Lv2) { if (Input.GetKeyUp(KeyCode.Joystick1Button1)) Instantiate(BulletPrefab, prevPos, my_Trans.rotation); Debug.Log("Lv.2"); Lv2 = false; delta = 0; } } if (delta > 10) { Lv3 = true; if (Lv3) { if (Input.GetKeyUp(KeyCode.Joystick1Button1)) Instantiate(BulletPrefab, prevPos, my_Trans.rotation); Debug.Log("Lv3"); Lv3 = false; delta = 0; } }   } このようにして遷移をしようとしましたが、思ったとおりになりませんでしたので、 YAmaGNZ さん の意見を取り入れて実行してみたいと思います。
YAmaGNZ

2018/07/03 02:56

今回の処理は、いわゆる「溜めている間」の処理だと思っていたのですが、ボタンが離されたときの発射の部分も考慮ということでしょうか。 そういう場合の処理はまた別に書いたほうがすっきりするかと思います。
GOTOken

2018/07/03 03:56

void Update() { if (Input.GetKey(KeyCode.Joystick1Button1)) { delta += Time.deltaTime; if (delta < 2) { if (LV != 1) { Debug.Log("Lv.1 Start"); LV = 1; } Debug.Log("Lv.1"); } else if (2 <= delta && delta < 4) { if (LV != 2) { Debug.Log("Lv.2 Start"); LV = 2; } Debug.Log("Lv.2"); } else if (4 <= delta) { if (LV != 3) { Debug.Log("Lv.3 Start"); LV = 3; } Debug.Log("Lv.3"); } if (Input.GetKeyUp(KeyCode.Joystick1Button1)) { switch (LV) { case 1: Instantiate(BulletPrefab, prevPos, my_Trans.rotation); Debug.Log("生成Lv1"); break; case 2: BulletPrefab.transform.localScale = new Vector3(3, 3, 3); Instantiate(BulletPrefab, prevPos, my_Trans.rotation); Debug.Log("生成Lv2"); break; case 3: BulletPrefab.transform.localScale = new Vector3(6, 6, 6); Instantiate(BulletPrefab, prevPos, my_Trans.rotation); Debug.Log("生成Lv3"); break; } } } delta = 0; LV = 0; } 参考にして書き換えました。deltaTimeの数値が上昇しなくなってしまったのですが、この原因はわかりますか・・・?
YAmaGNZ

2018/07/03 04:04

もしかして、Updateが呼ばれるたびにdelta=0を通ってませんか? ボタンが離された時のみdeltaをクリアすべきです。
GOTOken

2018/07/03 04:12

書き換えをした際に数値の変動を確認することができました。 また、Lvの変動も確認することができましたが、 Input.GetKeyUp(Keycode.Joystick1Button1)の方の処理が通っていないようなのですが、これはInput.GetKey(Keycode.Joystick1Button1)のif文の中に書けば良いのですかね・・・?
GOTOken

2018/07/03 04:13

ごめんないさい。if文の中に記述していました。
YAmaGNZ

2018/07/03 05:22

「ボタンが押されている」処理の中に「ボタンが離された」場合のことを書いても動きません。 Input.GetKey(Keycode.Joystick1Button1)のif文とは別に書きましょう。 もしかしたら、GetKeyUpはボタンが「離されているとき」にtrueを返すと思われているのでしょうか? GetKeyUpはボタンが「押されている状態から離された状態に変化した時のみ」trueを返します。
GOTOken

2018/07/03 05:55

なるほど!理解しました。 おって、さらにの問題なのですが、生成時にオブジェクトをLvに応じて変化させる(Scale)。とゆうのを組んでいたのですが、どのレベルにもnew Vector3(3,3,3)が適応されているのですが、ここの解決方法を考えてみたのですがわかりません。
YAmaGNZ

2018/07/03 06:10

具体的なコードがないのでいまいち理解できていませんが、 //ボタンが離された時 if (Input.GetKeyUp(KeyCode.Joystick1Button1)) { Vector3 scale = new Vector3(3,3,3); switch (LV) { case 1: //LV1発射 ○○ = scale; break; case 2: //LV2発射 ○○ = scale; break; case 3: //LV3発射 ○○ = scale; break; } } みたいなことでしょうか?
GOTOken

2018/07/03 06:14

イメージではLv1 scale = (1,1,1) Lv2 scale = (3,3,3) Lv3 scale = (6,6,6) にしたいと思っていました。 たぶん、イメージは間違ってないような気もします。。
YAmaGNZ

2018/07/03 06:26

では、 Vector3[] scales = new Vector3[]{new Vector3(1,1,1),new Vector3(3,3,3),new Vector3(6,6,6)} みたいにを配列で持って、 ○○ = scales[LV-1]; とするのはどうでしょう?
GOTOken

2018/07/03 06:40

無事実装することができました。ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問