アンリアル エンジン SDK - データ プライバシー

ドキュメント

データプライバシー法の遵守

GDPR、CCPA、その他の消費者プライバシー規制に対するユーザーの同意の選択肢をSingularに通知することで、プライバシーに準拠したデータ収集を実施する。

ユーザーが第三者との情報共有に同意または拒否する場合は、Singularのプライバシー保護方法を使用してユーザーの選択を伝えます。これにより、カリフォルニア州消費者プライバシー法(CCPA)などの規制への準拠が保証され、パートナーはユーザーのプライバシー設定を尊重することができます。

詳細はこちら:Singularがプライバシーの同意をどのように処理するかについての詳細は、ユーザーのプライバシーとデータ共有の制限をご覧ください。


データ共有の制限

サードパーティデータ共有の管理

LimitDataSharing メソッドを使用して、ユーザーが個人データをサードパーティパートナーと共有することに同意したかどうかをSingularに通知します。

メソッドの署名

static void LimitDataSharing(bool shouldLimitDataSharing)

パラメータ

  • false:ユーザーがオプトインし、データ共有に同意している。
  • true:ユーザーはオプトアウトしており、データの共有に同意していない。

重要:オプションですが、このメソッドはアトリビューションデータの共有に影響します。一部のパートナーは、ユーザーがオプトインしたことを明示的に通知した場合にのみ、完全なアトリビューション情報を共有します。

使用例

C++
// User has opted in to share their data
void AYourGameMode::OnUserOptedInToDataSharing()
{
    USingularSDKBPLibrary::LimitDataSharing(false);
    UE_LOG(LogTemp, Log, TEXT("Data sharing enabled"));
}

// User has opted out and declined to share their data
void AYourGameMode::OnUserOptedOutOfDataSharing()
{
    USingularSDKBPLibrary::LimitDataSharing(true);
    UE_LOG(LogTemp, Log, TEXT("Data sharing limited"));
}

// Example: Set based on user preference
void AYourGameMode::HandlePrivacyConsent(bool bUserConsented)
{
    // Pass inverse: false = opted in, true = opted out
    USingularSDKBPLibrary::LimitDataSharing(!bUserConsented);

    UE_LOG(LogTemp, Log, TEXT("Data sharing: %s"), 
           bUserConsented ? TEXT("Enabled") : TEXT("Limited"));
}

使用方法

Singularはこの設定をユーザープライバシーポストバックで使用し、規制遵守のために必要なパートナーに渡します。


GDPRコンプライアンスの方法

GDPR(一般データ保護規則)やその他のプライバシー規制に準拠するために、ユーザーのトラッキング同意を管理し、SDKの機能を制御します。

トラッキング同意管理

トラッキングオプトイン

GDPRオプトインイベントをSingularサーバーに送信することで、トラッキングに対する明示的なユーザーの同意を記録します。

メソッドの署名

static void TrackingOptIn()

いつ使用するか

  • GDPRコンプライアンス:GDPR規制地域でユーザーがトラッキングに明示的に同意した場合に呼び出します。
  • 同意の記録:ユーザーがSingularのシステムでGDPRに同意したことを記録します。
  • デフォルトの動作:この呼び出しがない場合、SDKはトラッキングを継続しますが、特に同意を記録しません。
C++
// User accepted tracking consent
void AGDPRManager::OnUserAcceptedTracking()
{
    USingularSDKBPLibrary::TrackingOptIn();
    UE_LOG(LogTemp, Log, TEXT("User opted in to tracking"));
}

// Example: Call after consent dialog
void AGDPRManager::ShowGDPRConsentDialog()
{
    // Your consent dialog UI logic here
    // ...

    // If user accepts:
    OnUserAcceptedTracking();
}

トラッキングコントロールメソッド

