UnityのInput Field日本語入力挙動まとめ（iOS / Android）

UnityのInputFieldに日本語を入力した際の、iOS実機とAndroid実機の挙動をまとめました。
なお、似たような環境でもバージョンや利用ソフトウェアによって挙動が変わる可能性が十分ありますので（特にAndroid）、懸念がある場合は自前で検証した方が良いと思います。

#検証内容
- UnityでInput Fieldを作成し、イベント（On Value ChangedとEnd Edit）で飛んでくるstringの内容と文字コードを実機で確認した
- Line Typeを"Single Line", "Multi Line Submit", "Multi Line Newline"と変えて試したが、結果はほぼ変わらなかったため、変わった部分のみ個別に記載した。

#検証結果
以下、「文字列全体」という表記は、「確定済み分を含めて、それまで入力した同フィールド内の文字列全て」という意味で書いています。

##【iPhone 6s(OS9.3.5 / 10.0.2) + iOS標準IME】
この環境は、音声入力doneタップ時の文字コードが謎でした。OSを9.3.5→10.0.2に上げても、確認した操作の挙動は全て同じでした。

| 端末での操作 | イベント周りの挙動 |
|:-----------|:-----------|
|フリック入力中|1文字ごとにOn Value Changedで、その時点の文字列全体が渡される|
|ローマ字入力中|アルファベット1文字ごとにOn Value Changedで、その時点の文字列全体が渡される。<br>例: "ohayou"と打った場合、お→おh→おは→おはy→おはよ→おはよう、となる|
|無変換で確定|（イベント無し）|
|変換候補選択中|（イベント無し）|
|変換確定|On Value Changedで確定後の文字列全体が渡される|
|文字列ペースト|On Value Changedでペースト後の文字列全体が渡される|
|改行|End Editで確定済みの文字列全体が渡され、キーボードが引っ込む。<br>Multi Line Newlineのみ、On Value Changedで、改行コードとして0Aが追加された文字列全体が渡される|
|確定操作（Doneボタン、入力フィールド外をタップ）|End Editで確定済みの文字列全体が渡され、キーボードが引っ込む|
|音声入力中|On Value Changedで、変換できた単位（※推測です）ごとに都度その時点の文字列全体（今回の音声入力開始より前に入力済みの文字列を含む）が渡される。つまり話している間何度も呼ばれる。<br>・途中で変換結果が変わる事がある。例: 「かそうぱーてぃー」と発声すると、仮→仮想→仮装→仮装パーティー、という計4回のOn Value Changedが発生する。<br>・1言目と2言目以降で挙動が違う。「てすと（間を置く）てすと（間を置く）てすと」と3回発声した場合、テ→テス→テスト→テストテスト→テストテストテスト、となる。|
|音声入力確定|通常の確定操作（Doneボタン、入力フィールド外をタップなど）の場合は通常の確定と同じ。<br>音声入力時のみ出てくる最下部のDoneボタン（ビジュアライズ部分の下中央のDone）をタップした場合、まずOn Value Changedで確定後の文字列全体の末尾にUnicodeの"OBJECT REPLACEMENT CHARACTER"、Hexだと"efbfbc"が付加された文字列が渡され、続いてこの"OBJECT REPLACEMENT CHARACTER"を除いた本来の確定後の文字列全体が同じくOn Value Changedで渡される。|

##【Xperia(4.4.2)+Google日本語入力2.18.2581.3.129228829-armeabi-v7a】
この環境は、音声入力時に時々謎の挙動があります。

