Edited at

Unity4系→Unity5系へのバージョンアップ時にハマったことと解決策

More than 1 year has passed since last update.


■PlayerSettings.applicationIdentifierが反映されない

Jenkinsを使ってバッチモードでビルドする際にデバッグモードのみアプリIDを書き換えしていたが

Unityバージョンアップ後からIDの上書きがうまく行かなくなった

PlayerSettings.applicationIdentifier = "hogehoge";

だとアクティブなプラットフォームのIDしか書き換わらなかったため

PlayerSettings.SetApplicationIdentifier(BuildTarget.iOS, "hogehoge");

とすることで任意のプラットフォームのIDの書き換えが可能


■iOSでコードの重複エラー

プロジェクトではUnityが出力するClasses配下のコードを

Assets/Plugins/iOS/UI/Keyboard.mmのように配置して上書きを行っていたが

Unity5へバージョンアップ後から上書きされずビルド時にコード重複のエラーが発生していた

PostProcessBuildとPBXProject.RemoveFileFromBuild/RemoveFileを使って

Unityのビルド後にXcodeプロジェクトを編集することでコードの重複を回避


iOSPostBuildProcess.cs

[PostProcessBuild]

public static void OnPostProcessBuild(BuildTarget buildTarget, string buidlProjectPath) {
if (buildTarget != BuildTarget.iOS) {
return;
}

// Plugins配下のファイルをコピー
var src = Path.Combine("Libraries/Plugin/iOS/UI/Keyboard.mm");
var dest = Path.Combine("Classes/UI/Keyboard.mm");
File.Copy(Path.Combind(buidlProjectPath, src), Path.Combine(buidlProjectPath, dest), true);

// Xcodeのプロジェクトからコピーしたファイルを削除
var projectPath = Path.Combine(buidlProjectPath, "Unity-iPhone.xcodeproj/project.pbxproj");
var project = new PBXProject();
project.ReadFromFile(projectPath);

var targetGuid = project.TargetGuidByName("Unity-iPhone");
var guid = project.FindFileGuidByProjectPath(src);
project.RemoveFileFromBuild(targetGuid, guid);
project.RemoveFile(guid);

project.WriteToFile(projectPath);
}



■突然Unityがクラッシュする

C:\Users\ユーザ名\AppData\Local\Unity\Editor\Editor.log

Unityがクラッシュする直前のログを見て直前に何の処理をしていたかを確認する

今回の場合

・原因 AssetBundleが古い

・対策 Unity5.6.4f1でAssetBundleの再ビルド

========== OUTPUTING STACK TRACE ==================

0x00000001414D9351 (Unity) SerializedFile::ReadMetadata<0>
0x00000001414DC7CC (Unity) SerializedFile::ReadHeader
0x00000001414DEADF (Unity) SerializedFile::FinalizeInit
0x00000001414DEF49 (Unity) SerializedFile::InitializeRead
0x0000000141098280 (Unity) PersistentManager::LoadFileStream
0x00000001408C1012 (Unity) AssetBundleLoadFromAsyncOperation::TryToLoadAndInitializeAssetBundle
0x00000001408C1D0E (Unity) AssetBundleLoadFromAsyncOperation::IntegrateMainThread
0x0000000141036868 (Unity) PreloadManager::UpdatePreloadingSingleStep
0x0000000141036BAD (Unity) PreloadManager::UpdatePreloading
0x00000001414A3DCC (Unity) PlayerCleanupCachedData
0x0000000140D89530 (Unity) PlayerLoop
0x00000001417482BE (Unity) Application::UpdateScene
0x0000000141749A8F (Unity) Application::UpdateSceneIfNeeded
0x000000014175231A (Unity) Application::TickTimer
0x000000014181D96C (Unity) CrashCallback
0x000000014181F4F4 (Unity) WinMain
0x0000000141B05BCC (Unity) strnlen
0x00000000771959CD (kernel32) BaseThreadInitThunk
0x00000000773CA561 (ntdll) RtlUserThreadStart

========== END OF STACKTRACE ===========