//ここからGoogleタグのコード //以上でGoogleタグのコード終了

Udon#を勉強する会(第9回)掴んだり放したりするギミックを作る

 

この記事はUdon#を勉強する会のシリーズの続きです
CubeにC#をセットすることなどは一部操作はすでに終わっている状態ですのでご注意ください

 

 

参考動画

丁寧に教えてくれるとても良い動画です

 

本題 掴んだり放したりするギミックを作る

VRChatでの基本ギミックでる物を掴む、放すギミックを作ります

 

プログラムではon pickup関数(掴む関数)、on drop関数(手放す関数)でできます

 

やること

Unityでギミックを入れたいゲームオブジェクトをhierarchyで選択、
inspectorでadd componentを押してVRC Pickupを選ぶ

するとRigidBodyコンポーネントとVRC Pickupコンポーネントの2つが追加される
※2つセットで必要なので正常な処理です

※最初から付いているBox Colliderコンポーネントが消えていないか確認
無い場合はadd Componentから追加

掴む、放すギミック自体はこれで完成です

VRC PickupのAuto Holdについて
Auto Detect クリックしている間は掴んでいる、クリックを放すとオブジェクトも話す動作(初期設定)
Yes クリック1回で掴みつづけ、次のクリックで放す

C#で掴んだ時と放した時に走るプログラムを書く

public override void OnPickup()
{
base.OnPickup();
}
掴んだ時に走るプログラム、base.Onpickup();は消す

 

public override void OnDrop()
{
base.OnDrop();
}

放した時に走るプログラム、base.onDrop();は消す

それぞれ掴んだ時、放した時に1回処理が走る

例文 初期マテリアルA→掴んだ時にマテリアルBに変更→放した時にマテリアルAにする

※このコードはGoogleのAI Geminiに書いてもらったコードです
Unity上で動作したのを確認しました 2025/04/18
Class関数の下に書いてください

 

    [SerializeField]
    private Renderer targetRenderer; 
    // マテリアルを切り替える対象のRenderer
    
    [SerializeField]
    private Material pickupMaterial; 
    // ピックアップ時に設定するマテリアル
    
    [SerializeField]
    private Material  ReleaseMaterial;
    // ドロップ時に設定するマテリアル

    private VRC_Pickup pickup; 
    // オブジェクトのVRC_Pickupコンポーネントを格納する変数

    void Start()
    {
        // エラーチェック: 必要なコンポーネントが設定されているか確認
        if (targetRenderer == null)
        {
            Debug.LogError("[PickupMaterialSwitch] Target Rendererが設定されていません!");
            enabled = false; // スクリプトを無効化
            return;
        }
        pickup = GetComponent();
        if (pickup == null)
        {
            Debug.LogError("[PickupMaterialSwitch] VRC_Pickupコンポーネントが見つかりません!");
            enabled = false; // スクリプトを無効化
            return;
        }

        
        targetRenderer.material =  ReleaseMaterial;
        // 初期マテリアルをOnDropsした時と同じマテリアル設定
    }

    public override void OnPickup()
    {
        
        targetRenderer.material = pickupMaterial;
        // ピックアップされた時の処理:マテリアルをpickupMaterialに切り替える
    }

    public override void OnDrop()
    {
        
        targetRenderer.material = ReleaseMaterial;
        // ドロップされた時の処理:マテリアルをreleaseMaterialに切り替える
    }

この後やること
Unity上のinspectorのスクリプトコンポーネントで
Target Renderer=マテリアルを変えたいゲームオブジェクトをhierarchyからドラッグ&ドロップで設定する
Pickup Material=掴んだ時に設定するマテリアルをAssetsタブのマテリアルをドラッグ&ドロップで設定する
Release Material=初期設定&放した時に戻すマテリアルをAssetsタブのマテリアルをドラッグ&ドロップで設定する

 

 

今回のメモ

マテリアルの情報はRendererに格納されているので最初にRendererの変数target Rendererを作成している
指定する文も変数(ゲームオブジェクトの変数)、レンダラーのマテリアルを指定、変数(変更するマテリアル)となっている

targetRenderer.material = ReleaseMaterial;

不確定
マテリアルの色はマテリアルの種類によって変数や格納場所が違う?
AIで作成しても動作不良であった

 

次回

第10回UIを作り、発射カウントを表示させるギミック