【问题标题】:Localize iOS App name in Unity在 Unity 中本地化 iOS 应用程序名称
【发布时间】:2014-09-25 22:27:28
【问题描述】:

我正在开发一个 Unity3D 游戏,该游戏会根据用户的本地语言在 iPhone 的主屏幕中显示不同的(本地化)应用程序名称。请注意:

  1. 我已经知道如何通过编辑 Xcode 项目来本地化 iOS 应用名称(创建一个 InfoPlist.string 文件,对其进行本地化,为其添加 CFBundleDisplayName 键等)

    李>
  2. 我也知道如何在 Unity 编辑器中自动本地化 Android 应用名称(将具有 app_name 属性的 values-XX.xml 文件添加到 Assets/Plugins/Android/res/ 文件夹等)

问题是:我如何自动Unity Editor 中本地化我的 iOS 应用名称,这样我就不需要执行每次构建项目时容易出错的任务1.

我认为PostprocessBuildPlayer 应该是可行的方法,但是我还没有找到任何关于如何解析它和/或正确修改 Xcode 项目文件以实现此目的的文档。

【问题讨论】:

标签: ios xcode localization unity3d info.plist


【解决方案1】:

很久以前,当我尝试通过构建播放器管道修改 info.plist 时遇到了麻烦,尤其是在 追加模式 中进行修改时。它只工作一次,然后后续构建失败,并显示“无法读取数据,因为它的格式不正确。”(s. Unity 论坛帖子,如 this one 和我的 @987654322 @关于这个问题)所以我决定采用将自定义构建与 Xcode Build Pre-action 相结合的替代方式。

需要三个步骤:

(1) Xcode 设置:

在 Xcode 中转到 Edit Scheme / Build / Pre-actions。然后单击 + 号以添加 New Run Script Action

  • 提供构建设置中选择Unity-iPhone
  • 粘贴. ${PROJECT_DIR}/modify_info_plist.sh(注意开头的点和空格,确保脚本在调用者的shell中执行)

所以它应该是这样的:

(2) 脚本 modify_info_plist.sh:

在您的脚本中,您可以从 Xcode(s.Xcode Build Setting Reference)访问所有环境变量,并且可以使用 defaults 命令(man page)操作 Info.plist。这是我用来将gyroscope 添加到UIRequiredDeviceCapabilities 的示例:

# Code snippet used in Unity-iPhone scheme as "Build Pre-Action"

my_domain=${PROJECT_DIR}/Info.plist
status_bar_key=UIViewControllerBasedStatusBarAppearance

logger "Start adding keys to info.plist"
defaults write $my_domain $status_bar_key -boolean NO

if [ `defaults read $my_domain UIRequiredDeviceCapabilities | grep "gyroscope" | wc -l` = "0" ]; then
    defaults write $my_domain UIRequiredDeviceCapabilities -array-add  "gyroscope"
fi
logger "Keys added to info.plist successfully"

(3) 构建管道:

将以下代码放入静态编辑器类中以使用快捷方式 cmd+alt+b创建新菜单项 Tools / My iOS Build >:

static string IOSBuildDir= "Develop";

[MenuItem("Tools/My iOS Build %&b")]
public static void IOSBuild () {
    string[] levels = { "Assets/Scenes/Boot.unity",
        "Assets/Scenes/Level-1.unity",
        // ...
        "Assets/Scenes/Menu.unity"
    };
    string path = Directory.GetCurrentDirectory ();
    path += "/" + IOSBuildDir + "/Info.plist";
    if (File.Exists (path)) {
        Debug.Log ("Removing file " + path);
        File.Delete (path);
    }
    BuildPipeline.BuildPlayer (levels, "Develop", BuildTarget.iPhone, 
        BuildOptions.AcceptExternalModificationsToPlayer);
}

我知道这不是完美的解决方案,但它是我发现的唯一一个可以稳定工作的解决方案。两个缺点:

  • 主要 Xcode 格式更改后必须重复步骤 (1)
  • 必须在步骤(3)的编辑器类代码中附加新场景

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多