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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

3回答

1909閲覧

【Unity】ドアの開閉を「E」キーで実装したが、「E」キーを連打するとパカパカ動いてしまう

motumiN

総合スコア1

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/12/11 12:01

【初心者】ドアの開閉を「E」キーで実装したが、「E」キーを連打するとパカパカ動いてしまう

【オブジェクト情報】
HikidoにAnimator(DoorAnim)とBoxCollider
PlayerにPlayerTag
DoorAnimは(Has Exit Timeチェックなし)
・Idle →True→ OpenHikido
・OpenHikido →False→ CloseHikido
・CloseHikido →True→ OpenHikido

発生している問題

現状「E」キーを押下するとドアが開閉するAnimは再生されるのですが、「E」キーを連打するとパカパカと高速で開いたり閉じたりを繰り返してしまいます。
どうすれば、連打した時ドアがパカパカしなくなりますか?
初心者で申し訳ないのですが、これを理解できたら応用ができると思うので教えてくださると、とても助かります

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EventHikido : MonoBehaviour
{

public bool isNear; private Animator animator; void Start() { isNear = false; animator = transform.GetComponent<Animator>(); } void Update() { if (Input.GetKeyDown(KeyCode.E) && isNear) { animator.SetBool("OpenBool", !animator.GetBool("OpenBool")); } } void OnTriggerEnter(Collider col) { if (col.tag == "Player") { isNear = true; } } void OnTriggerExit(Collider col) { if (col.tag == "Player") { isNear = false; } }

}

試したこと

  • 「unity ドア開閉」「unity ドアぱかぱか」等で検索して出てきたスクリプトを色々と試して見ましたが解決にならなかったです。
  • Has Exit Timeにチェックしてみての動作

┗チェックするとAnimの最後まで行ってから切り替わると検索したら出てたので試しました。

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

Unity 2020.3.24f1

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

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

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

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

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

y_waiwai

2021/12/11 23:01

連打したら、その分開くというのは当然の動作ですが、 それをどういうふうにしたいんでしょうか
motumiN

2021/12/12 11:19

どうしたいかを記載してなかったですね、申し訳ないです。 やりたいことは、「E」キーを押した際3秒間のインターバルが欲しいです。 この3秒間にもう一度「E」キーを押してもAnimが再生されないようにして、3秒後に「E」キーを押した際にAnimが再生される感じにしたいです
guest

回答3

0

ベストアンサー

コメント欄に書いてあるやつでも良いと思いますが
動作の想定としては開閉後に3秒間のクールタイムがるという考え方がしっくりくるので
コルーチンとかで開閉処理をやらせつつ、3秒間は引き戸が再生中みたいな考え方をして実行を弾いてもいいかもしれません

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class EventHikido : MonoBehaviour { 6 7 public bool isNear; 8 private bool isPlay; 9 private Animator animator; 10 11 void Start() { 12 isNear = false; 13 animator = transform.GetComponent<Animator>(); 14 } 15 16 void Update() { 17 if (Input.GetKeyDown(KeyCode.E) && isNear && !isPlay) { 18 StartCoroutine("OpenHikido"); 19 } 20 } 21 22 IEnumerator OpenHikido() { 23 isPlay = true; // この引戸は再生中 24 animator.SetBool("OpenBool", !animator.GetBool("OpenBool")); 25 yield return new WaitForSeconds(3f); // 3秒待つ 26 isPlay = false; // この引戸は再生が終わった 27 } 28 29 void OnTriggerEnter(Collider col) { 30 if (col.tag == "Player") { 31 isNear = true; 32 } 33 } 34 35 void OnTriggerExit(Collider col) { 36 if (col.tag == "Player") { 37 isNear = false; 38 } 39 } 40}

投稿2021/12/13 05:31

hogefugapiyo

総合スコア3302

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

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

motumiN

2021/12/13 07:20

hogefugapiyoさんありがとうございます! コルーチンはあんまり理解してないですけど、分解して理解を深めようと思います! 色々とみなさん初心者な自分に、ご意見等ありがとうございました。
guest

0

3秒間無効にしたいなら次の方法でできると思います。

  1. 現在の時刻を記録する変数を関数外に用意しておく。(関数内だと関数を抜けたときに記録した時刻が消えるため)
  2. 初めて開かれたときに時刻を記録する。
  3. 次に開かれたときに現在時刻と前回記録した時刻との差が3秒以内なら関数を抜ける。
  4. 3秒以上経過していたならそのまま実行する。
  5. 実行したなら記録を消して、次に開いたときに2.の状態になるようにする。

投稿2021/12/12 11:40

vann_2921

総合スコア190

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

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

motumiN

2021/12/12 14:16 編集

まずは回答ありがとうございます。 色々と調べたりvann_2921さんのヒントをもらってこうなったのですが、 これでも大丈夫でしょうか? 実機では「E」キー連打した際に高速でAnimは再生されず、3秒待ってから「E」キー押したら再生されました! できれば、意見、問題等あればご指摘して頂きたいです(追加したところは■) public class EventDoor : MonoBehaviour { // ドアエリアに入っているかどうか private bool isNear; // ドアのアニメーター private Animator animator; ■private float time; void Start() { ■time = 3.0f; isNear = false; animator = transform.GetComponent<Animator>(); } void Update() { ■time +=Time.deltaTime; ■if(time >= 3.0f){ if (Input.GetKeyDown(KeyCode.E) && isNear) { animator.SetBool("OpenBool", !animator.GetBool("OpenBool")); ■time = 0.0f; } } } void OnTriggerEnter(Collider col) { if (col.tag == "Player") { isNear = true; } } void OnTriggerExit(Collider col) { if (col.tag == "Player") { isNear = false; } } }
guest

0

y_waiwaiさん、vann_2921さん、hogefugapiyoさんありがとうございました。
これを参考にさせて頂きます!

using System.Collections; using System.Collections.Generic; using UnityEngine; public class EventHikido : MonoBehaviour { public bool isNear; private bool isPlay; private Animator animator; void Start() { isNear = false; animator = transform.GetComponent<Animator>(); } void Update() { if (Input.GetKeyDown(KeyCode.E) && isNear && !isPlay) { StartCoroutine("OpenHikido"); } } IEnumerator OpenHikido() { isPlay = true; // この引戸は再生中 animator.SetBool("OpenBool", !animator.GetBool("OpenBool")); yield return new WaitForSeconds(3f); // 3秒待つ isPlay = false; // この引戸は再生が終わった } void OnTriggerEnter(Collider col) { if (col.tag == "Player") { isNear = true; } } void OnTriggerExit(Collider col) { if (col.tag == "Player") { isNear = false; } } }

投稿2021/12/13 12:29

motumiN

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問