StopAllTracking(全トラッキング停止

このデバイス上の現在のユーザーに対するすべてのSDKトラッキング活動を完全に無効にします。

メソッドの署名

static void StopAllTracking()

重大な警告:このメソッドは、ResumeAllTracking() が呼び出されるまで、SDKを永久に無効にします。無効化された状態はアプリの再起動後も持続し、プログラムでのみ元に戻すことができます。

動作

  • 即時効果:すべてのトラッキング、イベントレポート、データ収集を即座に停止します。
  • 永続的な状態:アプリを終了し、再度起動しても無効のままです。
  • 自動リセットなし:再有効化するには、明示的にResumeAllTracking()
C++
// User declined all tracking
void ATrackingController::OnUserDeclinedTracking()
{
    USingularSDKBPLibrary::StopAllTracking();
    UE_LOG(LogTemp, Log, TEXT("All tracking stopped"));

    // Optionally store preference
    SaveBoolToConfig(TEXT("tracking_enabled"), false);
}

// Example: Handle user opt-out from settings menu
void ATrackingController::HandlePrivacySettingsChange(bool bTrackingEnabled)
{
    if (!bTrackingEnabled)
    {
        USingularSDKBPLibrary::StopAllTracking();
        UE_LOG(LogTemp, Log, TEXT("Privacy settings: Tracking disabled"));
    }
}

すべてのトラッキングを再開

StopAllTracking() で停止したトラッキングを再度有効にします。

メソッドの署名

static void ResumeAllTracking()

使用例

  • 同意の変更:ユーザーがプライバシー設定を変更し、トラッキングを再開する。
  • プライバシー設定:ユーザーがアプリの設定メニューから同意を更新
  • 地域コンプライアンス:ユーザーが非規制地域に移動した場合、トラッキングを再度有効にする
C++
// User opted back in to tracking
void ATrackingController::OnUserResumedTracking()
{
    USingularSDKBPLibrary::ResumeAllTracking();
    UE_LOG(LogTemp, Log, TEXT("Tracking resumed"));

    // Optionally update stored preference
    SaveBoolToConfig(TEXT("tracking_enabled"), true);
}

// Example: Handle consent update from settings
void ATrackingController::HandlePrivacySettingsChange(bool bTrackingEnabled)
{
    if (bTrackingEnabled)
    {
        USingularSDKBPLibrary::ResumeAllTracking();
        UE_LOG(LogTemp, Log, TEXT("Privacy settings: Tracking enabled"));
    }
}

IsAllTrackingStopped

現在のユーザーに対してトラッキングが無効化されているかどうかを確認します。

メソッドの署名

static bool IsAllTrackingStopped()

戻り値

  • true:トラッキングは現在StopAllTracking()
  • false:追跡が有効(停止または再開されていない
C++
// Check current tracking status on startup
void APrivacySettingsUI::BeginPlay()
{
    Super::BeginPlay();
    UpdatePrivacyUI();
}

// Check current tracking status
bool APrivacySettingsUI::IsTrackingEnabled()
{
    return !USingularSDKBPLibrary::IsAllTrackingStopped();
}

// Example: Display privacy status in settings
FString APrivacySettingsUI::GetPrivacyStatusText()
{
    if (USingularSDKBPLibrary::IsAllTrackingStopped())
    {
        return TEXT("Tracking: Disabled");
    }
    else
    {
        return TEXT("Tracking: Enabled");
    }
}

// Example: Sync UI with tracking state
void APrivacySettingsUI::UpdatePrivacyUI()
{
    bool bIsStopped = USingularSDKBPLibrary::IsAllTrackingStopped();

    if (TrackingToggle != nullptr)
    {
        TrackingToggle->SetIsChecked(!bIsStopped);
    }

    if (StatusText != nullptr)
    {
        FString StatusString = bIsStopped ? TEXT("Stopped") : TEXT("Active");
        StatusText->SetText(FText::FromString(
            FString::Printf(TEXT("Current tracking state: %s"), *StatusString)
        ));
    }

    UE_LOG(LogTemp, Log, TEXT("Current tracking state: %s"), 
           bIsStopped ? TEXT("Stopped") : TEXT("Active"));
}

// Handle toggle change from UI
void APrivacySettingsUI::OnTrackingToggleChanged(bool bEnabled)
{
    if (bEnabled)
    {
        USingularSDKBPLibrary::ResumeAllTracking();
    }
    else
    {
        USingularSDKBPLibrary::StopAllTracking();
    }

    UpdatePrivacyUI();
}

子供のプライバシー保護

TrackingUnder13

COPPA(児童オンラインプライバシー保護法)およびその他の児童プライバシー規制に準拠するため、ユーザーが13歳未満であることをSingularに通知します。

メソッドの署名

static void TrackingUnder13()

コンプライアンス要件

  • COPPA準拠:米国で13歳未満の子供からデータを収集するアプリに必要です。
  • 年齢制限コンテンツ:登録時または年齢確認時に、ユーザーが13歳未満であることを確認した場合に使用。
  • 制限付きトラッキング:子どものプライバシー保護法に準拠するため、データ収集を制限します。
C++
// User identified as under 13
void ACOPPAManager::OnUserUnder13()
{
    USingularSDKBPLibrary::TrackingUnder13();
    UE_LOG(LogTemp, Log, TEXT("COPPA mode enabled for user under 13"));
}

// Example: Call after age verification
void ACOPPAManager::OnAgeVerified(int UserAge)
{
    if (UserAge < 13)
    {
        USingularSDKBPLibrary::TrackingUnder13();
        UE_LOG(LogTemp, Log, TEXT("COPPA restrictions applied"));

        // Also limit data sharing for children
        USingularSDKBPLibrary::LimitDataSharing(true);
    }
}

// Example: Age gate implementation
void AAgeGateWidget::OnAgeSubmitted(int UserAge)
{
    if (UserAge < 13)
    {
        // Apply COPPA protections
        USingularSDKBPLibrary::TrackingUnder13();
        USingularSDKBPLibrary::LimitDataSharing(true);

        UE_LOG(LogTemp, Warning, TEXT("Child user detected - privacy protections enabled"));

        // Show age-appropriate content
        ShowChildSafeContent();
    }
    else
    {
        // Standard tracking for users 13+
        UE_LOG(LogTemp, Log, TEXT("Adult user - standard tracking enabled"));
        InitializeStandardTracking();
    }
}

重要:ユーザーが13歳未満であると判断した後、できるだけ早い段階でこのメソッドを呼び出します。理想的には、アプリの初期化中または年齢認証の直後です。こうすることで、その後のすべてのトラッキングが、子どものプライバシーに関する規制を尊重するようになります。


実装のベストプラクティス

完全なプライバシー管理の例

ユーザーの好みを尊重し、規制に準拠した包括的なプライバシー管理を実装する。

C++
// ComprehensivePrivacyManager.h
#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ComprehensivePrivacyManager.generated.h"

UCLASS()
class YOURGAME_API AComprehensivePrivacyManager : public AActor
{
    GENERATED_BODY()

public:
    AComprehensivePrivacyManager();

protected:
    virtual void BeginPlay() override;

public:
    // Initialize privacy settings on app startup
    UFUNCTION(BlueprintCallable, Category = "Privacy")
    void InitializePrivacySettings();

    // User accepts tracking via consent dialog
    UFUNCTION(BlueprintCallable, Category = "Privacy")
    void OnUserAcceptedTracking();

    // User declines tracking
    UFUNCTION(BlueprintCallable, Category = "Privacy")
    void OnUserDeclinedTracking();

    // User updates data sharing preference
    UFUNCTION(BlueprintCallable, Category = "Privacy")
    void SetDataSharingEnabled(bool bEnabled);

    // Check if tracking is currently enabled
    UFUNCTION(BlueprintCallable, Category = "Privacy")
    bool IsTrackingEnabled();

    // Get current privacy status as readable text
    UFUNCTION(BlueprintCallable, Category = "Privacy")
    FString GetPrivacyStatus();

private:
    // Helper methods for config storage
    bool GetUserConsent();
    void SaveUserConsent(bool bConsent);
    bool GetDataSharingPreference();
    void SaveDataSharingPreference(bool bEnabled);

    // Config keys
    static const FString PREF_USER_CONSENT;
    static const FString PREF_DATA_SHARING;
};

// ComprehensivePrivacyManager.cpp
#include "ComprehensivePrivacyManager.h"
#include "SingularSDKBPLibrary.h"
#include "Kismet/GameplayStatics.h"

const FString AComprehensivePrivacyManager::PREF_USER_CONSENT = TEXT("privacy_user_consent");
const FString AComprehensivePrivacyManager::PREF_DATA_SHARING = TEXT("privacy_data_sharing");

AComprehensivePrivacyManager::AComprehensivePrivacyManager()
{
    PrimaryActorTick.bCanEverTick = false;
}

void AComprehensivePrivacyManager::BeginPlay()
{
    Super::BeginPlay();

    // Initialize privacy settings on app start
    InitializePrivacySettings();
}

void AComprehensivePrivacyManager::InitializePrivacySettings()
{
    bool bHasUserConsent = GetUserConsent();
    bool bAllowDataSharing = GetDataSharingPreference();

    // Apply stored tracking preference
    if (bHasUserConsent)
    {
        USingularSDKBPLibrary::TrackingOptIn();
        USingularSDKBPLibrary::ResumeAllTracking();
        UE_LOG(LogTemp, Log, TEXT("Privacy initialized: Tracking enabled with consent"));
    }
    else
    {
        USingularSDKBPLibrary::StopAllTracking();
        UE_LOG(LogTemp, Log, TEXT("Privacy initialized: Tracking disabled"));
    }

    // Set data sharing preference (inverse logic)
    USingularSDKBPLibrary::LimitDataSharing(!bAllowDataSharing);

    UE_LOG(LogTemp, Log, TEXT("Privacy initialized: consent=%s, sharing=%s"), 
           bHasUserConsent ? TEXT("true") : TEXT("false"),
           bAllowDataSharing ? TEXT("true") : TEXT("false"));
}

void AComprehensivePrivacyManager::OnUserAcceptedTracking()
{
    SaveUserConsent(true);

    USingularSDKBPLibrary::TrackingOptIn();
    USingularSDKBPLibrary::ResumeAllTracking();

    UE_LOG(LogTemp, Log, TEXT("User accepted tracking"));
}

void AComprehensivePrivacyManager::OnUserDeclinedTracking()
{
    SaveUserConsent(false);

    USingularSDKBPLibrary::StopAllTracking();

    UE_LOG(LogTemp, Log, TEXT("User declined tracking"));
}

void AComprehensivePrivacyManager::SetDataSharingEnabled(bool bEnabled)
{
    SaveDataSharingPreference(bEnabled);

    // Note: LimitDataSharing uses inverse logic
    // false = data sharing enabled, true = data sharing limited
    USingularSDKBPLibrary::LimitDataSharing(!bEnabled);

    UE_LOG(LogTemp, Log, TEXT("Data sharing: %s"), 
           bEnabled ? TEXT("Enabled") : TEXT("Limited"));
}

bool AComprehensivePrivacyManager::IsTrackingEnabled()
{
    return !USingularSDKBPLibrary::IsAllTrackingStopped();
}

FString AComprehensivePrivacyManager::GetPrivacyStatus()
{
    bool bIsEnabled = !USingularSDKBPLibrary::IsAllTrackingStopped();
    bool bDataSharingEnabled = GetDataSharingPreference();

    return FString::Printf(TEXT("Tracking: %s\nData Sharing: %s"),
                          bIsEnabled ? TEXT("Enabled") : TEXT("Disabled"),
                          bDataSharingEnabled ? TEXT("Enabled") : TEXT("Limited"));
}

// Private helper methods for config storage

bool AComprehensivePrivacyManager::GetUserConsent()
{
    // Implement your config storage retrieval here
    // Example using GameInstance or SaveGame system
    return false; // Default to no consent
}

void AComprehensivePrivacyManager::SaveUserConsent(bool bConsent)
{
    // Implement your config storage here
    // Example using GameInstance or SaveGame system
}

bool AComprehensivePrivacyManager::GetDataSharingPreference()
{
    // Implement your config storage retrieval here
    return false; // Default to limited sharing
}

void AComprehensivePrivacyManager::SaveDataSharingPreference(bool bEnabled)
{
    // Implement your config storage here
}

ベストプラクティス

  • 永続ストレージ:Unreal Engine の SaveGame システムまたはカスタム設定ファイルを使用してユーザー設定を保存します。
  • 初期の初期化:プライバシー設定は、可能な限り SDK の初期化前に BeginPlay() 中に適用する。
  • UI 同期: IsAllTrackingStopped()を使用して、設定 UI を実際の SDK の状態と同期させます。
  • 明確なコミュニケーション:アプリの設定で、明確でアクセスしやすいプライバシーコントロールを提供する。
  • 逆ロジック: LimitDataSharing(false) はデータ共有が有効であることを意味し、true制限されていることを意味する。
  • コンプライアンスの文書化:ユーザーがいつ、どのように同意を提供し、または取り消したかの記録を保持する。

方法の参照概要

方法 説明 使用時期
LimitDataSharing(bool) ユーザーの同意に基づく第三者データ共有の制御 CCPAコンプライアンス、ユーザーのプライバシー設定
TrackingOptIn() 明示的なGDPRトラッキング同意の記録 EU地域でのGDPRコンプライアンス
StopAllTracking() SDKトラッキングを完全に無効にする ユーザーがすべてのトラッキング同意を拒否
ResumeAllTracking() トラッキング停止後、再度トラッキングを有効にする ユーザーがオプトインの同意を変更
IsAllTrackingStopped() 現在のトラッキング状況の確認 UIを同期し、操作前に状態を確認
TrackingUnder13() 子供のためのCOPPA保護を有効にする ユーザーが13歳未満であることを確認