2021年02月13日

[Unity] Visual Studio CodeでC#のメソッド一覧が表示されない(No editor symbols)ときの対処法

Visual Studio Code(以降、VSC)の便利な機能に、メソッドや変数一覧を表示する機能があります。

環境:
Unity 2020.2.2f1
MacOS Catalina 10.15.7

Macなので、VSCの画面にて、[command] + [Shift] + [o] を押すと画面上に「@」と入力された状態の入力蘭が表示され、メソッド等の一覧が表示されます。
しかし、そうはなりませんでした。

スクリーンショット 2021-02-12_1.png

エディタには何やら警告が表示されているので、「Show Output」を押してログを確認してみました。

スクリーンショット 2021-02-12_2.png



[warn]: OmniSharp.MSBuild.ProjectManager
Failed to load project file '/Users/Shared/Unity/AppName/Assembly-CSharp.csproj'.
/Users/Shared/Unity/AppName/Assembly-CSharp.csproj
/Users/hogehoge/.vscode/extensions/ms-dotnettools.csharp-1.23.9/.omnisharp/1.37.6/omnisharp/.msbuild/Current/Bin/Microsoft.Common.CurrentVersion.targets(1180,5): Error: The reference assemblies for .NETFramework,Version=v4.7.1 were not found. To resolve this, install the Developer Pack (SDK/Targeting Pack) for this framework version or retarget your application. You can download .NET Framework Developer Packs at https://aka.ms/msbuild/developerpacks
[fail]: OmniSharp.MSBuild.ProjectManager
Attempted to update project that is not loaded: /Users/Shared/Unity/AppName/Assembly-CSharp.csproj



どうもC#用のパックが必要らしいので、記載されているURLに行ってみるものの、Winしかありませんでした。
困ったので調べてみると、以下の方法で解決できました。

■Unity側
@Player Settings > Other Settings > Configuration > Api Compatibility Level を「.NET 4.x」に変更。
■mac側
@homebrewを最新版にアップデート
※homebrew = macのPackageManagerのようなもの
Ahomebrewからmonoをインストール
BVSCの設定ファイルに追記

具体的に説明していきます。



■Unity側
@Player Settings > Other Settings > Configuration > Api Compatibility Level を「.NET 4.x」に変更。

.NETの設定が合っていない可能性があるので、プロジェクト設定を「.Net Standard 2.0」から「.Net 4.x」に変更。

スクリーンショット 2021-02-13_6.png

次に、Package Managerから、VSCに関するものを最新版に上げてみました。

スクリーンショット 2021-02-12_3.png

この段階で解決しなかったので、次はmac側の環境設定を調べてみたところ、homebrewが古くて設定も完了していないようでした。



■mac側
@homebrewを最新版にアップデート

最新版にアップデートしようとしたところ、エラーが出てしまいました。


% brew update
fatal: could not read Username for 'https://github.com': terminal prompts disabled
Error: homebrew/homebrew-php does not exist! Run `brew untap homebrew/homebrew-php` to remove it.
==> Downloading https://homebrew.bintray.com/bottles-portable-ruby/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
################################################################# 100.0%
==> Pouring portable-ruby-2.6.3_2.yosemite.bottle.tar.gz


ログで指定されたコマンドをそのまま打ちます。


% brew untap homebrew/homebrew-php
Untapping homebrew/php...
Untapped (35 files, 829.2KB).


再びアップデートを試みるも、再びエラー。


% brew update
Error:
homebrew-core is a shallow clone.
To `brew update`, first run:
git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
This command may take a few minutes to run due to the large size of the repository.
This restriction has been made on GitHub's request because updating shallow
clones is an extremely expensive operation due to the tree layout and traffic of
Homebrew/homebrew-core and Homebrew/homebrew-cask. We don't do this for you
automatically to avoid repeatedly performing an expensive unshallow operation in
CI systems (which should instead be fixed to not use shallow clones). Sorry for
the inconvenience!


指定されたコマンドを打ったところ、今度は無事アップデートできました。


% git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow
remote: Enumerating objects: 428535, done.
remote: Counting objects: 100% (428498/428498), done.
remote: Compressing objects: 100% (164714/164714), done.
remote: Total 420389 (delta 257766), reused 415481 (delta 252864), pack-reused 0
Receiving objects: 100% (420389/420389), 149.84 MiB | 15.91 MiB/s, done.
Resolving deltas: 100% (257766/257766), completed with 3776 local objects.


念のため確認。


% brew update
Already up-to-date.


次は、homebrewの設定状況を確認するため、「doctor」コマンドを使います。


% brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: The following directories do not exist:
/usr/local/Frameworks

