Macでの日本語入力まもなくスタート!

Jepiによる

皆さん、こんにちは!東京のリーグ・オブ・レジェンドチームのエンジニア、jepiです。今日はmacOS版リーグ・オブ・レジェンドの日本語入力対応のいきさつについてお話しします。主な内容は、当初サポートされていなかった理由、対処が必要だった様々なLoLのユーザーインターフェース・システム、macOSにおける一般的なテキスト入力の仕組みについてです。

どうしてMacでは日本語入力が機能しなかったのか?

リーグ・オブ・レジェンドのUIは、当初はAdobe Flashを利用するミドルウェアで作られていました。このミドルウェアはベクターグラフィックでUIを作成することが可能で、テキストフォーマットの手段としてHTMLに対応しており、豊富な機能が用意されていました。当時は非常に人気が高く、様々なゲームに利用されていて、Unreal Engine 3など、多くの人気ゲームエンジンにも使われていました。しかし、そのミドルウェアのmacOS版は東アジア言語には対応していなかったので、LoLでも対応されないままとなっていました。
何度かの変更を経て、現在はHUDなどのゲーム内UIの一部でFlashの代わりにGame Data Server(英語ページ)が統合されているUIシステムが使われています。ただし、このシステムでもmacOS上での日本語入力には対応しておらず、一から作成することになりました。

macOSでのテキスト入力

macOSは、テキストの入力にNSTextInputClientプロトコルと呼ばれる関数のセットを利用します。このプロトコルを組み込んでおけば、リーグ・オブ・レジェンドのようなアプリケーションはmacOSにテキスト入力や編集に必要な様々な機能を提供するように伝えます。これには、テキストを別のテキスト内に挿入したり、テキストをマークしたり、テキストの画面上の位置を正確に取得したりという、非常にエキサイティングなものも含まれています。

「Hello」と表示されるまでに行われること

該当するアプリケーションに、NSTextInputClientによって定義されたテキストを扱う能力があるとmacOSが判断すると、テキスト入力が行われた時に、macOSは様々なイベントをそのアプリケーションに送信します。

英語の「hello」なら、これらのイベントは非常にシンプルです。しかし、日本語の「初めまして」ではより多くの手順が必要となります。


英語

日本語


このイベントのシーケンスは中国語とは共通していますが、韓国語では少し違います。これらの異なるシーケンスを正しく処理できるNSTextInputClientを実装するには、macOSの東アジア言語への完全対応が必要でした。

それ以外にやらなければなからなかったことは?

macOSでCJK入力(中国語、日本語、韓国語入力)に対応するためには、テキスト入力とテキスト編集の実装以外にも以下の事柄が必要になります。

  • チャットボックス自体の作成:これにはLoLのUIシステムの複数行やワードラップ(自動次行送り)への対応や、チャットテキストの色を判別するためにHTMLをパースしてから、グリフを個別に色付けできるようにフォントのレンダリング機能を拡張する作業などが含まれます。

  • テキスト入力用のテキスト欄の作成:これには基本的なテキスト編集システムの実装、カレット(入力欄のカーソル)の作成、カレットの位置の追跡、別のテキスト内へのテキストの挿入や削除の許可、テキスト欄の反対側の端からはみ出さないようにテキストをクリッピングするといった作業が含まれます。

  • チャットが行う他のあらゆるものの再実装:これにはチャット制限、サウンドの再生、メッセージの受け取り速度の調整、ウィスパーメッセージ/リプライ機能、チャットコマンドシステムの実装などが含まれます。

  • ゲーム入力処理:入力をテキスト欄への入力として処理するか、それともゲーム自体への入力として処理するかを、チャットが開いているかどうかに応じて判断できるように再調整。これを行うにはLoLのエンジンの基礎をなす階層に変更を加える必要があったので、とても勉強にはなりましたが、同時にかなり恐ろしい作業でした。

最後に

結果として、リーグ・オブ・レジェンドにはWindowsとMacで種類が異なる2つのチャットボックスが存在することになりました。将来的にはWindowsにも同じものを導入して、1種類のチャットボックスのみで済ませられるようにしたいと考えています。

また、チャットやそれ以外でのユーザーエクスペリエンスの他の部分にも改善すべき点は多く残っています。お読みくださりありがとうございました。皆さんからのご意見をお待ちしています!

※この機能は7.22パッチ後適用予定です。


11 months ago