12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

サムザップ #2Advent Calendar 2020

Day 12

【Unity】シーン、Prefab内に含む任意の文字列を検索するSearchStringInAssetsを作りました

Last updated at Posted at 2020-12-11

株式会社サムザップで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から全文検索すれば使用箇所を特定出来ます。
image.png

ただしPrefabやシーンに文字列を保存した場合、IDEからの検索はできず使用箇所の特定が出来なくなります。
image.png
例えば上図のように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の値にヒットするようになっています。

検索パターンを無視する設定

image.png

Ignore Search Patternにチェックを入れていると、検索パターンを無視して純粋に検索キーワードで検索します。

インストール方法

GitHubリポジトリREADME参照してください。

課題あり

mdfindの使い方が悪いのか仕様なのか分からないのですが、「.(ドット)」が検索キーワードに含まれるとPrefabやシーンがヒットしなくなります。調べても分からないので、「.(ドット)」が検索対象に含まれた場合はgrepで代用しています。

mdfindはSpotlightでインデックスが構築された状態からの検索処理なのでとても高速です。しかしgrep検索は非常に遅いです。

肥大化しているUnityプロジェクトで使用すると検索結果を取り出すまでとても時間がかかるため注意が必要です。2

基本的に自分が欲しかったツールなので作ったというものでしたので満足はしているものの高速化出来る余地があるかどうかは、これからの話ということで。

明日は@leosukeさんのエンジニアらしく本を整理したい... 「Yahoo Web API を用いたバーコード読み取りによる本整理術」 - Qiitaです。

最後に

先日サムザップアドベントカレンダー#1【Unity】新規ゲームのUI開発で気をつけた39のTips前編 - Qiitaという記事を執筆しているので、こちらもどうぞよろしくお願い致します。

  1. テクスチャが含まれているのはmetaファイルも検索対象のため

  2. 肥大化しているプロジェクトでこそ使いたい。。。分かります。

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?