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

4
我正在开发一个Unity3D游戏,根据用户的本地语言,在iPhone主屏幕上显示不同的(本地化的)应用程序名称。请注意以下内容:
  1. 我已经知道如何通过编辑Xcode项目来本地化iOS应用程序名称(创建InfoPlist.string文件,本地化它,添加CFBundleDisplayName键等)
  2. 我也知道如何在Unity编辑器中自动本地化Android应用程序名称(将values-XX.xml文件与app_name属性添加到Assets/Plugins/Android/res/文件夹等)
问题是:我应该如何在Unity编辑器中自动本地化我的iOS应用程序名称,以便每次构建项目时都不需要执行易错的任务1?
我认为PostprocessBuildPlayer应该是正确的方法,但我没有找到任何关于如何解析它和/或正确修改Xcode项目文件以实现此目的的文档。

你可能想要查看这个资源:https://www.assetstore.unity3d.com/en/#!/content/28954 - albertamg
1个回答

1
Long time ago,我在尝试通过Build Player Pipeline修改info.plist时遇到了麻烦,特别是在Append mode中进行操作。它只能工作一次,然后随后的构建将失败,并显示“The data couldn’t be read because it isn’t in the correct format.”(请参见Unity论坛帖子this one和我的博客文章)。因此,我决定采用另一种方法,即使用自定义构建与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中执行)

所以它应该看起来像这样: Xcode screenshot

(2) 脚本 modify_info_plist.sh:

在您的脚本内,您可以访问所有来自 Xcode 的环境变量 (请参见 Xcode 构建设置参考),并且您可以使用 defaults 命令(手册页面)来操作 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接