You should create these directories and change their ownership to your user.
sudo mkdir -p /usr/local/Frameworks
sudo chown -R $(whoami) /usr/local/Frameworks

Warning: Unbrewed static libraries were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

Unexpected static libraries:
/usr/local/lib/libTMAESCrypt.a

Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause formulae that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
boost
php
mysql

Warning: Xcode alone is not sufficient on Catalina.
Install the Command Line Tools:
xcode-select --install

Warning: Broken symlinks were found. Remove them with `brew cleanup`:
/usr/local/bin/innochecksum
 ……(たくさん)

Warning: Homebrew's "sbin" was not found in your PATH but you have installed
formulae that put executables in /usr/local/sbin.
Consider setting your PATH for example like so:
echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.zshrc


doctorで指摘されたコマンドを全て実行。


% sudo mkdir -p /usr/local/Frameworks
% sudo chown -R $(whoami) /usr/local/Frameworks
% brew cleanup
% xcode-select --install
% brew link boost
% brew link php
% brew link mysql
% rm -rf /usr/local/lib/libTMAESCrypt.a
% echo 'export PATH="/usr/local/sbin:$PATH"' >> ~/.zshrc


パスの設定変更を反映。


% source ~/.zshrc


これでhomebrewの設定が完了しました。念のため確認。


% brew doctor
Your system is ready to brew.


次のステップへ。

Ahomebrewからmonoをインストール

monoがインストールされているかと思いきや、インストールされていませんでした。


% brew upgrade mono
Updating Homebrew...
Error: mono not installed


なので、monoをインストール。


% brew install mono


数分でインストールできたので、doctorコマンドで設定をチェック。


% brew doctor
Warning: You have unlinked kegs in your Cellar.
Leaving kegs unlinked can lead to build-trouble and cause formulae that depend on
those kegs to fail to run properly once built. Run `brew link` on these:
mono

Warning: Broken symlinks were found. Remove them with `brew cleanup`:
/usr/local/bin/easy_install-3.8
/usr/local/bin/pip3.8


指定されたコマンドを打ち、monoにリンクを貼りました。


% brew cleanup
% brew link mono
% brew doctor
Your system is ready to brew.


最後に、VSCの設定ファイルを編集します。

BVSCの設定ファイルに追記

まずは、インストールされたmonoのバージョンを確認。


% cd /usr/local/Cellar/mono
% ls
6.12.0.107


このバージョン番号を使い、VSCの設定ファイルに追記します。

スクリーンショット 2021-02-13_4.png

macの場合、パスは
/Users/[ユーザー名]/Library/Application Support/Code/User/settings.json
でした。

赤い部分が追記した箇所です。


{
"window.zoomLevel": 0,
"omnisharp.useGlobalMono": "always",
"omnisharp.monoPath": "/usr/local/Cellar/mono/6.12.0.107"

}


VSCを再起動して、[command] + [Shift] + [o]を押してみたところ、無事、メソッド一覧が表示されました。

スクリーンショット 2021-02-13_5.png

これで作業効率が上がる!!

参考:
https://qiita.com/kyasbal_1994/items/ecf19a3feb60a12a61f9
https://qiita.com/hajimeni/items/b8d1b5db1cb08eeb7d1d
https://qiita.com/Ytz_Ichi/items/94e1c5c45fc8fd4459fa
https://qiita.com/ponsuke0531/items/f2ea798bcc8f1e876d90
https://qiita.com/haruu_11113/items/0bdde67f17b60e4fb657
https://qiita.com/FrogWoman/items/7c0fdaa7550dc5895a33
posted by be-style at 21:17| Comment(0) | Unity

2021年01月27日

[iOS] App Store Connectの「Appのプライバシー」のチェック項目について

2021年1月26日現在、アプリを更新しようとApp Store Connectで申請しようとしたところ、「Appのプライバシー」という項目を設定する必要がありました。
アップルの審査は通りましたが、チェック項目が多くて迷ったのでメモとして残しておきます。

【注意】
現在はこれで審査が通ったというだけで、今後の状況や申請するアプリの内容によってチェックする項目が変わりますのでご注意ください。

スクリーンショット 2021-01-26-1.png

「はじめに」を押して進むと、ユーザーのどういう情報を収集するかのアンケートでした。
参考サイトを参考に、選んだのは、以下の6つでした。

・位置情報 > おおよその場所
・ID > デバイスID
・使用状況データ > 製品の操作
・使用状況データ > 広告データ
・診断 > クラッシュデータ
・診断 > パフォーマンスデータ

スクショは縦長なので、別リンクにしておきました。
スクリーンショット 2021-01-26.png

