4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Unity】Unity 6.5 からサポートされた Swift Xcode Project Type について

4
Last updated at Posted at 2026-07-20

はじめに

Unity 6.5 から、iOS 向けの新しいビルド出力形式として Swift Xcode Project Type が実験的機能として追加されました。

こちらは 2025年の Unite や U/Day で行われたロードマップ講演でも告知されていたもので、講演では 6.6 でリリース予定とされていましたが、先んじて 6.5 に導入されたみたいです。1

今回の変更は単に出力される言語が Swift になったというものではなく、「Unity と Apple プラットフォームをつなぐレイヤー2を再設計したもの」 と説明されており、主なポイントとしては Apple プラットフォーム標準との整合性の向上に加え、将来を見据えたアーキテクチャの採用や、ネイティブプラグイン向けの Public API の追加などが挙げられています。

本記事では、Swift Xcode Project Type の概要と、既存プロジェクトを移行する際の注意点を整理します。

Swift Xcode Project Type は、Unity 6000.5.3f1 時点では 実験的機能 (Experimental) です。3
今後のリリースで仕様が変更される可能性がある点をご了承ください。

Swift Xcode Project Type とは

Swift Xcode Project Type は、iOS (iPadOS を含む) および tvOS 向けの Xcode プロジェクトを SwiftUI ベースのテンプレートから生成する新しいプロジェクトタイプです。
(以降、Swift Xcode Project TypeSwift プロジェクトタイプ と表記します)

前述のとおり、刷新されるのは「Unity と Apple プラットフォームをつなぐレイヤー」であり、簡単に言えば、iOS ビルドで出力される Xcode プロジェクト一式の形式が変わります。

このプロジェクトタイプでは、アプリケーションのエントリーポイントとライフサイクルが、SwiftUI ベースのテンプレートを通じて Swift で実装されます。

また、Unity は、Swift を採用する利点として、メモリ安全性の向上とランタイムクラッシュの削減、パフォーマンスとコンパイル時チェックの改善、SwiftUI のサポート、モダンな Apple SDK との統合を挙げています。

利用するには、Project Settings > Player > iOS > Other Settings > Configuration にある Xcode Project TypeSwift (Experimental) に設定します。

ロードマップについて

Discussions の「Looking to the future」では、長期的には Swift プロジェクトタイプをデフォルトとし、Objective-C アーキテクチャを段階的に廃止していく予定であることが示されています。
ただし、すぐに切り替わるわけではなく、既存の LTS (6.0 と 6.3) と 2026年にリリース予定の LTS では、それぞれのサポート期間中、Objective-C プロジェクトタイプも維持される予定です。

一方、Unity は、モダンな Apple API が Swift 中心になっていることを背景として挙げており、2026年にリリースする LTS の次の世代以降は、Apple プラットフォーム向けの新機能を Swift プロジェクトタイプのみに提供する見込みとしています。

Discussions では、ゲーム開発者とプラグイン開発者のそれぞれに向けた暫定タイムラインが公開されています。
以下は、その内容を筆者が和訳し、開発者種別ごとに整理したものです。

時期 Unity バージョン ステータス ゲーム開発者がすべきこと プラグイン開発者がすべきこと
2026年春 6.5 Alpha Swift プロジェクトタイプを実験的機能としてリリース コアゲームプレイをテスト 両プロジェクトタイプへの対応を開始
2026年秋 2026年にリリースされる LTS Swift プロジェクトタイプが production-ready となり、Objective-C プロジェクトタイプも利用可能 本番プロジェクトで利用可能。必要に応じてサードパーティ製プラグインの対応についてフィードバック 必要に応じて Swift プロジェクトタイプ対応版の SDK をリリース
2027年以降 次世代以降 すべてのプロジェクトで Swift プロジェクトタイプを推奨。新機能は Swift アーキテクチャでのみ提供。Objective-C プロジェクトタイプは非推奨化・削除を検討 Swift のみになる将来に備える 両プロジェクトタイプのサポートを維持

上記はあくまで暫定的なタイムラインであり、フィードバックに応じて変更される可能性があります。