| 端末での操作 | イベント周りの挙動 |
|:-----------|:-----------|
|フリック入力中|（iOSと同じ。以下転記）<br>1文字ごとにOn Value Changedで、その時点の文字列全体が渡される|
|ローマ字入力中|（iOSと同じ。以下転記）<br>アルファベット1文字ごとにOn Value Changedで、その時点の文字列全体が渡される。<br>例: "ohayou"と打った場合、お→おh→おは→おはy→おはよ→おはよう、となる|
|無変換で確定|（イベント無し）|
|変換候補選択中|（カーソルを動かして変換候補を選ぶという操作が存在しない）|
|変換確定|（iOSと同じ。以下転記）<br>On Value Changedで確定後の文字列全体が渡される|
|文字列ペースト|（iOSと同じ。以下転記）<br>On Value Changedでペースト後の文字列全体が渡される|
|改行|（iOSと同じ。以下転記）<br>End Editで確定済みの文字列全体が渡され、キーボードが引っ込む。<br>Multi Line Newlineのみ、On Value Changedで、改行コードとして0Aが追加された文字列全体が渡される|
|確定操作（Doneボタン、入力フィールド外をタップ）|End Editで確定済みの文字列全体が渡され、キーボードが引っ込む。<br>Multi Line Newlineの際、末尾の改行が（連続している場合は連続している範囲全て）削除され、その文字列全体がOn Value Changed、End Editと連続して渡される。|
|音声入力中|On Value Changedで、変換できた単位（※推測です）ごとに都度その時点の文字列全体（今回の音声入力開始より前に入力済みの文字列を含む）が渡される。つまり話している間何度も呼ばれる。<br>iOSとの違いとして、それなりの長さまでまとめて変換され、後で変換が変わる事はない模様（少なくとも試した範囲では起きませんでした）。<br>例: 「かそうぱーてぃー」と発声すると、一発で「仮装パーティー」が入力される。結構長めの文章を喋ると、句読点くらいの単位で変換されたものがまとめて飛んでくる。<br>ただ、発生条件は不明だが、たまに以下のような挙動になる時があった。<br>・「とうきょうです」と発声→「東京です」「」「東京です」の3回On Value Changedが呼ばれる<br>・「とうきょうです」と発声→「東京です」「東京」「東京です」の3回On Value Changedが呼ばれる|
|音声入力確定|通常の確定操作（Doneボタン、入力フィールド外をタップなど）の場合は通常の確定と同じ。<br>音声入力を終わらせるXボタンをタップした場合、単にキーボード表示に戻り、何もイベントは飛ばない。|

##【Xperia(4.4.2)+POBox touch6.3（Xperia標準IME）】
この環境は、音声入力時にフォーカスが外れてしまうのがかなり厳しいです。

| 端末での操作 | イベント周りの挙動 |
|:-----------|:-----------|
|フリック入力中|（iOSと同じ。以下転記）<br>1文字ごとにOn Value Changedで、その時点の文字列全体が渡される|
|ローマ字入力中|（iOSと同じ。以下転記）<br>アルファベット1文字ごとにOn Value Changedで、その時点の文字列全体が渡される。<br>例: "ohayou"と打った場合、お→おh→おは→おはy→おはよ→おはよう、となる|
|無変換で確定|（イベント無し）|
|変換候補選択中|候補選択カーソルを動かして候補が変わるたびに、On Value Changedでその候補に置き換わった文字列全体が渡される|
|変換確定|（イベント無し）|
|文字列ペースト|（iOSと同じ。以下転記）<br>On Value Changedでペースト後の文字列全体が渡される|
|改行|（iOSと同じ。以下転記）<br>End Editで確定済みの文字列全体が渡され、キーボードが引っ込む。<br>Multi Line Newlineのみ、On Value Changedで、改行コードとして0Aが追加された文字列全体が渡される|
|確定操作（Doneボタン、入力フィールド外をタップ）|（Google日本語入力と同じ。以下転記）<br>End Editで確定済みの文字列全体が渡され、キーボードが引っ込む。<br>Multi Line Newlineの際、末尾の改行が（連続している場合は連続している範囲全て）削除され、その文字列全体がOn Value Changed、End Editと連続して渡される。|
|音声入力中|音声入力をすると変換候補リストが表示されてタップで確定する→音声入力表示が閉じるが、元の画面で入力フィールドからフォーカスが外れた状態で復帰してしまう（End Editが呼ばれている）。その後何らかの入力フィールドをタップすると、そこで一気に入力された扱いとなってそのフィールドに音声入力した文字列が入る。その入力フィールドが入力済みだった場合、全体選択状態になった上で自動的に音声入力した文字列が入力された形となるため、結果として入力済み文字列は消えて音声入力したもののみが残る。また、音声入力前に途中まで入力していた場合（未確定のものがあった場合）、それはキャンセルされる。|
|音声入力確定|（上記の説明参照）|

#補足
Android 5については気になるので後日追加で検証、追記するつもりです。