OnPlayerTriggerEnter時にVRCStringDownloaderが失敗するのを改修する話
はじめに
VRChat内からIFTTTのWebhookにリクエストをして、来場者カウントを取る方法を案内した記事を先日執筆させて頂きました。
こちら、実はメタフェス中に使ったコードと、その後に記事で案内したコードが一部異なっています。というのも、記事を書く時にVRChatのSDKをバージョンアップしたらOnPlayerTriggerEnter
でVRCStringDownloader.LoadUrl
が動かなくなってしまったので、その改修が必要になりました。この記事ではその変更点について案内します。
やりたいこと
プレイヤーがBox Colliderと接触したら、UdonのString Loadingで特定のURLにHTTPリクエストを投げる。
動かなくなったコード
プレイヤーがコライダーに接触した時に、VRCStringDownloader.LoadUrl
を使うことによって特定のURL(IFTTTのWebhookなど)にリクエストを投げるようにUdonSharpプログラムを書きました。
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using VRC.SDK3.StringLoading;
public class VisitorCounter : UdonSharpBehaviour
{
[SerializeField] private VRCUrl RequestURL;
public override void OnPlayerTriggerEnter(VRCPlayerApi player)
{
VRCStringDownloader.LoadUrl(RequestURL, this.GetComponent<UdonBehaviour>());
Debug.Log("Entered area");
}
}
VRChat SDK v3.3.0までは正常に動いていたのですが、v3.4.0から下記のようにエラーが発生してしまいました。
エラー内容はDestroying GameObjects immediately is not permitted during physics trigger/contact, animation event callbacks, rendering callbacks or OnValidate. You must use Destroy instead.
。色々と検証してみたところ、this.GetComponent<UdonBehaviour>()
の処理で変なタイミングでDestroyが走っており、それが原因でプログラムが止まっていたようです。
コードの改修
using VRC.Udon.Common.Interfaces;
を宣言し、this.GetComponent<UdonBehaviour>()
の代わりに(IUdonEventReceiver)this
を挿入したらなおりました。
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using VRC.SDK3.StringLoading;
using VRC.Udon.Common.Interfaces;
public class VisitorCounter : UdonSharpBehaviour
{
[SerializeField] private VRCUrl RequestURL;
public override void OnPlayerTriggerEnter(VRCPlayerApi player)
{
VRCStringDownloader.LoadUrl(RequestURL, (IUdonEventReceiver)this);
Debug.Log("Entered area");
}
}
(IUdonEventReceiver)this
を挿入することについては公式ドキュメントにもちゃんと記載されているのですが、何故かみおとしてましたね・・・🤡
実行のテストをしてみたらエラーが発生しなくなり、正常に動作が完了しました。
最後に
これで無事、プレイヤーのコライダー接触時にHTTPリクエストが投げられますね。VRChatからのHTTPリクエストの実用的な方法を下記の記事にまとめたので、ご興味ある方は是非ご一読ください。
Discussion