主な変更点

Swift プロジェクトタイプでは、Xcode プロジェクトの構造と Apple プラットフォームとの連携部分が大きく変わります。
一方、Unity のランタイムや IL2CPP のビルドパイプライン、Unity-iPhoneUnityFrameworkGameAssembly の 3 ターゲットといった大枠は従来と変わりません。

両プロジェクトタイプで生成される Xcode プロジェクトの構造については、以下のドキュメントを参照してください。

また、ネイティブプラグインは Swift のほか、Objective-C、Objective-C++、C、C++ でも引き続き実装できます。

構造の変化などに伴い、既存プロジェクトを移行する際に注意すべき点を次章で解説します。

移行時の注意点

既存の Unity iOS プロジェクトを Objective-C プロジェクトタイプから Swift プロジェクトタイプへ移行する際に、影響を受けやすいポイントをまとめます。

サポートされる最小の iOS バージョンは 16.0

Swift プロジェクトタイプでサポートされる最小の iOS バージョンは iOS 16.0 です。

iOS の最小バージョンを 16.0 未満に設定している場合は、Project Settings に以下のような警告が表示され、ビルド時には下限である iOS 16.0 が強制的に適用されます。

現時点で利用できない機能

Unity 6000.5.3f1 時点では、Swift プロジェクトタイプで以下の機能を利用できません。

ポストプロセススクリプトの修正

Swift プロジェクトタイプでは、.xcodeproj のファイル名には、スペースや記号などの非英数字を除去した Unity プロジェクト名が使われます。
たとえば、Unity プロジェクト名が SampleProject の場合、出力される Xcode プロジェクトは SampleProject.xcodeproj になります。

そのため、従来の Unity-iPhone.xcodeproj をハードコードしているポストプロセススクリプトは修正が必要です。
両プロジェクトタイプに対応するには、PBXProject.GetPBXProjectPath() でパスを取得します。

// 変更前
string projPath = Path.Combine(pathToBuiltProject, "Unity-iPhone.xcodeproj/project.pbxproj");

// 変更後 (両プロジェクトタイプに対応)
string projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);

また、Swift プロジェクトタイプではアプリケーションの初期化が MainApp/MainApp.swift から始まるため、Objective-C プロジェクトタイプの MainApp/main.mm を直接参照する処理は見直す必要があります。

他にも、以下のドキュメントに示されているとおり、Swift プロジェクトタイプと Objective-C プロジェクトタイプでは構造が異なる箇所があるため、既存の .xcodeproj を変更する処理について、構造上の問題がないか見直す必要があります。

その上で、プロジェクトタイプごとに処理を分けたい場合は PlayerSettings.xcodeProjectType で判定できます。

if (UnityEditor.PlayerSettings.xcodeProjectType == UnityEditor.XcodeProjectType.Swift) {
    // Swift プロジェクトタイプ向けの処理
} else {
    // Objective-C プロジェクトタイプ向けの処理
}

ネイティブプラグインの移行

Swift プロジェクトタイプでは UnityFramework の構成が変わり、ネイティブプラグインから Unity を操作したり、アプリや Unity ランタイムのライフサイクルイベントを受け取ったりするための Public API が用意されました。

これらの API は Swift と Objective-C のどちらからでも利用できます。

従来の UnityAppController などに依存しているプラグインは、利用している機能に応じて新しい API へ移行する必要があります。5
主な移行例は以下のとおりです。Swift プロジェクトタイプの列には、Swift での呼び出し例を記載しています。

用途 Objective-C プロジェクトタイプ Swift プロジェクトタイプ
Unity の主要インターフェースへのアクセス GetAppController() UnityPlayer.shared
Unity ビューの取得 GetAppController().unityView / UnityGetUnityView() UnityPlayer.shared.renderingView
ルート ViewController の取得 GetAppController().rootViewController / UnityGetGLViewController() UnityPlayer.shared.rootViewController
ポーズ / 再開 UnityIsPaused() / UnityPause(1) / UnityPause(0) UnityPlayer.shared.isPaused() / UnityPlayer.shared.pause() / UnityPlayer.shared.resume()
ライフサイクルイベントの購読6 AppDelegateListener / LifeCycleListener NotificationCenter (UnityNotifications)
ネイティブコードからの C# 呼び出し UnitySendMessage() UnityPlayer.shared.sendMessage(toGameObject:method:argument:)7

