株式会社サムザップでUnityエンジニアをしている大庭@ohbashunsukeです。サムザップ #2 AdventCalendar 2020 の12/12(土)の記事です。
昨日は@mikami_akihisaさんの「SlackのメッセージをGASでGoogleスプレッドシートに集積する」でした。
概要
Unity開発をほんのすこーし便利にするかも知れないツールを作ったので紹介していきたいと思います。
この文字列は、どこかで使ってるんだっけ?
ゲーム開発に限りませんが、クライアントエンジニアはユーザーが実際に目にする文字をよく扱います。
- ダイアログの「はい」「いいえ」
- 画面のタイトル
- UI上に表示する何かしらの文字列
- キャラクタの説明文
- スキル名
種類は様々あります。
開発してて困るのは、Prefabやシーン、ScriptableObjectに埋め込んでしまった文字列の使用箇所の特定です。
文字列を置き換えないといけない場面で影響範囲を調べる必要が出てきます。
// キーを渡して実際に使用するテキストを取得
_label.text = Localization.Get("dialog.title.adventcalendar");
ソースコードに文字列を直打ちした場合は、Rider (以下の画像) などのIDEから全文検索すれば使用箇所を特定出来ます。
ただしPrefabやシーンに文字列を保存した場合、IDEからの検索はできず使用箇所の特定が出来なくなります。
例えば上図のようにTextコンポーネント
のtextプロパティ
に文字列を代入して、そのシーンファイル、Prefabの中身をテキストエディタで確認してみましょう。
シーンファイル内の文字列
~~~~~~~省略~~~~~~~
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: dialog.title.adventcalendar
--- !u!222 &743252498
CanvasRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
~~~~~~~省略~~~~~~~
Prefab内の文字列
~~~~~~~省略~~~~~~~
m_RichText: 1
m_HorizontalOverflow: 0
m_VerticalOverflow: 0
m_LineSpacing: 1
m_Text: dialog.title.adventcalendar
このようにシーンファイル、Prefab共にm_Text: dialog.title.adventcalendar
という記述で保存されていることが分かります。
grepして検索
使用箇所の確認として grep
して検索する方法も一応紹介。
$ grep "dialog.title.adventcalendar" -r .
※以前執筆した記事関連した内容がありますので、こちらもどうぞ
Unityでファイルを削除するときに必ずチェックしたい2つのポイント
以下のように出力されます。
./Text_advent.prefab: m_Text: dialog.title.adventcalendar
./Sample/SampleScene.unity: m_Text: dialog.title.adventcalendar
- Text_advent.prefab
- Sample/SampleScene.unity
この2箇所で使っているということが分かります。
このようにgrep
して探し出すことは可能なのですが、、、まあ面倒くさいです。またエンジニアならまだしも非エンジニアにシェルを扱ってもらうというのは ハードル高め。
という事でSearchStringInAssetsというツールをEditor拡張で作ってみました。
条件
- 検索キーワードは半角英数文字列のみ(全角文字は対象外)
- 検索パターンを指定できる
- 検索結果のファイル指定が可能
という条件で作っています。
使用イメージ
以下のgif動画をご覧いただければ分かると思いますが、Search keywordsに検索したキーワードをセットしてSearchボタンをクリックすると、ヒットしたオブジェクトが並びます。
検索設定
Search Setting
に設定ファイル(ScriptableObject)をセットできます。
public class SearchStringInAssetsSetting : ScriptableObject
{
/// <summary>
/// Search Exclusion Class Array
/// </summary>
public string[] ignoreTypes;
/// <summary>
/// Search Pattern Array
/// </summary>
public string[] searchPatterns;
}
このような配列を2つ用意しています。
ignoreTypes
は無視するタイプ、searchPatterns
は検索キーワードのパターンです。
検索結果のファイル形式の指定
検索対象から無視するファイル形式出来るようにしています。
- フォルダ
- テクスチャ 1
- TextAsset
- C#スクリプト
これらは検索結果の対象からデフォルト設定ファイルで無視されています。
検索キーワードのパターン
m_Text: {0}
value: {0}
デフォルト設定ファイルには上記の2パターンが設定しており、Textコンポーネントのtextプロパティの値
、string型のSerializeFieldの値
にヒットするようになっています。
検索パターンを無視する設定
Ignore Search Pattern
にチェックを入れていると、検索パターンを無視して純粋に検索キーワードで検索します。
インストール方法
GitHubリポジトリのREADME参照してください。
課題あり
mdfindの使い方
が悪いのか仕様
なのか分からないのですが、「.(ドット)」が検索キーワードに含まれるとPrefabやシーンがヒットしなくなります。調べても分からないので、「.(ドット)」が検索対象に含まれた場合はgrepで代用しています。
mdfindはSpotlightでインデックスが構築された状態からの検索処理なのでとても高速です。しかしgrep検索は非常に遅いです。
肥大化しているUnityプロジェクトで使用すると検索結果を取り出すまでとても時間がかかるため注意が必要です。2
基本的に自分が欲しかったツールなので作ったというものでしたので満足はしているものの高速化出来る余地があるかどうかは、これからの話ということで。
明日は@leosukeさんのエンジニアらしく本を整理したい... 「Yahoo Web API を用いたバーコード読み取りによる本整理術」 - Qiitaです。
最後に
先日サムザップアドベントカレンダー#1で【Unity】新規ゲームのUI開発で気をつけた39のTips前編 - Qiitaという記事を執筆しているので、こちらもどうぞよろしくお願い致します。