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

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

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

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

Q&A

解決済

3回答

907閲覧

unityでタイピングゲームを作った時の高速タイパー向け入力受付について

kaji

総合スコア648

C#

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

0グッド

1クリップ

投稿2017/11/19 17:07

編集2017/11/19 17:16

前提としてUnityの場合キータイプの入力イベントがないため
Updateで回してInputを検知してます。
(前提が間違ってたら教えてください。)

現状は以下の通りfpsを最大値にしてるのですが、
それよりも高速タイパーたちが、速く入力してくるため
どのように解決すればいいかわからないです。
私がやっている以外の解決方法があったら教えて欲しいです。

以下ライブラリを調べましたが、結局はUpdateを回してキー入力検知してました。
http://spi8823.hatenablog.com/entry/2016/12/06/072901
https://qiita.com/AirBeans5956/items/4d9f83fe208944c86f2a#comment-b2f4efb70742e155e3cc

私はタイピングキー入力の瞬間マックスが1000key/min(17key/second)ぐらいなので、問題いのですが、
トップタイパーになると、6000key/min(100key/second)ぐらいはあるのではないかと思います。
瞬間というのは0.1sec単位とかそいういう単位での最高速度です。

フレームレートを10にしたところ自分での入力の受付をしてくれないことは確認しました。

デフォルトのフレームレートが60ぐらいなので、以下の通り、

フレームレート変更のために
こちらのサイトからfps関連項目のvsyn ccountをdont syncにして、
http://smartgames.hatenablog.com/entry/2016/06/15/000632

とおりフレームレートを変更しました。

以下コードで有効になっていることを確認しました。

Application.targetFrameRate = 1200; Debug.Log ("Application.targetFrameRate="+Application.targetFrameRate); // 1200

以下の通りfpsを実測して見ましたが、

 float timeTrigger;  float timeRate = 1f;  public override void Update() {   i++;    if (Time.time > timeTrigger) {    Debug.Log ("i=" + i);    i = 0;    timeTrigger = Time.time + timeRate;   }  }

実際のfpsは以下の通りでした。

*fpsをまったく変更しないデフォ(vsyn ccount:every v blank)の場合:i=60 *vsyn ccount:every second v blankの場合:i=30 以下はvsyn ccount:dont syncにして、fps可変してます。 *Application.targetFrameRate = 10の場合:i=10 *Application.targetFrameRate = 30の場合:i=30 *Application.targetFrameRate = 60の場合:i=60 *Application.targetFrameRate = 90の場合:i=75 *Application.targetFrameRate = 120;の場合:i=80 *Application.targetFrameRate = 160;の場合:i=80 *Application.targetFrameRate = 1200;の場合:i=80

公式で

https://docs.unity3d.com/jp/540/ScriptReference/Application-targetFrameRate.html

targetFrameRateを設定しても、そのフレームレートは保証されません。プラットフォームの仕様によって変動する可能性があります。また、アプリケーションが処理能力を使用しているため、ゲームでフレームレートが得られないことがあります。

とあるためfps80以上は難しそうです。

現状fpsを最大値にしてるのですが、入力抜けの報告が入ってます。
トップタイパーによる入力抜けの対応は諦めるしかないでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

http://www.sophiehoulden.com/super-fast-input-in-unity/
この記事ではMonoBehaviourのOnGUIメソッドが「フレームレートから独立した即時モードであること」を利用したキーの高速入力対応が紹介されています。平たく言うとOnGUI内でEvent.currentを参照すればキーが押された瞬間にキーのイベントが取れる、とされています。なので、OnGUIで入力情報をキューイングしておき、Updateでキューイングされた情報を入力順に解決していけばどんな速度で入力されてもUpdateで情報抜けなく処理できる、ということになります。

https://docs.unity3d.com/jp/540/ScriptReference/Event-keyCode.html

投稿2017/11/21 00:27

編集2017/11/21 00:56
masaya_ohashi

総合スコア9206

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

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

kaji

2017/11/26 04:50

回答ありがとうございます。masayaさんのおかげで解決できました。
masaya_ohashi

2017/11/27 00:25

ちょっとずれた回答の汚名返上ができてよかったです。
guest

0

fpsは機種によっても変動する為、確かに一定値以上の上昇は見込めないと思います。
(ちなみにゲーム部分をリッチにすると、それだけで常時80fpsを保つのは難しくなります)

速度計測をしていないので確実か分かりませんが、
uGUI(Unity標準GUI)のInputFieldを利用してはいかがでしょうか。
Unity - マニュアル: Input Field

「On Value Change」が1フレーム1回の壁を越えるか未調査ですが、
内部の処理を何とか駆使すれば希望の動作は出来るのではないかと思います。
(基本は「入力された→何らかの処理→入力内容消す」としておき、もし入力文字が複数になっていたら1文字ずつ処理する、等)

投稿2017/11/20 02:25

sakura_hana

総合スコア11425

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

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

kaji

2017/11/26 04:56

こちらの対応前にOnGUI内でEvent.currentを試したところ解決できました。ご回答ありがとうございました。
guest

0

トップタイパーになると、6000key/min(100key/second)ぐらいはあるのではないかと思います。

Ultimate Typing Championshipというアメリカの大会の2010年覇者であるarenasnow氏でおよそ1000cpm(分間1000英字)なので、秒間16.666文字、1文字0.06秒くらいが世界最速ということになります。60FPSですら0.016秒間隔で取得していることになるので、1タイプあたり3回以上はUpdateで判定していることになります。秒間100文字という人間辞めましたレベルの速度を想定するのは杞憂かと思います。

arenasnow氏のページ
http://www.seanwrona.com/typing.php

追記

実際に抜けが発生しているとのことですが、何か速度以外の別の問題がある、もしくは「抜けが発生」と言っている人の気のせい(機械のせいにしたい)ということも考えられるのではないでしょうか。

投稿2017/11/20 08:13

編集2017/11/20 08:25
masaya_ohashi

総合スコア9206

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

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

kaji

2017/11/20 12:02

秒間16.666文字というのはある程度の長文での計測の平均なので、その程度になります。 今回は、入力判定なので、キー入力の瞬間(0.1sec単位)マックスでの速度になり、6000key/min(100key/second)ぐらいなのではと予想してます。 つまり長文の中のある2文字の間が瞬間6000key/minを超える速度で入力された時に発生してしまいます。 実際に抜けが発生しているというのは複数人から報告があり、 彼らの常人を超えた速度と今回の組み込みロジックを勘案すると 処理抜けはありえると思ってます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問