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

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

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

UIテストは、エンドツーエンドのテストのことで、人間がチェックする際と同じ内容をテストが自動で行います。UIの操作はもちろん、サーバーへのレスポンスやリクエスト、サーバーでのロジック処理など、全レイヤーを通してテストすることが可能。汎用性が高い点も特長です。

C#

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

Unity3D

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

Q&A

0回答

561閲覧

Unityでキーを押しも反応するときとしない時がある

taiki345678

総合スコア0

UIテスト

UIテストは、エンドツーエンドのテストのことで、人間がチェックする際と同じ内容をテストが自動で行います。UIの操作はもちろん、サーバーへのレスポンスやリクエスト、サーバーでのロジック処理など、全レイヤーを通してテストすることが可能。汎用性が高い点も特長です。

C#

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

Unity3D

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

0グッド

0クリップ

投稿2022/06/24 04:34

Enterを押しても反応するときとしない時がある

Unityで会話イベントを実装しました。
NPCのコライダーの中に入り、Enterを押すとButtonが表示され、会話することができるというスクリプトです。この時、Enterを押して反応するときとしない時があります。また、反応するまでの回数もバラバラです

YouTube にあった動画からこのプログラムを見つけました。

試したこと

「Unity 反応するときとしない時がある」で検索し、解決方法を探しました。
Buttonが反応しない時の対処法を試してみましたが、どうしても問題が解決しなかったので質問させていただきました。

操作するplayerに付けるスクリプト

C#

