BLOGブログ

2021.10.27UE4UE/ C++

[UE4]フォント非対応の文字を置換する方法

執筆バージョン: Unreal Engine 4.26

はじめに

みなさまこんにちは。
今回は「指定した文字がフォントに含まれているか調べる方法」及び「それを用いて文字の置換をする方法」について紹介します。
これを用いる事で名前入力やチャット機能などでユーザーが入力した文字が「データ的にはあるけど表示されない」といった状況を回避することができます!

機能の実装

まずはコンパイルを問題なく通すために必要となる前準備をしていきます。
[プロジェクト名].Build.csファイルを開き、以下のように変更してください。
これがないと今後のソースコードで使う関数を呼び出すための参照が足りず、コンパイルする際にエラーが発生します。

それでは準備が完了したので、指定した文字がフォントに含まれているか調べる関数を作っていきたいと思います。
まずはエディタから New C++ Class でC++のクラスを作成します。
今回はどこからでも呼び出せるように UBlueprintFunctionLibraryクラスを継承した、UMyBlueprintFunctionを作成します。

ソースコードは以下の通りです。

ソースコード中で特に見ていただきたいのは、IsSupportedCharacter関数です。
こちらの処理はフォント情報を取得し、フォント情報から特定の文字を取り出せたかをbool値で返すというものです。
これを利用することで指定した文字がフォントで対応されているかを調べることができます。

次に見ていただきたいのは、実際にBlueprint(以下BP)で使用するための関数であるReplaceUnsupportedCharacter関数です。
こちらは文字列をFor文で1文字づつに分け、その都度IsSupportedCharacterを実行してフォント非対応の文字であれば指定の文字列に置換するといった処理をしています。

以上で大まかな説明は終わりです。
今回2つの関数に分けた理由は、「指定した文字がフォントに含まれているか調べる」という機能と、「それを用いて文字の置換をする方法」を明確に分ける為でした。
実際に使う際にはIsSupportedCharacter内の36行目まではフォントごとに1度実行すれば使いまわすことできます。非対応の文字を置き換えるという目的のみであれば、2つの関数を1つにまとめた方が無駄がなりますのでお試しください。

動作確認

1.フォント
まずはプロジェクトに使用するフォントを追加します。
今回の環境ではNotoSansJPを使用しました。

2.ウィジェット
次に確認用のウィジェットを作成します。
「置き換え前となる文字列用」と「置き換え文字用」のTextBoxパーツを配置します。
「非対応文字を置き換えたあとの文字列用」のTextパーツを配置します。
TextBoxの方のフォントはUE4デフォルトフォントを用いるので特に指定せず、Textの方のフォントに先ほど追加したNotoSansJPを指定します。



3.ウィジェットの表示
レベルBPを開いて以下のように組みます。左からウィジェットの作成、画面に追加、カメラ操作を無効化 となっています。

4.パッケージ作成
確認のためにはパッケージを作成します(重要)。理由はエディタ上だと先ほど作成した関数よりも前に文字化けしたとき専用の記号に置き換えられているため、IsSupportedCharacterの処理結果が常にtrueになってしまうからです。
パッケージを作成する前にレベルを保存し、ProjectSettingsからGameDefaultMapに保存したレベルを指定してください。

5.実行して確認
パッケージの作成が完了したら早速起動して、それぞれのTextBoxに入力してみてください。
以下の画像で入力した文字はこちらです。
赤:テスト
橙:테스트
緑:测试
青:℁
置き換え文字:*

想定通りにNotoSansJPで非対応の文字だけが置換されています。

これにてフォント非対応の文字を置換する方法の紹介は終わりとなります。
ありがとうございました。