GetMainLight()でライトが取得できない

ShaderGraphでライトの色を獲得したいときに、Custom Function Nodeを作って以下のようにすると思います。

#ifdef SHADERGRAPH_PREVIEW
Color = 1;
#else
Light light = GetMainLight();
Color = light.color;
#endif

プロジェクトをUnity 2022にアップデートしたタイミングだと思うのですが、なぜかこのGetMainLight()でライトが取得できなくなっていました。

解決方法

URPの設定ファイル内、Lightingの項目にMain Lightという項目があるんですが、これがDisabledになっていました。
これをPerpixelにすることでGetMainLightが効くようになりました。

Unity2022.3.27f1が起動しない

Unity2022.3.27f1へ更新してからプロジェクトを起動しようとするも、UnityHubでグルグルアイコンが回るものの起動しない。
~/Library/Logs/Unity/Editor.logを確認すると

Unable to load nib file Mainmenu, exiting.

というメッセージが。

よくわからないが、Unity2022.3.27f1をアンインストールして、もう一度インストールし直したら起動できた。

AdMobを更新したらdoes not contain bitcodeと言われてXCodeでビルドエラーが出るようになった

だいたい以下のようなエラー文

GoogleAppMeasurement/WithoutAdIdSupport/GoogleAppMeasurement.framework/GoogleAppMeasurement(APMAdExposureReporter.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target.
file XCFrameworkIntermediates/GoogleAppMeasurement/WithoutAdIdSupport/GoogleAppMeasurement.framework/GoogleAppMeasurement' for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ENABLE_BITCODEをNOにしたらエラーを回避できるという記事をよく見かけたけど、うまくいかず...

結論

UnityFrameworkのENABLE_BITCODEもNOにしたらうまくいった。メインターゲットだけENABLE_BITCODEをNOにするだけだとエラー回避できなかった。

Unityのビルドのポストプロセスで処理する。だいたい以下のような感じ。

public static class XcodePostProcessBuild
{
    [PostProcessBuild]
    public static void OnPostProcessBuild(BuildTarget target, string path)
    {
        if (target != BuildTarget.iOS)
        {
            return;
        }

        var project = new PBXProject();
        project.ReadFromFile(PBXProject.GetPBXProjectPath(path));

        project.SetBuildProperty(project.GetUnityMainTargetGuid(), "ENABLE_BITCODE", "NO");
        project.SetBuildProperty(project.GetUnityFrameworkTargetGuid(), "ENABLE_BITCODE", "NO");
        project.WriteToFile(PBXProject.GetPBXProjectPath(path));
        
    }
}

Notion APIでdatabaseを取得しようとするもobject_not_foundでエラーになる

curlを使って取得しようとするも、

{"object":"error","status":404,"code":"object_not_found","message":"Could not find database with ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. Make sure the relevant pages and databases are shared with your integration."}

というエラーになる

どうやらかつてはIntegrationを招待するという手順だったのが、今は右上の ...から"コネクトを追加"をするように変わった模様。

チュートリアルページも古いままだったのでハマった。

UniTaskの非同期関数内で待ちたくない

こういう攻撃用のinterfaceを作って、各実装を作る時、

interface IAttackController {
    UniTask AttackAsync();
}

class NormalAttackController : IAttackController {
    public async UniTask AttackAsync()
    {
        ... //なんか非同期の処理
    }
}

オブジェクトによっては、攻撃したくないからEmptyAttackControllerってなる時がある。
その際に、

class EmptyAttackController : IAttackController {
    public UniTask AttackAsync()
    {
    }
}

っという何もしないメソッドを持つクラスを作ってみた。
しかし、これだと返り値が無いよって怒られる。

public async UniTask AttackAsync()
{
}

っと書くと、今度はawaitしてないよってwarningが出る
こんなwarning↓

warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread.


なので、

public async UniTask AttackAsync()
{
    await UniTask.Yield();
}

としてみたり、

public async UniTask AttackAsync()
{
    await UniTask.Delay(0);
}

としてみたりしたけど、これだと1Frame待ってしまう。

結論

public async UniTask AttackAsync()
{
    await UniTask.CompletedTask;
}

これでいけました!これなら待たないです!