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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

3回答

1003閲覧

【UnityとC#でゲーム制作】deltatimeを使ったスクリプトがうまく機能しません。

senkiru

総合スコア24

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/01/09 11:54

編集2022/01/09 12:22

ご覧いただきありがとうございます。

Unityで3Dゲームを作っています。

今、キャラクターが光る剣のようなもので
攻撃するモーションを作成しています。

剣を振るときだけ光る刃(ブレード)が表示されるようにしたいのですが、
うまくいきません。

スクリプトで制御して
「BladeOnのあと1秒経ったらBladeOff」
という動作をさせたいです。

以下のスクリプトだと
Onは上手く行っても
「1秒待ってOff」がうまく機能しません。

OnのままでOffになりません。
光りっぱなしです。

どこがおかしいのでしょうか。。。

ちなみにですが、一部スクリプトを変えて
「ボタンを押している間はブレードオン」
「ボタンを離したらブレードオフ」
には成功しています。

private void Update() { // Vが押されたら if (Input.GetKeyDown(KeyCode.V)) { //ブレードをオンにする bbm.GetComponent<BladeOnOff>().BladeOn(); //時間カウント開始 seconds += Time.deltaTime; } //1秒経ったら if (seconds >= 1.0f) { //時間計測を0に戻す seconds = 0f; //ブレードをオフにする bbm.GetComponent<BladeOnOff>().BladeOff(); } } }

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

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

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

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

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

ku__ra__ge

2022/01/09 12:16

コードは```とだけ書いた行で囲むように質問文を修正してください。 普通の文章として提示されるとインデントが消えて読みづらいです。
senkiru

2022/01/09 12:22

アドバイスありがとうございます。 修正いたしました。
guest

回答3

0

(ku__ra__geさんの回答への 2022/01/09 21:26 コメントを受けて回答します。)
vを押して時間計測を始めること自体は間違いではなく、コードが間違っています。
vを押したときの処理としては
1.secondsを0にする
2.時間計測を始める
で実現できると思います。ストップウォッチのイメージです。

時間計測は
seconds += Time.deltaTime; //時間を加算
if(seconds >= 1.0f) //その結果が規定値以上なら
までが1セットなので seconds += Time.deltaTime; がvを押したならのif中にあると時間計測が成立しません。

投稿2022/01/09 20:16

vann_2921

総合スコア190

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

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

senkiru

2022/01/09 22:53

ありがとうございます。 検討させていただきます。
guest

0

ベストアンサー

まずはじめに、Update()が呼ばれた時には2種類の状態があることを認識しないといけません。

1つ目は、ブレードが表示されていない場合で、
2つ目は、ブレードが表示されている場合です。

当たり前のことを言っていますが、このことをきちんと理解しておかなければいけません。

Update()では、2つの状態をわけてコードを書かなければいけません。
となると、Update()は以下のような形になるはずですよね。

C#

1void Update(){ 2 if(ブレードが表示されている){ 3 // ブレードが表示されている時の処理 4 }else{ 5 // ブレードが表示されていない時の処理 6 } 7}

次に、質問者さんが書いたコードを見て、上記2つのどちらの状態の場合の処理か考えていきます。

C#:一部抜粋

1 // Vが押されたら 2 if (Input.GetKeyDown(KeyCode.V)) 3 { 4 //ブレードをオンにする 5 bbm.GetComponent<BladeOnOff>().BladeOn(); 6 7 //時間カウント開始 8 seconds += Time.deltaTime; 9 }

「Vキーが押されたらブレードをオンにする」という処理ですが、これは当然、「ブレードが表示されていない場合」の処理になります。
ところが、「時間カウント開始」のところの seconds += Time.deltaTime; はカウント開始を表していません。経過時間を計算しています。
経過時間の計算とカウント開始をごっちゃに考えてしまっているのが、混乱の元になっていると思われます。

ここでは一旦、カウント開始に焦点を絞って(vann_2921さんの考えと同様に)、secondsを0にするのが良いでしょう。また、それとは別に「ブレードが表示されている」ことを表すフラグも導入したほうが良いです。
以上をふまえて、「ブレードが表示されていない」ときの処理を書くと、

// Vが押されたら if (Input.GetKeyDown(KeyCode.V)) { //ブレードをオンにする bbm.GetComponent<BladeOnOff>().BladeOn(); //時間カウント開始 isBladeOn = true; seconds = 0; }

のような感じになるでしょう。

続いて、

C#:一部抜粋

1 //1秒経ったら 2 if (seconds >= 1.0f) 3 { 4 //時間計測を0に戻す 5 seconds = 0f; 6 7 //ブレードをオフにする 8 bbm.GetComponent<BladeOnOff>().BladeOff(); 9 }

のコードを考えていきます。

こちらは「1秒経ったら、ブレードをオフにする」処理ですので、「ブレードが表示されている」時の処理になります。

「 時間計測を0に戻す」処理は、ブレードが表示されていない時の処理に移動したので、ここでは記述する必要がなくなっていますので、それを省くと、「ブレードが表示されている」時の処理は、

C#

1 if (seconds >= 1.0f) //1秒経ったら 2 { 3 //ブレードをオフにする 4 bbm.GetComponent<BladeOnOff>().BladeOff(); 5 isBladeOn = false; 6 }else{ // 1秒経っていない時 7 // 経過時間の計算 8 seconds += Time.deltaTime; 9 }

となります。

以上をまとめると、Update()のコードは次のようになるでしょう。

C#

1bool isBladeOn = false; 2 3void Update(){ 4 if(isBladeOn){ // ブレードが表示されている時の処理 5 if (seconds >= 1.0f) //1秒経ったら 6 { 7 //ブレードをオフにする 8 bbm.GetComponent<BladeOnOff>().BladeOff(); 9 isBladeOn = false; 10 }else{ // 1秒経っていない時は 11 // 経過時間を計算する。 12 seconds += Time.deltaTime; 13 } 14 }else{ // ブレードが表示されていない時の処理 15 // Vキーが押されたら 16 if (Input.GetKeyDown(KeyCode.V)) 17 { 18 //ブレードをオンにする 19 bbm.GetComponent<BladeOnOff>().BladeOn(); 20 21 //時間カウント開始 22 isBladeOn = true; 23 seconds = 0; 24 } 25 } 26} 27

このように、Unityでは、Update()関数内の処理は状態ごとに場合分けして考える必要があります。

投稿2022/01/13 05:00

JunSuzukiJapan

総合スコア314

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

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

senkiru

2022/04/01 21:11

私は社会人なのですが、趣味で(小学生の頃からの夢で)たまにunityやC#、blenderを構って3Dゲームを作っています。教えていただいて本当にありがとうございました。
guest

0

どこがおかしいのでしょうか。。。

「Vが押されたら」のif文の中で「1秒経ったら」の判定をしていることです。
これではVが押されてなおかつ1秒経っていないとブレードをオフにする処理が実行されません。

投稿2022/01/09 12:14

ku__ra__ge

総合スコア4524

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

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

senkiru

2022/01/09 12:18

アドバイスありがとうございます・ 質問文のスクリプトを訂正いたしました。 「1秒経ったら」のif分を外に出しました。 残念ながら、 やはり私の望むようには挙動してくれません。。。
YAmaGNZ

2022/01/09 12:20

時間足すのもVが押されたらですけど・・・
senkiru

2022/01/09 12:43 編集

YAmaGNZさん コメントありがとうございます。 不慣れではございますが解説させていただきます。 Vを押す ↓ キャラクターが剣を振るモーション開始 &ブレード光らせたい &ここで時間計測開始 ↓ 1秒で剣を降る動作を終える &ここで1秒経ってるので剣が光るのを終える みたいなイメージなのですが、 Vを押してから時間計測を始めるというのは 不適切でしょうか。。。 何分にも初心者でしてスミマセン。。。
YAmaGNZ

2022/01/09 15:09

ログを出力するとかで実際にどのような動作をしているのか確認することをお勧めします。 Vが押された瞬間に加算されますが、それ以外は加算されません。
senkiru

2022/01/09 23:00

ありがとうございます。 検討させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問