プレイヤーが青い領域に侵入すると正面からCubeが飛んできて、プレイヤーに接触するとCubeが停止してコントローラーのバイブレーションが作動するサンプルの解説

Udonスクリプト作成

FireOnTriggerとProjectileをU#に書き直し

Udon Graph

Projectileはデカすぎてスクショに収まらないので画像添付していません。

U#

OnPlayerCollisionEnter・・・接触する
OnPlayerCollisionExit ・・・接触しなくなった

public class FireOnTriggerBySharp : UdonSharpBehaviour
{
    public ProjectileBySharp projectile;

    public override void OnPlayerTriggerEnter(VRCPlayerApi player)
    {
        projectile.Fire();
        Debug.Log($"send OnPlayerTriggerEnter to {projectile}");
    }
}

public class ProjectileBySharp : UdonSharpBehaviour
{
    public Text textField;

    public Rigidbody cubeRigidbody;

    public ConstantForce force;

    private Vector3 _originalPosition;

    void Start()
    {
        _originalPosition = cubeRigidbody.position;
    }

    public void Fire()
    {
        ResetRigid();

        force.enabled = true;
    }

    private void ResetRigid()
    {
        cubeRigidbody.position = _originalPosition;
        cubeRigidbody.rotation = Quaternion.identity;
        cubeRigidbody.angularVelocity = new Vector3(0, 0, 0);
        cubeRigidbody.velocity = new Vector3(0, 0, 0);

        force.enabled = false;
    }

    // 接触状態でなくなった
    public override void OnPlayerCollisionExit(VRCPlayerApi player)
    {
        textField.text = $"{player.displayName} Exited";

        ResetRigid();
    }

    // 接触した
    public override void OnPlayerCollisionEnter(VRCPlayerApi player)
    {
        textField.text = $"{player.displayName} Extered";
     
        // 接触するとコントローラーのバイブレーションを発生させる
        player.PlayHapticEventInHand(VRC_Pickup.PickupHand.Left, 0.25f, 1, 1);
        player.PlayHapticEventInHand(VRC_Pickup.PickupHand.Right, 0.25f, 1, 1);
    }
}

シーン作成

飛んでくるCubeはIsTriggerのチェックマークを外したままにして下さい。これを外すと壁や床の判定でなくなり、プレイヤーがCubeの内部に侵入できてしまいます。

あとは物理演算ができるようにRegidbodyを追加
力を加えて移動させるためにConstant Forceを追加して力量を設定すれば完成です。

壁や床の接触判定を作成する

投稿ナビゲーション


コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)