Closed6

【VRChat】DroneAPIを使って遊んでみた(サンプルコード付き)

kesera2kesera2

このスクラップについて

VRCSDKでDroneAPIが生えてきたのでちょっと遊んでみようという試みです。
目的としては、サンプルコードの情報が現時点でほとんどなかったので、誰かの役に立てば嬉しいという感じです。

公式ドキュメント

https://creators.vrchat.com/worlds/udon/players/drones/

Getting Drones

https://creators.vrchat.com/worlds/udon/players/drones/getting-drones

Drone Information

https://creators.vrchat.com/worlds/udon/players/drones/drone-information

kesera2kesera2

DroneAPIのデバッグ方法について

VRCSDKのワールド用のClientSimではドローンを出せない?(要検証)
Unity上でデバッグできないので、テストはBuild&TestでVRChatのアプリを起動しないといけない。
Cannyをまだちゃんと調べてないですが、たしかDroneをUnity上でデバッグできるようにしてほしいCannyがどっかにあったはず...(ないかもしれない。情報求ム

Debug Windowの出し方

Right Shift + Tilde (~) + 3で出せます。

https://creators.vrchat.com/worlds/udon/world-debug-views/

kesera2kesera2

ドローンのポジションを毎フレームログに出力する

やりたいこと

  • ローカルプレイヤーのドローンオブジェクトを取得する
  • ローカルプレイヤーがドローンを出しているかを判別する
  • ローカルプレイヤーが出しているドローンの位置を毎フレーム出力する

コード

シンプルなサンプルコードです。

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;

public class DisplayDronePosition : UdonSharpBehaviour
{
    private VRCDroneApi drone;

    private void Update()
    {
        var localPlayer = Networking.LocalPlayer;
        if (localPlayer != null)
        {
            drone = localPlayer.GetDrone();
            if (drone != null && drone.IsDeployed())
            {
                var dronePosition = drone.GetPosition();
                Debug.Log($"ドローンの位置: {dronePosition}");
            }
            else
            {
                Debug.Log("ドローンが展開されていません。");
            }
        }
    }
}

結果

わかったこと

  • DroneAPIはVRCPlayerAPIが持っていて、GetDrone()でドローンオブジェクトを取得できる
  • drone.IsDeployed()でプレイヤーがドローンを出しているかを判別することができる
  • drone.GetPosition()でドローンのPositionを取得することができる
kesera2kesera2

ドローンのユーザー名、位置、回転、速さを毎フレームログに出力する

やりたいこと

  • Positionに加えて、プレイヤー、Rotattion、Velocityをログに出力する

コード

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;

public class DisplayDroneInformations : UdonSharpBehaviour
{
    private VRCDroneApi drone;

    private void Update()
    {
        var localPlayer = Networking.LocalPlayer;
        if (localPlayer != null)
        {
            drone = localPlayer.GetDrone();
            if (drone != null && drone.IsDeployed())
            {
                var dronePlayer = drone.GetPlayer();
                var dronePosition = drone.GetPosition();
                var droneRotation = drone.GetRotation();
                var droneVelocity = drone.GetVelocity();
                Debug.Log(
                    $"プレイヤー名: {dronePlayer.displayName},ドローンの位置: {dronePosition}, ドローンの回転: {droneRotation}, ドローンの速度: {droneVelocity}");
            }
            else
            {
                Debug.Log("ドローンが展開されていません。");
            }
        }
    }
}

結果

わかったこと

  • Networking.LocalPlayerとNetworking.LocalPlayer.GetDrone().GetPlayer()が等価である(当たり前ですが)
  • Velocityはドローンを動かさない限り(0.00,0.00,0.00)となる
kesera2kesera2

ドローンを任意の場所にテレポートさせる

やりたいこと

  • drone.TeleportTo()を使って、ワールドに配置したCubeに当たった場合にドローンをワールド原点に移動させる

サンプルシーン

ワールドにCubeを追加し任意のPositionに移動し、Box ColliderコンポーネントのIsTriggerを有効にした状態で作成したスクリプト(MoveDroneToWorldOrigin.cs)を追加してください。もしIsTriggerが無効だと、当たり判定が残ってドローンがCubeにぶつかるだけになります。Build&Testでドローンを起動した後にCubeにぶつかればワールド原点にテレポートします。

using UdonSharp;
using UnityEngine;
using VRC.SDKBase;

public class MoveDroneToWorldOrigin : UdonSharpBehaviour
{
    // This event is invoked when a Drone enters a trigger.
    public override void OnDroneTriggerEnter(VRCDroneApi drone)
    {
        var worldOrigin = new Vector3(0, 0, 0);
        var droneRotation = new Quaternion(0, 0, 0, 1);
        drone.TeleportTo(worldOrigin, droneRotation);
        Debug.Log($"ドローンの位置をワールド原点に移動しました: {worldOrigin}");
    }
}

わかったこと

  • ドローン操作中はローカルプレイヤーはInteract操作できないため、基本的にアクションを起こしたい場合は、ドローン自体を当たり判定にぶつけて何かをするようにする。ドローン操作中に、Cubeのトリガーをインタラクトはできない。
kesera2kesera2

まとめ

DroneAPIを使ってドローンの情報を取得したりテレポートさせる方法をご紹介しました。いろいろなアイデアと組み合わせて面白いものが作れるといいですね!
最後まで読んでいただきありがとうございました。

最後に、zennではUdonSharpなどの記事を、noteではアバター改変に関する記事も出しています!よかったら覗いてみてください~!
https://note.com/kesera2_vrc

このスクラップは5ヶ月前にクローズされました