設定が終わると、先ほど選択した6つの項目について、さらに詳細にアンケートに答える必要がありました。

スクリーンショット 2021-01-26-2.png

「デバイスIDの設定」を押して進み、該当すると思われる項目にチェックを入れていきました。

スクリーンショット 2021-01-26-3.png

スクリーンショット 2021-01-26-4.png

スクリーンショット 2021-01-26-5.png

設定し終わると、先ほどの項目が更新されました。

スクリーンショット 2021-01-26-6.png

他に、先の6項目についても表示が追加されていました。

スクリーンショット 2021-01-26-7.png

今後も時代の流れに沿って変わっていくとは思うけど、対応していくのは大変だなー。

参考:
https://zenn.dev/kazushige/articles/9afa10b36d6828
https://support.google.com/admob/answer/9755590?hl=ja

------------------------------ 追記 ------------------------------

必要な設定がすべて完了すると、画面右上の「公開」ボタンが有効になります。

スクリーンショット 2021-02-09-1.png

確認メッセージが表示されるので「公開」を押せば、一連の作業は完了です。

スクリーンショット 2021-02-09-2.png
posted by be-style at 10:28| Comment(0) | iOS

2021年01月22日

[Unity] iOS14のATT(App Tracking Transparency)に対応してAdMob広告を表示した

Unity製のアプリをiOS14のATT(App Tracking Transparency)に対応させてAdMob広告を表示した話。
部分的な情報はあったものの、ATT対応して広告を表示するまでの一連の流れが載っていなかったので、自分用にメモ。

環境:
・macOS Catalina (10.15.7)
・UnityHub2.4.2
・Unity2020.2.1f1 Personal
・Xcode12.3
・iOS14.3
使用SDK:
Google Mobile Ads Unity Plugin v5.4.0


手順:
@ 空のUnityプロジェクトを用意
A AdMobのUnityプラグインをインポート
B ATT対応
B-1. PostBuild処理にてinfo.plistへ追記
B-2. 独自のiOS用プラグインを用意
B-3. 独自プラグインを使った実装
C 実機テスト


@空のUnityプロジェクトを用意
UnityHubを起動。
新規作成ボタンの右にある△ボタンを押して、2020.2.1f1を選択。
テンプレートに「Mobile 3D」という選択肢があったので選択してみた。

20210121_01.png


AAdMobのUnityプラグインをインポート
AdMobページのMobile Ads SDK(Unity)のページへ移動。
ページ中段の「Mobile Ads Unity プラグインをダウンロードする」から、「プラグインをダウンロード」を選択。
2020年1月21日現在、Google Mobile Ads Unity Plugin v5.4.0 が最新版です。

画面中段に「Built and tested with:」という記載から
Google Mobile Ads iOS SDK 7.68.0
を発見。ATT対応は7.64.0以降なので、このSDKは対応していることを確認。

ページ下の「GoogleMobileAds-v5.4.0.unitypackage」のリンクから、パッケージをダウンロード。
ダウンロードしたパッケージファイルをUnityを開いた状態でWクリック。
インポートウィンドウが開くので、そのまますべてをUnityプロジェクトにインポート。

Android用にパッケージマネージャーへのレジストリの追加登録が聞かれるので、そのまま右下ボタン「Add Selected Registries」を選択。

20210121_02_1.png

レジストリ登録が完了すると、こんなメッセージが表示される。

20210121_02_2.png

さらに、「Migrating Packages」というウィンドウが表示されるので、ここでも何も考えず「Apply」を選択。

20210121_02_3.png

色々と自動で設定してくれるのはありがたい。

Unityメニュー > File > Build Settings からプラットフォームをiOSに変更
これで準備完了。

早速サンプルシーンを開いてみる。
インポートした中で、Asset > Scenes に SampleSceneファイルがあるので、Wクリックして開いてみる。

20210121_02_4.png

シーンの中身を確認したところ、ライトとカメラの2つのオブジェクトしか入ってなかった。
サンプルなんて入ってないじゃないか!

20210121_02_5.png

何も表示されなくていいので、とりあえず実機でのアプリ起動まで持っていくことにする。
スタートガイドに従ってプロジェクトの設定をしていく。


後で見直したところ、スタートガイド中段にある「Mobile Ads Unity プラグインをダウンロードする」下にある「ソースを見る」からGitHubに行くと、サンプルソースがありました。
サンプルソースのパス: https://github.com/googleads/googleads-mobile-unity/tree/master/samples



AdMobアプリIDを設定する

