在Unity中本地化iOS应用程序名称

时间:2014-09-25 22:27:28

标签: ios xcode localization unity3d info.plist

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

  1. 我已经知道如何通过编辑Xcode项目来本地化iOS应用程序名称(创建InfoPlist.string文件,本地化,添加CFBundleDisplayName密钥等)。

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

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

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

1 个答案:

答案 0 :(得分:1)

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

需要三个步骤:

(1)Xcode设置:

在Xcode中,转到编辑方案/构建/预操作。然后单击+号以添加新运行脚本操作

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

所以看起来应该是这样的: Xcode screenshot

(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)构建管道:

将以下代码放在静态编辑器类中,以创建一个新菜单项Tools / My iOS Build,快捷键为 cmd + alt + b

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)
  • 的编辑器类代码中添加新场景