1using System; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.InputSystem; 5using UnityEngine.UI; 6using static TalkPlayer; 7 8public partial class TalkPlayer : MonoBehaviour 9{ 10 public Text talkText; 11 public Button talkButton; 12 public AudioClip talkSound; 13 public static TalkPlayer controller; 14 TalkObject _talkObject; 15 AudioSource _audioSource; 16 bool _isWriting = false; 17 int _lineIndex = -1; 18 List<Line> _allLines; 19 float _charIntervalSec = 0.0f; 20 bool _canReloadThisFrame = false; 21 List<char> _muteChars = new List<char>() 22 { 23 ' ', ' ', ',' , '、', '。', '「', '」', '!', '?', 24 }; 25 public void Start() 26 { 27 _audioSource = talkText.gameObject.AddComponent<AudioSource>(); 28 _audioSource.playOnAwake = false; 29 _audioSource.clip = talkSound; 30 controller = this; 31 } 32 public void Update() 33 { 34 _canReloadThisFrame = true; 35 } 36} 37 38public partial class TalkPlayer 39{ 40 public void ReloadObject(TalkObject talkObject) 41 { 42 talkObject.SetIsTalking(true); 43 _canReloadThisFrame = false; 44 _talkObject = talkObject; 45 _allLines = talkObject.Words; 46 _lineIndex = -1; 47 } 48 public bool CanReloadThisFrame { get => _canReloadThisFrame; } 49 public void ShowTextArea() 50 { 51 controller.talkText.gameObject.SetActive(true); 52 controller.talkButton.gameObject.SetActive(true); 53 controller.ClearLines(); 54 } 55 public void HideTextArea() 56 { 57 controller.ClearLines(); 58 controller.talkText.gameObject.SetActive(false); 59 controller.talkButton.gameObject.SetActive(false); 60 } 61 public void WriteLine() 62 { 63 _charIntervalSec = _talkObject.CharIntervalSec; 64 StartCoroutine(IEWrite(_allLines[_lineIndex].text)); 65 } 66 public void ClearLines() 67 { 68 talkText.text = ""; 69 } 70 void StartNewLineIfNotEmpty() 71 { 72 if (talkText.text != "") 73 { 74 talkText.text += "\n"; 75 } 76 } 77 void ReadNext() 78 { 79 _lineIndex += 1; 80 var line = _allLines[_lineIndex]; 81 switch (line.lineType) 82 { 83 case LineType.SkipOn: 84 StartNewLineIfNotEmpty(); 85 WriteLine(); 86 break; 87 case LineType.SkipOff: 88 StartNewLineIfNotEmpty(); 89 WriteLine(); 90 break; 91 case LineType.Clear: 92 ClearLines(); 93 // 再帰呼び出し 94 ReadNext(); 95 break; 96 } 97 } 98 public void PushAction() 99 { 100 _canReloadThisFrame = false; 101 if (_talkObject == null) return; 102 if (_isWriting) 103 { 104 if (_lineIndex < 0) 105 { 106 _isWriting = false; 107 return; 108 } 109 if (_allLines[_lineIndex].lineType == LineType.SkipOn) 110 { 111 _charIntervalSec = 0f; 112 } 113 } 114 else if (_allLines.Count - 1 <= _lineIndex) 115 { 116 _isWriting = false; 117 _talkObject.DidTalk(); 118 _talkObject.SetIsTalking(false); 119 return; 120 } 121 else 122 { 123 ReadNext(); 124 } 125 } 126 System.Collections.IEnumerator IEWrite(string lineText) 127 { 128 _isWriting = true; 129 foreach (char c in lineText) 130 { 131 talkText.text += c; 132 if (!_muteChars.Contains(c)) 133 { 134 _audioSource.Play(); 135 } 136 yield return new WaitForSeconds(_charIntervalSec); 137 } 138 _isWriting = false; 139 } 140} 141 142public partial class TalkPlayer 143{ 144 public enum LineType 145 { 146 SkipOn, 147 SkipOff, 148 Clear, 149 } 150 public interface Line 151 { 152 LineType lineType { get; } 153 String text { get; } 154 } 155 public class SkipOn : Line 156 { 157 public LineType lineType { get => LineType.SkipOn; } 158 public String text { get; } 159 public SkipOn(String text) 160 { 161 this.text = text; 162 } 163 } 164 public class SkipOff : Line 165 { 166 public LineType lineType { get => LineType.SkipOff; } 167 public String text { get; } 168 public SkipOff(String text) 169 { 170 this.text = text; 171 } 172 } 173 public class Clear : Line 174 { 175 public LineType lineType { get => LineType.Clear; } 176 public String text { get => null; } 177 } 178} 179 180public class TalkObject : MonoBehaviour 181{ 182 bool _isTalking = false; 183 bool _canAction = true; 184 public void Start() 185 { 186 var talkArea = gameObject.AddComponent<SphereCollider>(); 187 talkArea.isTrigger = true; 188 talkArea.radius = MaxDistance; 189 } 190 public void Update() 191 { 192 _canAction = true; 193 } 194 public virtual float MaxDistance { get => 5.0f; } 195 public virtual Key PushActionKey { get => Key.Enter; } 196 public virtual List<Line> Words 197 { 198 get => new List<Line>() 199 { 200 new SkipOn("これはデフォルトのメッセージです"), 201 }; 202 } 203 public virtual float CharIntervalSec { get => 0.1f; } 204 public virtual void OnPlayerEnter() { } 205 public virtual void WillTalk() 206 { 207 controller.ReloadObject(this); 208 controller.ShowTextArea(); 209 controller.PushAction(); 210 } 211 public virtual void DidTalk() 212 { 213 controller.HideTextArea(); 214 } 215 public virtual void OnPlayerExit() 216 { 217 DidTalk(); 218 } 219 public void SetIsTalking(bool isTalking) 220 { 221 _isTalking = isTalking; 222 } 223 void OnTriggerEnter(Collider other) 224 { 225 if (other.gameObject.GetComponent<TalkPlayer>() != null) OnPlayerEnter(); 226 } 227 void OnTriggerStay(Collider other) 228 { 229 if (other.gameObject.GetComponent<TalkPlayer>() != null) 230 { 231 if (Keyboard.current?[PushActionKey].wasPressedThisFrame ?? false) 232 { 233 if (!_canAction) return; 234 _canAction = false; 235 if (_isTalking) 236 { 237 controller.PushAction(); 238 } 239 else if (controller.CanReloadThisFrame) 240 { 241 WillTalk(); 242 } 243 } 244 } 245 } 246 void OnTriggerExit(Collider other) 247 { 248 if (other.gameObject.GetComponent<TalkPlayer>() != null) OnPlayerExit(); 249 } 250}

話しかけるキャラに着けるスクリプト

C#

1using System.Collections.Generic; 2using static TalkPlayer; 3 4public class Sample01 : TalkObject 5{ 6 // 7 // SkipOn: スキップできるテキスト 8 // SkipOff: スキップできないテキスト 9 // Clear: ここで文字を全部消す 10 // 11 public override List<Line> Words 12 { 13 get => new List<Line>() 14 { 15 new SkipOn("おはようございます、これは1番目のメッセージです"), 16 new SkipOn("こんにちは、これは2番目のメッセージです"), 17 new Clear(), 18 new SkipOff("こんばんは、これは3番目のメッセージです"), 19 new SkipOn("おやすみなさい、これは4番目のメッセージです"), 20 new SkipOn("これでメッセージの表示を終わります"), 21 }; 22 } 23}

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

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

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

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

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

fiveHundred

2022/06/24 06:13

(旧型式の)Inputクラスの関数やプロパティをOnTriggerStay()などで呼び出すと正しく動作しない、という仕様が存在します。 あなたが使われているのは、新形式のInput Systemですが、同じようにOnTriggerStay()内で呼び出されているため、これが原因になっているかもしれません。 OnTriggerStay()ではなく、Update()などで判定させた場合、どのようになりますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問