Unityメニュー > Assets > Google Mobile Ads > Settings...
を選択すると、インスペクターが表示されるので、
・Google AdMob > Enabled にチェックを入れる
・AdMob App IDのAndroidとiOSにテスト用AppIDを入力する

20210121_02_6.png

ちなみに、Google AdMob > Enabled にチェックを入れておかないとビルド時にエラーが出るので注意。

20210121_02_9.png

スタートガイドのスクショにあるAppIDはそのまま使えたので、テキストでも記載しておく(動作確認したのはiOSのみ)。

iOSca-app-pub-3940256099942544~1458002511
Androidca-app-pub-3940256099942544~3347511713


スクリプトとオブジェクトを新しく用意する

一番簡単そうなバナー広告を表示する。そのためにC#ファイルを作る。
ファイル名は「MySample」にした。

20210121_02_7.png

Hierarchyウィンドウに移り、空のオブジェクトを作成する。
そのオブジェクトに先ほど作成したMySampleのC#ファイルを適用する。

20210121_02_8.png

Unityの実行画面でバナー広告を表示する
MySample.cs
using GoogleMobileAds.Api;
public class MySample : MonoBehaviour
{
private BannerView bannerView;
void Start()
{
// AdMobを初期化
MobileAds.Initialize(initStatus => {
// AdMobからのコールバックはメインスレッドで呼び出される保証がないため、次のUpdate()で呼ばれるようにMobileAdsEventExecutorを使用
MobileAdsEventExecutor.ExecuteInUpdate(() => {
// バナーをリクエスト
this.RequestBanner();
});
});
}
private void RequestBanner()
{
#if UNITY_ANDROID
string adUnitId = "ca-app-pub-3940256099942544/6300978111";
#elif UNITY_IPHONE
string adUnitId = "ca-app-pub-3940256099942544/2934735716";
#else
string adUnitId = "unexpected_platform";
#endif
// 画面上に320x50のバナーを用意
this.bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
// 広告をリクエスト
AdRequest request = new AdRequest.Builder().Build();
// バナーを読み込む
this.bannerView.LoadAd(request);
}
}

広告イベントは割愛して、これでバナー広告が表示された。
※Unityの実行画面で確認できた

20210121_02_10.png

詳しくはバナー広告のページを確認する。
プログラムで使用しているテスト用の広告ユニットIDは、ここに記載されてあったものを使用した。

実機でバナー広告を表示する

Unityの実行画面ででバナー広告を表示できたので、次は実機で表示してみる。
Unityメニュー > File > Build Settings... でBuild Settingsウィンドウを開く。
・Add Open Scenes で、今開いている「SampleScene」を「Scenes in Build」に追加。
・Platform = iOS を確認。
・Player Settingの設定はそのまま
上記3点を確認したら、Buildボタンを押してビルドする。

20210121_02_11.png

ビルド結果の保存先を聞かれるので、プロジェクトのディレクトリ内に「iOS」とか適当なディレクトリを作って選択。

ビルド中になぜか「TMP Importer」が起動した。
何も考えず、「Import TMP Essentials」を選択して更新しておく。

20210121_02_12.png

ビルドが成功すると、先ほど作ったiOSディレクトリの中にXcodeプロジェクトが保存される。
その中から、Unity-iPhone.xcworkspaceをWクリックして開く。
※拡張子が「.xcodeproj」の方ではないので注意

Xcodeの設定をして実機で確認する

Xcode側での作業は、Appleの開発者アカウントを自分のものに変更しただけだった。
左メニューのプロジェクト(Unity-iPhone)を選択 > TARGETS > Signing & Capabilities > 自分のApple開発者アカウントを設定

これでXcodeでビルド&実行すると、無事、実機でもバナー広告が表示された。
※バナー上部の隙間は、セーフエリアだと思われる

20210121_02_13.png


BATT対応
このままだとATT(App Tracking Transparency)には未対応なので、ユーザーの好みじゃない広告が表示される可能性が高くなるし、アップルの審査にもひっかかってしまう。

参考ページによると、iOS14からはATT(App Tracking Transparency)とSKAdNetworkを設定する必要があるそうです。

ATTに対応してAdMob広告を表示するためには、いくつかの手順がある。

(1) iOS用のAdMob SDKのバージョンが7.64.0以上を使用
(2) GoogleのSKAdNetwork IDを設定
(3) Privacy - Tacking Usage Description(NSUserTrackingUsageDescription)を設定
(4) AppTrackingTransparency.frameworkを参照するように設定(iOSプラグインにて必要)


(1)については、AdMobのUnity用プラグイン(ver5.4.0)の説明にて「Google Mobile Ads iOS SDK 7.68.0」とあるのでクリア。