たとえば、ライフサイクルイベントの購読は以下のように移行します。

// 変更前
@interface MyPlugin : NSObject<AppDelegateListener>
@end

- (void)applicationWillFinishLaunchingWithOptions:(NSNotification*)notification { ... }
// 変更後
NotificationCenter.default.addObserver(
    forName: UnityNotifications.applicationWillFinishLaunching,
    object: nil, queue: nil
) { _ in /* handle */ }

両プロジェクトタイプへの対応

同一ソースで両方に対応する場合は、UNITY_XCODE_PROJECT_TYPE_SWIFT マクロで分岐できます。

#if UNITY_XCODE_PROJECT_TYPE_SWIFT
    UnityPlayer *player = [UnityPlayer shared];
#else
    UnityAppController *appController = GetAppController();
#endif

また、プラグインはデフォルトで両プロジェクトタイプに含まれます。
片方のプロジェクトタイプのみを対象としたい場合は、Plugin Inspector の Xcode project type から設定できます。

Low-level native plug-in API

API 自体に変更はありませんが、ヘッダーファイルの場所が UnityFramework/UnityPluginInterface/ に移動しています。

また、Low-level native plug-in は Unity ランタイムの初期化後に登録する必要があります。
ドキュメントでは、その登録タイミングとして、ランタイムの初期化後、かつ最初のシーンが読み込まれる前に通知される UnityNotifications.unityDidInitializeRuntime の利用を推奨しています。

画面の向き (Orientation) の制御

Player Settings の Allowed Orientations for Auto Rotation は、プロジェクトタイプによって挙動が異なります。

Objective-C プロジェクトタイプでは、Player Settings で無効にした向きへも Screen API で実行時に変更できますが、Swift プロジェクトタイプでは有効にしていない向きへの変更は無視されます。

たとえば、Landscape Left / Landscape Right のみを有効にしてビルドした場合、Swift プロジェクトタイプではスクリプトから Portrait に変更できません。

Objective-C プロジェクトタイプと同様に実行時に向きを切り替えたい場合は、Default OrientationAuto Rotation にして、必要になり得る向きをすべて有効にした状態でビルドし、スクリプト側で制御する必要があります。

おわりに

Swift プロジェクトタイプの概要と、移行時の注意点について整理してみました。

移行時に確認すべきポイントはある程度見えてきましたが、現時点ではまだ不透明な点8や検証できていない点も残っています。
このあたりは今後も確認しつつ、分かったことがあればフィードバックしていければと思います。

また、Discussions では次期バージョンに向けて以下の機能も提供予定とされているため、このあたりも引き続きウォッチしていければと思います。

We are currently working on the following features for an upcoming release:

  • Provide native plug-ins with an Editor version at compile time.
  • Encapsulate the plug-in context to prevent mixing the public API with private implementation details.

参考リンク

  1. 正確には、Unity 6000.5.0a9 からサポートされています。 (リリースノート)

  2. U/Day の講演では Unity Apple OS Glue Layer と解説されていました。

  3. 本記事の内容は、Unity 6000.5.3f1 で確認しています。

  4. この API を呼び出しても動作しないことを確認しました。

  5. 有識者向けに補足すると、従来、UnityFramework.getInstance().appController() 経由で取得していた UnityAppController への参照などが該当すると思われます。

  6. 詳細は 【Unity】iOS でアプリのライフサイクルイベントやビューのイベントを受け取れるようにする を参照してください。

  7. 従来の UnitySendMessage() も引き続き利用できますが、利用するには UnityPluginInterface.h を読み込む必要があります。

  8. たとえば、ネイティブ UI の状態を受け取る仕組み (従来の UnityViewControllerListener に相当するもの) があるかどうかなどです。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?