Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Unity,PHP+Jenkins+GAS 多言語対応を意識させない開発を目指したシステム構築

Unity,PHP+Jenkins+GAS 多言語対応を意識させない開発を目指したシステム構築

GREE Tech Conference 2023で発表された資料です。
https://techcon.gree.jp/2023/session/TrackB-3

gree_tech
PRO

October 13, 2023
Tweet

More Decks by gree_tech

Other Decks in Technology

Transcript

  1. Unity,PHP+Jenkins+GAS
    多言語対応を意識させない
    開発を目指したシステム構築
    株式会社ポケラボ
    基盤エンジニア
    篠原 功

    View Slide

  2. 自己紹介
    ● 篠原 功 (Isao Shinohara)
    ○ 2013年株式会社ポケラボに入社。
    ○ 「SINoALICE -シノアリス-」「アサルトリリィ Last Bullet」などを経て
    現在は基盤チームに所属。
    ○ ローカライズやリソース管理のシステム構築を中心に
    「開発・運用フローも踏まえた最適化」を目指して絶賛開発中。
    2

    View Slide

  3. ● これまでの海外対応状況と課題点・改修方針
    ● システム化のための実装ルール
    ● 翻訳依頼から反映までの作業フロー
    ● 積み残しになっている課題
    ● まとめ
    アジェンダ
    3

    View Slide

  4. ● 多言語対応のために開発メンバーにお願いしている具体的な実装ルール
    ● ゲーム内で使っている日本語テキストの抽出や翻訳後のフロー
    話すこと
    4

    View Slide

  5. ● 言語や地域の違いで発生する問題
    ● リリース済みアプリを多言語対応するために役立つ情報
    ● 画像に埋め込まれた日本語テキストやフォントなど
    話さないこと(話せないこと)
    5

    View Slide

  6. ● これまでの海外対応状況と課題点・改修方針
    ● システム化のための実装ルール
    ● 翻訳依頼から反映までの作業フロー
    ● 積み残しになっている課題
    ● まとめ
    アジェンダ
    6

    View Slide

  7. ● 海外対応状況
    ○ 「SINoALICE -シノアリス-」「戦姫絶唱シンフォギア XD UNLIMITED」
    などいくつかのアプリですでに海外リリース実績あり
    ● 開発体制
    ○ 日本版リリース後、海外版をリリース
    ○ 開発チームは日本版、開発版で別チーム
    これまでの海外対応状況
    7

    View Slide

  8. 課題点
    ● 日本語テキストの抽出作業負担
    ● 連番によるID管理と翻訳間違い
    ● git管理で発生していたコンフリクト問題
    ● 翻訳チェックと巻き戻し作業の負荷
    8

    View Slide

  9. 日本語テキストの抽出作業負担
    ● 内容
    ○ 実装が完了したタイミングでプランナー、エンジニアそれぞれが
    翻訳対象となるテキストをまとめていた
    ● 課題
    ○ 日本語テキスト実装箇所は多岐に渡るので抽出が大変
    ○ 手動で行うため抜け漏れが発生する可能性がある
    9

    View Slide

  10. 連番によるID管理と翻訳間違い
    ● 内容
    ○ 翻訳対象の日本語テキストに対し連番 IDを付与
    ■ ID:1 おはよう
    ■ ID:2 こんにちは
    ■ ID:3 こんばんは
    ○ 開発メンバーは日本語テキストと対応した IDを関連付ける
    ● 課題
    ○ 日本語テキスト実装箇所は多岐に渡るので IDの関連付け作業が大変
    ○ 番号を間違えると誤った翻訳が行われる可能性がある
    ○ 一度IDを割り振ったら変更することは至難
    10

    View Slide

  11. git管理で発生していたコンフリクト問題
    ● 内容
    ○ 翻訳データはcsv形式で保存しGitHub上で管理
    ● 課題
    ○ 同じcsvファイルを編集することがありコンフリクトが発生していた
    ○ 作業者にはgitのスキルが求められる
    11

    View Slide

  12. ● 内容
    ○ QAチームは翻訳されたテキストを実機上ですべて確認
    ● 課題
    ○ 翻訳漏れが発生した場合の巻き戻し作業が多い
    ○ 翻訳漏れは五月雨に発覚することもある
    翻訳チェックと巻き戻し作業の負担
    12

    View Slide

  13. 課題を踏まえた対応方針
    13

    View Slide

  14. 課題点
    ● 日本語テキストの抽出作業負担
    ● 連番によるID管理と翻訳間違い
    ● git管理で発生していたコンフリクト問題
    ● 翻訳チェックと巻き戻し作業の負担
    14

    View Slide

  15. 翻訳が必要な日本語テキストを自動抽出
    ● 対応
    ○ ゲーム内で利用しているテキストすべてを自動で抽出できるようにする
    ● 期待
    ○ 手動で日本語テキストを集めていた労力がなくなる
    ○ 翻訳漏れが発生した際の手戻りもなくなる
    ○ QAチームの確認範囲を限定
    15

    View Slide

  16. 課題点
    ● 日本語テキストの抽出作業負担
    ● 連番によるID管理と翻訳間違い
    ● git管理で発生していたコンフリクト問題
    ● 翻訳チェックと巻き戻し作業の負担
    16

    View Slide

  17. IDを連番から日本語ハッシュ値に変更
    ● 内容
    ○ IDを日本語を元に生成したハッシュ値に変更
    ■ 例:) こんにちは
    ● ID: 1 -> ID: 20427A708C3F6…
    ● 期待
    ○ IDの採番と関連付けのための実装が不要になる
    ○ IDの割り当て間違いによる誤った翻訳が防げる
    17

    View Slide

  18. 課題点
    ● 日本語テキストの抽出作業負担
    ● 連番によるID管理と翻訳間違い
    ● git管理で発生していたコンフリクト問題
    ● 翻訳チェックと巻き戻し作業の負担
    18

    View Slide

  19. GoogleSpreadSheetを利用
    ● 内容
    ○ 翻訳作業はGoogleSpreadSheetで行う
    ● 期待
    ○ gitスキルが不要になる
    ○ Web公開することで外部サービスとの連携が可能に
    19

    View Slide

  20. 対応方針
    ● 翻訳が必要な日本語テキストを自動抽出
    ● IDを連番から日本語ハッシュ値に変更
    ● GoogleSpreadSheetを利用
    20

    View Slide

  21. 所感・実装コンセプト
    ● 所感
    ○ 日本語の開発完了後から翻訳対応までの作業量が多い
    ○ どのような実装になっているかでその作業量は大幅に変わる
    ● 実装コンセプト
    ○ 日本向けに開発しているメンバーがいつも通り作業をしているだけで
    多言語対応のための実装も完了している
    21

    View Slide

  22. ● これまでの海外対応状況と課題点・改修方針
    ● システム化のための実装ルール
    ● 翻訳依頼から反映までの作業フロー
    ● 積み残しになっている課題
    ● まとめ
    アジェンダ
    22

    View Slide

  23. 翻訳対象
    ● クライアント (Unity)
    ○ シーン・プレハブ
    ■ TextMeshProなどのコンポーネント
    ■ SerializeField
    ○ ソースコード (C#)
    ○ ScriptableObject
    ● サーバー (PHP, Spanner, Smarty)
    ○ マスタデータ
    ○ yaml
    ○ ユーザーデータ
    ○ WebView
    23

    View Slide

  24. シーン・プレハブ
    ● 対象箇所
    ○ シーン、プレハブでアタッチしている
    TextMeshProなどのテキストコンポーネント
    ● 実装ルール
    ○ 翻訳用のコンポーネントをアタッチ
    ■ 翻訳不要でもアタッチ
    ● 抽出方法
    ○ AssetDatabase.FindAssets("t:Scene t:Prefab");
    ○ GameObjectにアタッチされているテキスト
    コンポーネントから翻訳対象テキストを取得
    ● 表示処理
    ○ シーン、プレハブをアクティブにするタイミングで
    各言語の翻訳テキストに置き換え
    24

    View Slide

  25. SerializeField
    ● 対象箇所
    ○ public stringや[SerializeField] private stringで
    作成した変数にインスペクターから入力している
    テキスト
    ● 実装ルール
    ○ 使用禁止
    ● 理由
    ○ 翻訳対象の日本語テキストを抽出するのが難しい
    ○ 翻訳処理を通しているかの保証ができない
    25

    View Slide

  26. ScriptableObject
    ● 対象箇所
    ○ ScriptableObject内に含まれるテキストデータ
    ○ ADVパートのシナリオ管理に利用
    ● 実装ルール
    ○ なし
    ● 抽出方法
    ○ ScriptableObjectファイルをロード後、
    翻訳対象の日本語テキストを取得
    ● 表示処理
    ○ 言語毎に翻訳された JSONファイルを用意して管理
    ■ story.asset -> story_en-Latn.json,
    story_ko-Kore.json
    ■ JsonUtility.ToJson();
    ○ 空のScriptableObjectにJSONのデータを反映
    ■ JsonUtility.FromJsonOverwrite();
    26

    View Slide

  27. ソースコード (C#)
    ● 対象箇所
    ○ ソースコードに直に記述している日本語テキスト
    ● 実装ルール
    ○ 決められたクラス内に定義
    ○ プロパティ形式にして翻訳メソッドを通す
    ○ 決められたクラス以外で定義することは禁止
    ● 抽出方法
    ○ 決められたクラス内に存在する string or string[]
    を返すプロパティから翻訳対象のテキストを取得
    ● 表示処理
    ○ プロパティ利用時に各言語の翻訳テキストを返却
    27

    View Slide

  28. マスタデータ
    ● 対象箇所
    ○ Spannerで管理されている全ユーザー共通データ
    ● 実装ルール
    ○ なし
    ● 抽出方法
    ○ テーブルのスキーマ情報から STRING(XX)で
    定義されているカラムの値を取得
    ● 表示処理
    ○ 言語毎に翻訳済みのマスタテーブルを用意し、
    利用時に対象テーブルを切り替える
    ■ ItemMst -> ItemMst_en-Latn,
    ItemMst_ko-Kore
    28

    View Slide

  29. yaml
    ● 対象箇所
    ○ yamlファイル内に記述しているテキスト
    ● 実装ルール
    ○ なし
    ● 抽出方法
    ○ 正規表現で「ひらがな」「カタカナ」「漢字」を
    含んだテキストを抽出
    ○ 英語で記述されたテキストも翻訳対象だった
    ケースにどう対応するかは課題
    ■ 例:) HP, MP
    ● 表示処理
    ○ yamlのパース処理後に対象日本語テキストを
    各言語の翻訳テキストに置き換え
    ○ 置き換えたyamlは言語毎にキャッシュ
    29

    View Slide

  30. ユーザーデータ
    ● 対象箇所
    ○ データベースにユーザー個別で記録している
    日本語テキスト
    ● 実装ルール
    ○ 日本語テキストで記録
    ● 抽出方法
    ○ マスタデータやyamlに記載されている
    日本語テキストの場合は必要なし
    ○ 上記以外の日本語テキストを利用するケースに
    どう対応するかは課題
    ● 表示処理
    ○ テーブルからデータ取得時に日本語テキストを
    各言語の翻訳テキストに置き換える
    30

    View Slide

  31. WebView
    ● 対象箇所
    ○ テンプレートファイル内に直接記述されている
    日本語テキスト
    ○ テンプレートエンジンを利用してプログラムから
    埋め込まれている文字列
    ■ マスタデータやyamlに記載されている
    日本語テキストの場合は必要なし
    ● 実装ルール
    ○ なし
    ● 抽出方法
    ○ テンプレートファイル内の要素を取得 (予定)
    ● 表示処理
    ○ テンプレート内に直接記述されている
    日本語テキストはロード時に各言語の翻訳テキスト
    へと置き換える(予定)
    31

    View Slide

  32. ● これまでの海外対応状況と課題点・改修方針
    ● システム化のための実装ルール
    ● 翻訳依頼から反映までの作業フロー
    ● 積み残しになっている課題
    ● まとめ
    アジェンダ
    32

    View Slide

  33. 翻訳対象となる日本語テキストの抽出フロー
    33

    View Slide

  34. 翻訳対象となる日本語テキストの抽出フロー
    34

    View Slide

  35. 翻訳対象となる日本語テキストの抽出フロー
    35


    View Slide

  36. 翻訳対象となる日本語テキストの抽出フロー
    36


    View Slide

  37. 翻訳対象となる日本語テキストの抽出フロー
    37


    View Slide

  38. Google Spread Sheet
    38

    View Slide

  39. Google Spread Sheet
    39

    View Slide

  40. Google Spread Sheet
    40

    View Slide

  41. Google Spread Sheet
    41

    View Slide

  42. Google Spread Sheet
    42

    View Slide

  43. Google Spread Sheet
    43

    View Slide

  44. 翻訳作業後のフロー
    44

    View Slide

  45. 翻訳作業後のフロー
    45

    View Slide

  46. 翻訳作業後のフロー
    46

    View Slide

  47. 翻訳作業後のフロー
    47

    View Slide

  48. 翻訳作業後のフロー
    48

    View Slide

  49. 翻訳作業後のフロー
    49

    View Slide

  50. ● これまでの海外対応状況と課題点・改修方針
    ● システム化のための実装ルール
    ● 翻訳依頼から反映までの作業フロー
    ● 積み残しになっている課題
    ● まとめ
    アジェンダ
    50

    View Slide

  51. UI テキストエリアのサイズ問題
    ● 内容
    ○ 言語によってはテキストがエリア内に収まらない問題
    ● 原因
    ○ 想定されるケース、解決方法が多岐にわたりシステム化が難しい
    ● 方針
    ○ 現時点で良い案がないことを周知
    ○ ノウハウが溜まりシステム化できるまでは 1箇所1箇所対応
    51

    View Slide

  52. 「やってはいけないこと」の厳守
    ● 内容
    ○ 開発メンバーが「やってはいけない」を「やってしまってはいないか?」
    ● 原因
    ○ 「やってはいけないこと」の対象範囲が広い
    ○ チェックツールの作成も難しい
    ● 方針
    ○ 現場レベルで各個人に厳守していただくことを口頭でお願い
    ○ 問題ひとつひとうに対して泥臭く対応
    52

    View Slide

  53. ● これまでの海外対応状況と課題点・改修方針
    ● システム化のための実装ルール
    ● 翻訳依頼から反映までの作業フロー
    ● 積み残しになっている課題
    ● まとめ
    アジェンダ
    53

    View Slide

  54. 実装ルール
    ● クライアント (Unity)
    ○ シーンやプレハブには必ず翻訳用のコンポーネントをアタッチ
    ○ テキストは決められたクラスに定義
    ■ プロパティ形式で翻訳処理を通す
    ■ 特定クラス以外以外は使用禁止
    ○ SerializeFieldを使った日本語テキストの利用は禁止
    ● サーバー (PHP, Spanner, Smarty)
    ○ 基本なし。ただし注意点あり。
    ■ ユーザーデータに日本語テキストを保存する場合は日本語テキストのまま
    ■ yamlに定義したテキストは英語のみだと翻訳されないので注意
    54

    View Slide

  55. 今後の展望
    ● システムはまだ発展途上
    ○ ゲームはまだリリースもされていない
    ○ 翻訳チームの要望もまだ組み込めていない
    ○ QAチームの要望もまだ組み込めていない
    ● 実装したい機能
    ○ デバッグツール
    ○ Slack連携
    55

    View Slide

  56. 56

    View Slide