(2)についても、(1)と同じ説明ページにて「Add support for iOS14 with Google's SKAdNetwork identifiers automatically included in Info.plist.」とあるので、info.plistにSKAdNetwork IDが自動的に設定されるのでクリア。

(3)と(4)については、Xcode側に毎回手入力するのは効率が悪いので、Unity側でPostBuild処理にて行うようにする。


B-1. PostBuild処理にてinfo.plistへ追記
先ほど述べた
(3) Privacy - Tacking Usage Description(NSUserTrackingUsageDescription)を設定
(4) AppTrackingTransparency.frameworkを参照するように設定(iOSプラグインにて必要)

について、対応する。

(3)についてここを、(4)についてはここを参考にした。

PostBuild処理については、C#ファイルをAssets > Editorディレクトリ配下に置く必要がある。ファイル名は参考ページのまま「PostBuildProcessForIosAtt」にした。

20210121_03_1.png

PostBuildProcessForIosAtt.cs
#if UNITY_IOS
using System.IO;
using UnityEditor.iOS.Xcode;
using UnityEditor;
using UnityEditor.Callbacks;

namespace iOS.Editor
{
public class PostBuildProcessForIosAtt
{
private const string ATT_FRAMEWORK = "AppTrackingTransparency.framework";

[PostProcessBuild]
public static void OnPostProcessBuild(BuildTarget buildTarget, string buildPath)
{
if (buildTarget != BuildTarget.iOS)
{
return;
}
// pbxに AppTrackingTransparency.framework を追加する
var pbxPath = PBXProject.GetPBXProjectPath(buildPath);
var pbx = new PBXProject();
pbx.ReadFromFile(pbxPath);
string target = GetUnityMainTargetGuidWithCompatible(pbx);
pbx.AddFrameworkToProject(target, ATT_FRAMEWORK, true);
pbx.WriteToFile(pbxPath);

// Info.plist に Privacy - Tacking Usage Description(NSUserTrackingUsageDescription)を追加する
var path = buildPath + "/Info.plist";
var plist = new PlistDocument();
plist.ReadFromFile(path);
var root = plist.root;
root.SetString( "NSUserTrackingUsageDescription", "好みに合わせた広告を表示するために使用されます。");
plist.WriteToFile(path);
}

private static string GetUnityMainTargetGuidWithCompatible(PBXProject pbx)
{
#if UNITY_2019_3_OR_NEWER
return pbx.GetUnityFrameworkTargetGuid();
#else
return pbx.TargetGuidByName(PBXProject.GetUnityTargetName());
#endif
}
}
}
#endif

UnityでビルドしてできたXcodeプロジェクトの中身を確認してみると、info.plistにちゃんと反映されていることが確認できた。

20210121_03_1_2.png

AppTrackingTransparency.frameworkについては、見つけられませんでした。。。


B-2. 独自のiOS用プラグインを用意
UnityからObjective-Cを使う必要があるので、プラグインを作成する。
「MyObjC.mm」というテキストファイルを外部エディタ等を使って用意し、Assets > Plugins > iOS に保存する。
※最近だとこの階層にプラグインファイルを置かなくても読み込まれるそうだけど、慣習にならって…。

20210121_03_2.png

プラグイン(MyObjC.mm)の中身は、参考ページのままで、コメントを加えた程度。

MyObjC.mm
#import <string.h>
// #import <apptrackingtransparency attrackingmanager="" h=""> <- Xcodeでビルドエラーになった
#import <AppTrackingTransparency/ATTrackingManager.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
* ATT承認状態を取得(同期)
**/
int Sge_Att_getTrackingAuthorizationStatus()
{
if (@available(iOS 14, *)) {
// enum値はそのままではC#に渡せないためにネイティブ側でintに変換
// ATTrackingManagerAuthorizationStatusNotDetermined = 0
// ATTrackingManagerAuthorizationStatusRestricted = 1
// ATTrackingManagerAuthorizationStatusDenied = 2
// ATTrackingManagerAuthorizationStatusAuthorized = 3
return (int)ATTrackingManager.trackingAuthorizationStatus;
} else {
return -1;
}
}

/**
* ATT承認を要求(非同期)
**/
typedef void (*Callback)(int status);
void Sge_Att_requestTrackingAuthorization(Callback callback)
{
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if (callback != nil) {
if (status == ATTrackingManagerAuthorizationStatusNotDetermined) {
NSLog(@"ATT status = NotDetermined(未設定) -> 端末設定でOK、アプリで未選択");
} else if (status == ATTrackingManagerAuthorizationStatusRestricted) {
NSLog(@"ATT status = Restricted(制限あり)");
} else if (status == ATTrackingManagerAuthorizationStatusDenied) {
NSLog(@"ATT status = Denied(不許可) -> 端末設定orアプリで不許可");
} else if (status == ATTrackingManagerAuthorizationStatusAuthorized) {
NSLog(@"ATT status = Authorized(許可)");
} else {
NSLog(@"ATT status = Other(その他)");
}
callback((int)status);
}
}];
} else {
NSLog(@"ATT status = iOS14 未満(非対応)");
callback(-1);
}
}
#ifdef __cplusplus
}
#endif

