VRCSDK3でのプレイヤーとのTriggerのとり方


プレイヤーがどこかに入ったかをチェックする方法です

VRCSDK2時代

まず、CollisionのisTriggerがTrueです。
EventTriggerでは、OnEnterTrigger、Layer PlayerLocalにすることで、
プレイヤーがCollisionに入ったときの処理を行えました。

他にもOnAvatarHitというものもありますね。

VRCSDK3になって

普通に考えれば、以下のように書きます

//うまくいかない例
public class MyClass : UdonSharpBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.Layer == 10) //10はPlayerLocal
        {
            // ヒットしたときの処理
        }
    }
}

なぜうまく行かないのか
プレイヤーとヒットした時、otherがnullだからです。
上記ソースでは、gameObjectにアクセスした時点でNullアクセス例外が発生します。

プレイヤーのGameObjectは取らせてくれません
なので、nullらしいです。

おいおい、どうすればいいんだ…と思ったら、一応解決方法が…。

OnlyCollideLocal というレイヤーを定義して、
これがPlayerLocalとしか反応しないようにすればいいとのこと
ソース https://ask.vrchat.com/t/player-collision-in-udon/428

何やらモヤッとしますが、とりあえずはこれで作るしかなさそうです。