このトピックでは、Unity アプリケーションで HTTPDNS を統合して使用する方法について説明します。
Unity は、リアルタイム 3D インタラクティブコンテンツを作成および操作するためのプラットフォームです。ゲーム開発、アート、建築、自動車設計、映画などの分野のクリエイターがアイデアを現実のものにするのに役立ちます。Unity プラットフォームは、あらゆるリアルタイムインタラクティブ 2D および 3D コンテンツを作成、操作、収益化するための完全なソフトウェアソリューションを提供します。携帯電話、タブレット、PC、ゲームコンソール、拡張現実 (AR) および仮想現実 (VR) デバイスなどのプラットフォームをサポートしています。
Unity を使用してさまざまな種類のモバイルアプリケーションを開発するケースが増えていることから、Unity 向けの専用 HTTPDNS プラグインを提供するようになりました。このプラグインは、Unity 開発者が使い慣れた方法で HTTPDNS 機能を統合するのに役立ちます。
以下のセクションでは、プラグインを使用するための手順とベストプラクティスについて説明します。
1. クイックスタート
1.1 サービスの有効化
HTTPDNS を有効にする方法の詳細については、「クイックスタート」をご参照ください。
1.2 構成の取得
EMAS コンソールの [開発設定] ページから AccountId、SecretKey、および AESSecretKey を取得します。この情報は、ソフトウェア開発キット (SDK) を初期化するために必要です。詳細については、「開発設定」をご参照ください。
1.3 プラグインをプロジェクトに統合する
このプラグインはソースコードとして提供され、GitHub で公開されています。プラグインを Unity プロジェクトにコピーすることで統合できます。
1.3.1 Unity パッケージのインポート
httpdns_unity_demoディレクトリをダウンロードします。Assets/Pluginsディレクトリ全体をご利用の Unity プロジェクトにコピーします。Assets/Editorディレクトリ (オプション、テスト UI の作成に使用) をご利用のプロジェクトにコピーします。
プロジェクトの構造は次のようになります:
YourUnityProject/
├── Assets/
│ ├── Plugins/
│ │ ├── HttpDnsHelper.cs # メインインターフェイスファイル
│ │ ├── AndroidHttpDnsHelper.cs # Android プラットフォーム実装
│ │ ├── iOSHttpDnsHelper.cs # iOS プラットフォーム実装
│ │ ├── CHttpDnsHelper.cs # C SDK プラットフォーム実装
│ │ ├── Android/ # Android JAR ライブラリ
│ │ ├── iOS/ # iOS ブリッジファイル
│ │ └── C/ # C SDK
│ └── Editor/ # テスト UI クリエーター
├── ProjectSettings/
└── ...このプラグインは、baseProjectTemplate、mainTemplate、proguard-user、settingsTemplate などのファイルを使用します。プロジェクトの他の部分でもこれらのファイルをカスタマイズする必要がある場合は、変更をマージしてください。
1.3.2 ネイティブ SDK バージョンの確認
このプラグインは、対応するプラットフォーム用のネイティブ HTTPDNS SDK を統合しています。現在のバージョンは次のとおりです:
Android:
com.aliyun.ams:alicloud-android-httpdns:2.6.5iOS:
AlicloudHTTPDNS:3.2.1C:
alibabacloud-httpdns-c-sdk:2.2.5
2. インストールと構成
2.1 Unity 依存関係の追加
ご利用の Unity プロジェクトで次の設定を行います:
# Unity プロジェクト設定
Player Settings:
- Android:
Minimum API Level: 19+
Internet Permission: Enabled
- iOS:
Deployment Target: 12.0+
Internet Capability: Enabled
- C:
Platforms: Windows/macOS
Architectures: x64/arm64
Scripting Backend: Mono or IL2CPPこのプラグインはローカルのソースコード依存関係を使用します。プラグインをプロジェクトに追加した後、ターゲットプラットフォーム用に設定する必要があります。
2.2 ネイティブ SDK バージョンの更新
ネイティブ HTTPDNS SDK のバージョンを更新するには、次の手順を実行します:
2.2.1 Android SDK バージョンの更新
Android SDK は Maven の依存関係を通じて管理されます。Assets/Plugins/Android/mainTemplate.gradle の dependencies セクションでバージョン番号を変更します:
dependencies {
// 他の依存関係...
implementation 'com.aliyun.ams:alicloud-android-httpdns:2.6.5' // 必要なバージョンに変更
}Android、iOS、および C プラットフォームの API 操作は異なる場合があることにご注意ください。詳細については、各プラットフォームの公式ドキュメントをご参照ください。
カスタム Gradle テンプレート (Custom Main/Base Gradle Template、Custom Proguard) を有効にすると、Unity Build はリポジトリから対応するバージョンを自動的にプルします。
利用可能なバージョンについては、「Android SDK リリースノート」をご参照ください。
2.2.2 iOS SDK バージョンの更新
ビルド後のプロセッサで CocoaPods の依存関係バージョンを編集します:
// HttpDnsIOSPostProcessor.cs でバージョンを更新
podfileContent += " pod 'AlicloudHTTPDNS', '~> 3.2.1'\n";
// 必要なバージョンに更新
podfileContent += " pod 'AlicloudHTTPDNS', '~> new_version_number'\n";利用可能なバージョンについては、「iOS SDK リリースノート」をご参照ください。
2.2.3 C SDK バージョンの更新
次の手順を実行します:
更新された C SDK のソースコードをダウンロードします。
ローカルマシンでソースコードをコンパイルして、ネイティブライブラリファイルを生成します。
生成されたライブラリファイルを Unity プロジェクトのプラグインディレクトリに配置します。たとえば、Windows 用の
.dllファイルまたは macOS 用の.dylibファイルをAssets/Plugins/C/x86_64/ディレクトリに配置します。Unity に戻り、プロジェクトをリビルドして変更を有効にします。
詳細とバージョンの詳細については、「C SDK リリースノート」をご参照ください。
2.2.4 プロジェクトのリビルド
バージョンを更新した後、プロジェクトをリビルドする必要があります。
Android:
# Unity エディター内
File -> Build Settings -> Android -> BuildiOS:
# Unity エディターでビルド後、cd [iOS ビルドディレクトリ]
pod install --repo-update
open Unity-iPhone.xcworkspaceC (Windows/macOS):
# Unity エディター内
File -> Build Settings -> PC, Mac & Linux Standalone -> Build3. 構成と使用方法
3.1 初期化
アプリケーションの起動後、HTTPDNS 操作を呼び出す前にプラグインを初期化する必要があります。初期化には、AccountId、SecretKey、およびその他の機能スイッチの設定が含まれます。以下のコードは例です:
using UnityEngine;
public class HttpDnsManager : MonoBehaviour
{
void Start()
{
// HTTPDNS の初期化 - 段階的初期化モード
HttpDnsHelper.init("YOUR_ACCOUNT_ID", "YOUR_SECRET_KEY");
// 機能オプションの設定
HttpDnsHelper.setHttpsRequestEnabled(true);
HttpDnsHelper.debug(true);
HttpDnsHelper.setTimeout(3000);
// 高度な機能設定
HttpDnsHelper.setPersistentCacheIPEnabled(true, 3600); // 1 時間の永続キャッシュを有効化
HttpDnsHelper.setReuseExpiredIPEnabled(true); // 期限切れ IP アドレスの再利用を許可
HttpDnsHelper.setPreResolveAfterNetworkChanged(true); // ネットワーク切り替え時の自動事前解決を有効化
// サービスインスタンスのビルド
bool success = HttpDnsHelper.build();
if (success)
{
Debug.Log("HTTPDNS initialized successfully");
// 頻繁に使用するドメイン名を事前解決
var hosts = new List<string> { "www.aliyun.com", "ecs.console.alibabacloud.com" };
HttpDnsHelper.setPreResolveHosts(hosts, "auto");
}
else
{
Debug.LogError("HTTPDNS initialization failed");
}
}
}setHttpsRequestEnabled パラメーターを true に設定すると、コストが増加します。詳細については、「製品の課金」をご参照ください。
ドメイン名情報または SDNS パラメーターに高いセキュリティ要件がある場合は、aesSecretKey パラメーターを設定して、名前解決リクエストのコンテンツ暗号化を有効にできます。コンテンツ暗号化を使用すると、コストが増加します。詳細については、「製品の課金」をご参照ください。
3.1.1 ログ構成
アプリケーション開発中に、ログ出力制御メソッドを呼び出すことで HTTPDNS のログ記録を有効にできます。以下のコードは例です:
HttpDnsHelper.debug(true);
Debug.Log("Log output is enabled");3.1.2 SessionId の記録
アプリケーションの実行中に、getSessionId メソッドを呼び出して sessionId を取得し、アプリケーションのデータ収集システムに記録できます。sessionId は特定のアプリケーションセッションを識別します。これを使用して、オンラインでのトラブルシューティング中に特定のセッションの名前解決ログをクエリできます。以下のコードは例です:
string sessionId = HttpDnsHelper.getSessionId();
Debug.Log($"SessionId = {sessionId}");3.2 ドメイン名の名前解決
3.2.1 事前解決
事前にドメイン名を解決する必要がある場合は、事前解決メソッドを呼び出すことができます。次のコードは例です:
var hosts = new List<string> { "www.aliyun.com", "www.example.com" };
HttpDnsHelper.setPreResolveHosts(hosts, "both");
Debug.Log("Preresolution is set successfully");このメソッドが呼び出されると、プラグインはドメイン名の名前解決を開始し、その結果をメモリにキャッシュして、後続のリクエストで直接使用できるようにします。
3.2.2 ドメイン名の名前解決
ドメイン名を解決する必要がある場合は、ドメイン名の名前解決メソッドを呼び出して IP アドレスを取得できます。以下のコードは例です:
public void ResolveDomain(string hostname)
{
// 同期非ブロッキング解決
var result = HttpDnsHelper.resolveHostSyncNonBlocking(hostname, "auto");
if (result != null)
{
Debug.Log($"IPv4 addresses: {result.IPv4.Count}");
Debug.Log($"IPv6 addresses: {result.IPv6.Count}");
Debug.Log($"TTL: {result.TTL} seconds");
}
}注: resolveHostSyncNonBlocking は同期非ブロッキング名前解決メソッドであり、null または結果が返されない場合があります。この機能は事前解決と併用することを推奨します。名前解決の結果が返されない場合は、リクエストをシステム DNS にフォールバックしてください。
4. Unity のベストプラクティス
4.1 仕組み
この例は、Unity で HTTPDNS を統合するための完全なソリューションを示しています:
統一されたクロスプラットフォームインターフェイス:
HttpDnsHelperを使用して統一された API を提供します。プラットフォーム固有の実装: Android、iOS、および C SDK 用に異なる基盤実装を提供します。
自動 DNS 置換: ネットワークリクエストの前に、ドメイン名を解決済みの IP アドレスに自動的に置き換えます。
Host ヘッダーの設定: HTTPS/SSL 接続に対して Server Name Indication (SNI) が正しく設定されていることを確認します。
4.2 ネットワークリクエストの統合
異なるネットワークモジュールを使用してリクエストを送信する場合、リクエストヘッダーの設定やその他の関連操作を行う必要があります。以下のセクションでは、HttpClient、HttpWebRequest、および UnityWebRequest の例を示します。
4.2.1 HttpClient
using System;
using System.Net.Http;
using UnityEngine;
public class HttpDnsHttpClient : MonoBehaviour
{
private static readonly HttpClient httpClient = new HttpClient();
public async void MakeRequest(string url)
{
try
{
var uri = new Uri(url);
string hostname = uri.Host;
// HTTPDNS を使用してドメイン名を解決
var result = HttpDnsHelper.resolveHostSyncNonBlocking(hostname, "auto");
if (result != null && result.IPv4 != null && result.IPv4.Count > 0)
{
string resolvedIP = result.IPv4[0];
string newUrl = url.Replace(hostname, resolvedIP);
using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, newUrl))
{
// 重要: SSL/SNI の正確性を確保するために Host ヘッダーを設定
requestMessage.Headers.Host = hostname;
var response = await httpClient.SendAsync(requestMessage);
string content = await response.Content.ReadAsStringAsync();
Debug.Log($"Request successful: {response.StatusCode}");
}
}
}
catch (Exception e)
{
Debug.LogError($"Request failed: {e.Message}");
}
}
}4.2.2 HttpWebRequest
using System;
using System.IO;
using System.Net;
using UnityEngine;
public class HttpDnsWebRequest : MonoBehaviour
{
public void MakeRequest(string url)
{
try
{
var uri = new Uri(url);
string hostname = uri.Host;
// HTTPDNS を使用してドメイン名を解決
var result = HttpDnsHelper.resolveHostSyncNonBlocking(hostname, "auto");
if (result != null && result.IPv4 != null && result.IPv4.Count > 0)
{
string resolvedIP = result.IPv4[0];
string newUrl = url.Replace(hostname, resolvedIP);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(newUrl);
request.Method = "GET";
// 重要: SSL/SNI の正確性を確保するために Host ヘッダーを設定
request.Host = hostname;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream))
{
string content = reader.ReadToEnd();
Debug.Log($"Request successful: {response.StatusCode}");
}
}
}
catch (Exception e)
{
Debug.LogError($"Request failed: {e.Message}");
}
}
}4.2.3 UnityWebRequest (非推奨)
UnityWebRequest は SNI を正しく設定できません。サーバーが特定のドメイン証明書を返すために SNI に依存している場合、SSL 認証は失敗します。したがって、これらのドメイン名を処理するには、最初の 2 つのネットワークリクエストメソッドを使用することを推奨します。
using System;
using System.Collections;
using UnityEngine;
using UnityEngine.Networking;
public class HttpDnsUnityWebRequest : MonoBehaviour
{
public IEnumerator MakeRequest(string url)
{
var uri = new Uri(url);
string hostname = uri.Host;
// HTTPDNS を使用してドメイン名を解決
var result = HttpDnsHelper.resolveHostSyncNonBlocking(hostname, "auto");
if (result != null && result.IPv4 != null && result.IPv4.Count > 0)
{
string resolvedIP = result.IPv4[0];
string newUrl = url.Replace(hostname, resolvedIP);
using (UnityWebRequest request = UnityWebRequest.Get(newUrl))
{
// 重要: Host ヘッダーを設定
request.SetRequestHeader("Host", hostname);
yield return request.SendWebRequest();
if (request.result == UnityWebRequest.Result.Success)
{
Debug.Log($"Request successful: {request.responseCode}");
}
else
{
Debug.LogError($"Request failed: {request.error}");
}
}
}
}
}4.3 テスト UI の使用
このプロジェクトでは、2 つのテスト UI クリエーターが提供されています:
基本テスト UI:
HttpDNS/Create DNS Test UIメニューから作成します。高度なテスト UI:
HttpDNS/Create Advanced Test UIメニューから作成します。
テスト UI には、統合を迅速に検証するのに役立つ完全な機能デモが含まれています。
5. API リファレンス
5.1 初期化メソッド
init
HTTPDNS サービスを初期化します。
// 基本的な初期化
HttpDnsHelper.init(string accountId, string secretKey);
// 完全な初期化
HttpDnsHelper.init(string accountId, string secretKey, string aesSecretKey);パラメーター:
accountId: HTTPDNS アカウント ID (必須)。secretKey: AccessKey ペア (オプション、認証に使用)。aesSecretKey: AES 暗号鍵 (オプション、暗号化に使用)。
ドメイン名情報または SDNS パラメーターに高いセキュリティ要件がある場合は、aesSecretKey パラメーターを設定して、名前解決リクエストのコンテンツ暗号化を有効にできます。コンテンツ暗号化を使用すると、コストが増加します。詳細については、「製品の課金」をご参照ください。
build
HTTPDNS サービスインスタンスをビルドします。すべての設定を行った後にこのメソッドを呼び出します。
bool success = HttpDnsHelper.build();戻り値:
true: インスタンスは正常にビルドされました。false: インスタンスのビルドに失敗しました。
5.2 構成メソッド
debug
デバッグログを出力するかどうかを制御します。
HttpDnsHelper.debug(bool enable);setHttpsRequestEnabled
DNS クエリに HTTPS を使用するかどうかを設定します。
HttpDnsHelper.setHttpsRequestEnabled(bool enable);setHttpsRequestEnabled パラメーターを true に設定すると、コストが増加します。詳細については、「製品の課金」をご参照ください。
setTimeout
DNS クエリのタイムアウト期間を設定します。
HttpDnsHelper.setTimeout(int timeoutMs);setPersistentCacheIPEnabled
永続キャッシュを有効にするかどうかを設定します。
HttpDnsHelper.setPersistentCacheIPEnabled(bool enable, int cacheTTL);パラメーター:
enable: 機能を有効にするかどうかを指定します。cacheTTL: キャッシュの存続時間 (TTL) (秒単位)。
setReuseExpiredIPEnabled
期限切れの IP アドレスの再利用を許可するかどうかを設定します。
HttpDnsHelper.setReuseExpiredIPEnabled(bool enable);setPreResolveAfterNetworkChanged
ネットワークが変更されたときに、事前解決されたドメイン名を自動的に更新するかどうかを設定します。
HttpDnsHelper.setPreResolveAfterNetworkChanged(bool enable);5.3 名前解決メソッド
getIpsByHostAsync
ドメイン名を非同期で解決します。
List<string> ips = HttpDnsHelper.getIpsByHostAsync(string hostname);戻り値: IP アドレスのリスト。解決に失敗した場合は、null または空のリストを返します。
getIpsByHost
ドメイン名を同期的に解決します。
List<string> ips = HttpDnsHelper.getIpsByHost(string hostname);resolveHostSyncNonBlocking
同期非ブロッキング名前解決を実行し、詳細情報を返します。
HttpDnsResult result = HttpDnsHelper.resolveHostSyncNonBlocking(string hostname, string ipType);パラメーター:
hostname: 解決するドメイン名。ipType: IP アドレスの種類 ("auto"、"ipv4"、"ipv6"、または "both")。
返されるオブジェクトには以下が含まれます:
IPv4: IPv4 アドレスのリスト。IPv6: IPv6 アドレスのリスト。TTL: キャッシュの TTL。Extra: 追加情報。
5.4 事前解決メソッド
setPreResolveHosts
事前解決するドメイン名のリストを設定します。
// 単一のドメイン名
HttpDnsHelper.setPreResolveHosts(string hostname);
// 複数のドメイン名
HttpDnsHelper.setPreResolveHosts(List<string> hostnames, string ipType);5.5 キャッシュ管理
clearCache
指定したドメイン名のキャッシュをクリアします。
HttpDnsHelper.clearCache();cleanAllHostCache
すべてのドメイン名のキャッシュをクリアします。
HttpDnsHelper.cleanAllHostCache();5.6 ヘルパーメソッド
getSessionId
現在のセッション ID を取得します。
string sessionId = HttpDnsHelper.getSessionId();6. よくある質問
6.1 Android ビルドの問題
問題: Gradle が com.aliyun.ams:alicloud-android-httpdns の依存関係を解決できない、またはビルドが失敗する。
解決策:
カスタム Gradle テンプレートを有効にします (Player Settings -> Publishing Settings -> Custom Main/Base Gradle Template)。
Assets/Plugins/Android/mainTemplate.gradleファイルを確認します:repositoriesセクションが Alibaba Cloud のリモートリポジトリミラーで設定されていることを確認します。dependenciesセクションにimplementation 'com.aliyun.ams:alicloud-android-httpdns:version_number'が含まれていることを確認します。
6.2 iOS ビルドの問題
問題: iOS ビルド後に CocoaPods の依存関係が見つからない。
ソリューション: ビルド手順で説明されているように、pod install コマンドを必ず実行してください。その後、.xcworkspace ファイルを使用してプロジェクトを開きます。
6.3 C SDK プラットフォームの問題
問題: C SDK プラットフォームにネイティブライブラリの依存関係がない。
解決策:
Windows: VCPKG がインストールされ、環境変数が設定されていることを確認します。
macOS: Homebrew の依存ライブラリがインストールされていることを確認します。
ビルド後プロセッサがライブラリファイルを正しくコピーしたかどうかを確認します。
依存ライブラリをビルドディレクトリに手動でコピーします。
6.4 ネットワークリクエストの問題
問題: HTTPS リクエストが証明書エラーで失敗する。
ソリューション: 正しい Host ヘッダーを設定していることを確認してください。SNI としては、IP アドレスではなく、元のドメイン名を使用します。