C#側からObjective-Cにアクセスするためのクラスを用意。こちらの中身も、参考ページのままで、コメントを加えた程度。
ファイルの保存場所は、Assets > Scripts。

20210121_03_2_2.png

ObjC.cs
using System;                           // for Action
using System.Runtime.InteropServices; // for DllImport
using System.Threading; // for SynchronizationContext
using UnityEngine; // for Application

public class ObjC
{
#if UNITY_IOS
private const string DLL_NAME = "__Internal";

/**
* ATT承認状態を取得(同期)
**/
[DllImport(DLL_NAME)]
private static extern int Sge_Att_getTrackingAuthorizationStatus();
public static int GetTrackingAuthorizationStatus()
{
if (Application.isEditor) {
return -1;
}
return Sge_Att_getTrackingAuthorizationStatus();
}


/**
* ATT承認を要求(非同期)
**/
[DllImport(DLL_NAME)]
private static extern void Sge_Att_requestTrackingAuthorization(OnCompleteCallback callback);

private delegate void OnCompleteCallback(int status);
private static SynchronizationContext _context;
private static Action<int> _onComplete;

public static void RequestTrackingAuthorization(Action<int> onComplete)
{
if (Application.isEditor) {
// 呼出元のActionの引数を0にして実行する
onComplete?.Invoke(0);
return;
}
_context = SynchronizationContext.Current;
_onComplete = onComplete;
Sge_Att_requestTrackingAuthorization(OnRequestComplete);
}

[AOT.MonoPInvokeCallback(typeof(OnCompleteCallback))]
private static void OnRequestComplete(int status)
{
if (_onComplete != null) {
_context.Post(_ => {
// if (_onComplete!=null) { _onComplete(status); } を省略した書き方
_onComplete?.Invoke(status);
_onComplete = null;
}, null);
}
}
#endif
}

ここまできて、やっとATT対応の準備が整った。


B-3. 独自プラグインを使った実装
Aで作成したMySample.csに、ATT対応を追記する。
流れとしては、
(1) ATTの設定状態を見る
(2) ATTの設定状態によって、ATT承認要求するか、ATT承認なしのまま広告表示するかに別れる

MySample.cs
using System;
using UnityEngine;
using GoogleMobileAds.Api;
using GoogleMobileAds.Common; // for MobileAdsEventExecutor

public class MySample : MonoBehaviour
{
private BannerView bannerView;
void Start()
{
int status = ObjC.GetTrackingAuthorizationStatus();
Debug.Log("ATT状態 = " + status);
// ATT状態は4択
// ATTrackingManagerAuthorizationStatusNotDetermined = 0
// ATTrackingManagerAuthorizationStatusRestricted = 1
// ATTrackingManagerAuthorizationStatusDenied = 2
// ATTrackingManagerAuthorizationStatusAuthorized = 3
if (status == 0) {
// ATT設定可能 & 未承認なのでATT承認要求アラートを表示
ObjC.RequestTrackingAuthorization(CallbackFunction);
} else {
if (status == 1 || status == 2) {
// ATT設定不可なので、ATT承認が必要になる旨をユーザーに伝える
}
// Google Mobile Ads SDK を初期化
MobileAds.Initialize(initStatus => {
// AdMobからのコールバックはメインスレッドで呼び出される保証がないため、次のUpdate()で呼ばれるようにMobileAdsEventExecutorを使用
MobileAdsEventExecutor.ExecuteInUpdate(() => {
// バナーをリクエスト
this.RequestBanner();
});
});
}
}

void CallbackFunction(int status)
{
Debug.Log("ATT最新状況 --> " + status);
// ATTの状況を待ってから Google Mobile Ads SDK を初期化
MobileAds.Initialize(initStatus => {
// AdMobからのコールバックはメインスレッドで呼び出される保証がないため、次のUpdate()で呼ばれるようにMobileAdsEventExecutorを使用
MobileAdsEventExecutor.ExecuteInUpdate(() => {
// バナーをリクエスト
this.RequestBanner();
});
});
}

private void RequestBanner()
{
#if UNITY_ANDROID
string adUnitId = "ca-app-pub-3940256099942544/6300978111";
#elif UNITY_IPHONE
string adUnitId = "ca-app-pub-3940256099942544/2934735716";
#else
string adUnitId = "unexpected_platform";
#endif
// 画面上に320x50のバナーを用意
this.bannerView = new BannerView(adUnitId, AdSize.Banner, AdPosition.Top);
// 広告をリクエスト
AdRequest request = new AdRequest.Builder().Build();
// バナーを読み込む
this.bannerView.LoadAd(request);
}
}



C実機テスト
実機にて実行してみる。
初めて実行すると通知の許可を求められるので、ここは「許可」を選ぶ。

20210121_03_3_1.png

次に、Privacy - Tacking Usage Descriptionで設定した文言が入ったATT承認要求アラート が表示される。

20210121_03_3_2.png

「Appにトラッキングしないように要求」を選択した場合のログ。
ATT状態 = 0
ATT status = Denied(不許可) -> 端末設定orアプリで不許可
ATT最新状況 --> 2

「許可」を選択した場合のログ。
ATT状態 = 0
ATT status = Authorized(許可)
ATT最新状況 --> 3

ATT承認要求アラートが表示されない場合、
端末設定のプライバシー > トラッキング
にて、トラッキング要求が不許可になっているので、こちらで「許可」をしておく必要がある。

20210121_03_3_3.png

最後に、端末設定のトラッキング要求が不許可になっている場合のログ。
端末の画面ではATT承認要求アラート が表示されず、バナーが表示された画面に移る。
ATT状態 = 2
ATT status = Denied(不許可) -> 端末設定orアプリで不許可
ATT最新状況 --> 2

以上で、ATT対応して広告を表示するまでの一連の流れでした。
振り返ってみると長かったー。

あとはアップルの審査に通るかどうか。
結果は後日にてっ!
posted by be-style at 01:19| Comment(2) | Unity

2020年11月12日

[Unity] VFX(Visual Effect Graph)を勉強する 〜削除やコピー等の基本操作〜

VFX Graphの基本的な操作(削除、コピー、複製、ノード作成、メモなど)についてまとめてみた。
たくさんあるので、自分が使うであろう機能だけに絞った。

詳しい説明はUnityブログの記事をどうぞ。



コンテキスト、ブロック、ノード


VFXエディタを使うときに必ず出てくるこの単語について調べてみた。

・コンテキスト = 「Spawn、Initialize Particle、Update Particle、…」といった、VFXを作る上での大きな要素。
・ブロック = コンテキストの中身を構成する要素。コンテキストは複数のブロックを持つ事が可能。
・ノード = ブロックの入力になる。色々組み合わせることで複雑な事ができる。

20201111_0.png



画面全体を動かす


マウスの中ホイールがあれば、何もないところでホイールを押しながらドラッグする。
※optionキーを押しながらドラッグしても同じことができる
※キー操作の名前はMacを前提にしています



拡大・縮小表示


マウスの中ホイールがあれば、ホイールを回す。



選択


Spawnコンテキストがあるので、

20201111_1.png

マウスを使ってSpawnコンテキストの枠を選択してみる。

20201111_2.png

この状態でコンテキストをドラッグ&ドロップすることでエディタ内で好きな位置に動かすことができる。



削除


コンテキストが選択された状態で右クリックをして、Deleteを選ぶと削除できる。
キー操作(Command + Del)でも削除できる。※ブロック、ノードについても同じ

20201111_3.png

コンテキスト・ブロック・ノードをつなぐ線についても、同様の操作で削除できる。

20201111_4.png



ブロックを無効にする


ブロックを一時的に無効にしたいときは、ブロック右側にあるチェックボックスを

20201111_5.png

オフにする。

20201111_6.png



コンテキストを追加する


コンテキストのインプット/アウトプットのところからドラッグする。

20201111_7.png

ドラッグ後、対応するコンテキストに絞られた検索窓が表示される。
※ドラッグせず、空欄で右クリックからも検索して追加できるけど、選択肢は絞られていない状況になる

20201111_8.png



ブロックを追加する


コンテキストの中で右クリック > Create Block を選ぶ。
または、コンテキスト内にカーソルを持ってきてからスペースキーを押す。

20201111_9.png



ノードを追加する


エディタ内の空欄で右クリック > Create Node を選ぶ。

20201111_10.png

検索窓で追加したいノードを探す。

20201111_11.png

見つけたらノードの名前をクリックすると、ノードが追加される。

20201111_12.png



ノードを接続する


ノードのインプット/アウトプットをマウスドラッグで接続することができる。
※コンテキストどうし、ノードからブロックへの接続も同じ操作

20201111_13.png



コンテキストの名前を変更する


コンテキストの名前(コンテキスト内の上部)をダブルクリックすると

20201111_22.png

名前を変更できる。

20201111_23.png



メモ帳を作る


空欄で右クリック > Create Sticky Note を選ぶ。

20201111_14.png

メモ帳が作成されるので、タイトルと本文を書くことができる。

20201111_15.png

メモ帳の上で右クリックをすると、テーマ(色)や文字サイズを変えることができる。



ノードのグループ化


複数のノードをドラッグで囲って選択。
※SHIFTを押しながら連続で選択するのもOK

20201111_16.png

右クリック > Group Selection を選択すると、グループ化できる。

20201111_17.png

グループ名もつけることができる。

20201111_18.png



グループにノードを追加する


新しくノードを作り、グループ内にドラッグする。

20201111_19.png

グループにノードが追加される。

20201111_20.png



グループからノードを抜く


グループ内から抜きたいノードを選択し、SHIFTを押しながらドラッグする。
※グループの枠だけを削除したい場合は、グループ名を選択して右クリック > Delete。または、Command + Del。
※グループ全体(中身のノードを含めて)削除したい場合は、グループ全体をドラッグで囲ってから右クリック > Delete。または、Command + Del。



グループの位置を変える


グループ名を選択すると、枠が強調表示される。

20201111_21.png

この状態でグループ名をドラッグすると、位置を変えることができる。



ショートカットキー


・Command + Del = 削除
・Command + C = コピー
・Command + D = 複製
・Command + K = カット
・Command + V = ペースト
・A = グラフ全体を表示
・コンテキスト・ブロック・ノードを選択した状態で F = 中央に表示する
・[ or ] = コンテキスト・ブロック・ノード等の選択を切り替える

posted by be-style at 23:00| Comment(0) | Unity

2020年11月09日

[Unity] VFX(Visual Effect Graph)を勉強する 〜Unity2020での導入〜

Unityで格好良いエフェクトを作れるというVFX Graph(Visual Effect Graph)を、VFX Graphの知識ゼロの状態から勉強していく過程を残していきます。



既存のパーティクルとの違いは?


エフェクトと言えば既にパーティクルがあるのですが、違いを調べてみると大きな違いはこんな感じ。

・パーティクル = CPUで実現(モバイルでたくさん描けないけど、どの機種でも表現できる)
・VFX Graph = GPUで実現(モバイルでたくさん描けるけど、機種によって対応していない)
※ググれば詳しい情報がヒットします
※スマホアプリで使うことを前提にしています



なぜVFX Graphか?


対応機種が増えてくるだろうし、これから多用されそうな気がするから。



導入してみる


@Unityをインストール
どうせなら現時点で新しいUnityを使おうということで、Unity2020をインストール。
スクショは「2020.1.12f1」ですが、実際に使っているのは「2020.1.9」。

20201108_1.png

Aプロジェクトを新規作成
将来的には、VFXを愚痴フリーで使いたいので、プロジェクトを新規作成するときは「2D」を選択。

20201108_2.png

BVisual Effect Graphをインストール
Window > Package Manager から、Visual Effect Graph を選んでインストール。
画面右に「Samples」とあるけど、VFXのサンプルをインポートすることが出来た(今回は無視)。

20201108_3.png

C早速VFX Graphを作ってみる
Projectウィンドウで右クリック > Create > Visual Effects > Visual Effect Graph を選択。

20201108_4.png

すると、「New VFX」というオブジェクトができます。

20201108_5.png

「New VFX」オブジェクトをHierarchyウィンドウにドラッグ&ドロップします。

20201108_6.png

すると、SceneウィンドウにVFXが表示されました。

20201108_7.png

DVFX Graphを確認する
Hierarchyウィンドウで「New VFX」を選択すると、Inspectorウィンドウに詳しい情報が表示されます。
その中の「Visual Effect > Edit」ボタンを押します。

20201108_8.png

すると、VFX Graphの中身が確認できるウィンドウが出現します。

20201108_9.png

基本的な使い方は、こちらの動画で紹介されています。




基本の4要素


VFX Graphで重要なのは、軸となる4要素です。
スクショでは上から順に

・Spawn = いくつパーティクルを生み出す
・Initialize Particle = どういう風にパーティクルを生み出す
・Update Particle = パーティクルを動かす
・Output Particle XXXX ※XXXX が何種類かある = パーティクルの見た目

となっています。
次回からは、このVFX Graphの使い方についてもう少し掘り下げていってみます。
posted by be-style at 22:09| Comment(0) | Unity