NEWS

電子技術研究部のニュースをご紹介します

Vketをはじめる人へのすすめ ~一から始める人へ~ 【入門編】Part.3

2025/12/09

Vketとは

正式名称はVirtualMarket
株式会社HIKKYさんが主催している世界最大のメタバースイベント。
VRChatだけでなくウェブなどからも参加ができ、メタバース上の会場で各出展団体のブースを見て回ることができる。
イベントは、毎年夏と冬の2回行われる。毎回多数のワールドが用意され、テーマが変わる。テーマに合ったブースを構築しよう。

目次

  • 入稿方法
  • 最後に

入稿方法

シーン作成

VketToolsタブ→「Show Controll Panel」を開く
「入稿用シーン作成」をクリック
自分の参加するものと合ったテンプレートを選択し、「Load」をクリック
※「TMP Importer」ウィンドウが起動した場合は「Import TMP Essentials」をクリックしてインポートする(TMPとは文字に装飾したりアニメーションを適用できるパッケージのこと)
VketToolsウィンドウに戻り、「入稿用シーンを開く」をクリック
下のようなシーンが開けば成功

★チュートリアル「立方体を入稿してみる」

ヒエラルキーウィンドウの「+」→「3DObjects」→「Cube」
Cubeを出展者ID>Staticにドラッグアンドドロップする
※“967”は出展者IDなので異なる

位置、回転、スケールなどを動かす場合は”Dynamic”に、動かさない場合は「Static」に入れる
VketToolsウィンドウの”ブースチェック”をクリックする
エラーが出るので一つずつ直す(直したらエラー画面上部の”Check”をクリックし、エラーが解消されることを確認する)
・エラー:”Staticオブジェクトは特定のStatic設定を行うこと”(Staticに入れた時のみ発生)
ヒエラルキーウィンドウのCubeをクリック

インスペクターウィンドウ上部の”□静的▼”の”▼”をクリック

“OccludeeStatic”にチェックを入れる

・エラー:”ブースサイズは規定の範囲内に収めること”
ヒエラルキーウィンドウのCubeをクリック

矢印を操作して緑枠内に収まるように位置を調整する

エラーが消えたら再度”ブースチェック”をクリック
エラーが出なければ
”容量チェック”をクリック

“SetPassチェック”をクリック(Materialの数などをチェック)

“VRChat動作確認”をクリック(VRChatにログインが必要)

“入稿”をクリック(サークルリーダーのみ可能)

Vketのマイページから入稿履歴が確認できる(数分後に反映)

数日毎に確認用ワールドが更新されるのでそこからも確認ができる

おすすめギミック

公式のテンプレート

VketToolsウィンドウの”VketPrefabs一覧”からいろいろなギミックを追加することができる
※それぞれ個数制限があるので、公式ページの入稿ルールを確認する

中に入ると一面空になる球体

Blenderで面の向きが逆の半球を作る

球の状態で球の赤道部分の辺でシームをマークし、UV展開。球の下側を平らにするとモデルが完成する。その後、UVエディターで右側の円をすべて選択し、2倍に拡大、中心座標(0.5、 0.5)にする。画像の様なUVになっていることを確認する。
(※わかりやすいために、UVエディターにテクスチャを表示させている)
テクスチャを用意する(今回はBlenderで作成した)
(※Blenderのインストール方法や基本操作は「初めてのBlender」を参照)

スカイボックス用のHDRIテクスチャ
半球を.fbxでエクスポートし、Unityのプロジェクトウィンドウにドラッグアンドドロップ
プロジェクトウィンドウにインポートされた半球を入稿用シーンにドラッグアンドドロップ

プロジェクトウィンドウ左上の”+”から”Shader>Unlit Shader”をクリック
名前を“skyboxShader”に変更する。
ダブルクリックでテキストエディターを開く。
中身を以下のように編集する

Shader “Unlit/skyboxShader”

{

    Properties {

        _MainTex (“Panorama Texture”, 2D) = “white” {}

        _1MainTex (“UV Texture”, 2D) = “white” {}

        _MaxDistance (“MaxDistance”, float) = 1.0

    }

    SubShader {

        Tags { “RenderType”=”Opaque” }

        Pass {

            Name “FORWARD”

            Tags { “LightMode”=”ForwardBase” }

            CGPROGRAM

            #pragma vertex vert

            #pragma fragment frag

            #include “UnityCG.cginc”

            #pragma target 3.0

            sampler2D _MainTex;

            float4 _MainTex_ST;

            sampler2D _1MainTex;

            float4 _1MainTex_ST;

            float _MaxDistance;

            float2 MonoPanoProjection(float3 coords) {

                float3 normalizedCoords = normalize(coords);

                float latitude = acos(normalizedCoords.y);

                float longitude = atan2(normalizedCoords.z, normalizedCoords.x);

                float2 sphereCoords = float2(longitude, latitude) * float2(0.5 / UNITY_PI, 1.0 / UNITY_PI);

                sphereCoords = float2(1.0, 1.0) – sphereCoords;

                return sphereCoords;

            }

            struct VertexInput {

                float4 vertex : POSITION;

                float2 uv : TEXCOORD0;

                float3 normal : NORMAL;

            };

            struct VertexOutput {

                float4 pos : SV_POSITION;

                float2 uv : TEXCOORD0;

                float3 worldPos : TEXCOORD1;

                float3 normal : TEXCOORD2;

            };

            VertexOutput vert (VertexInput v) {

                VertexOutput o;

                o.pos = UnityObjectToClipPos(v.vertex);

                o.uv = TRANSFORM_TEX(v.uv, _1MainTex); // UV用テクスチャのUV

                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;

                o.normal = UnityObjectToWorldNormal(v.normal);

                return o;

            }

            fixed4 frag(VertexOutput i) : SV_Target {

                // カメラからのベクトル

                float3 viewDir = normalize(_WorldSpaceCameraPos.xyz – i.worldPos);

                float2 panoUV = MonoPanoProjection(-viewDir); // パノラマのUV

                float4 panoColor = tex2D(_MainTex, panoUV);

                float4 uvColor = tex2D(_1MainTex, i.uv);

                float distance = _MaxDistance-clamp(length(_WorldSpaceCameraPos.xz – i.worldPos.xz),0, _MaxDistance);

                float t = saturate(distance / _MaxDistance);

                t *= i.normal.y;

                t = clamp(t, 0, 1);

                float4 finalColor = lerp(panoColor, uvColor, t);

                return finalColor;

            }

            ENDCG

        }

    }

    FallBack “Diffuse”

    CustomEditor “ShaderForgeMaterialInspector”

}
作成したマテリアルを選択し、インスペクターウィンドウ上の”Shader”を”Unlit>SkyboxShader”にし、任意のテクスチャを設定する

完成したマテリアルをシーン上の半球にドラッグアンドドロップして完成

クリックするとランダムに色が変わるボタン

※Udon#を使うオブジェクトは1ブースあたり10個まで

ボタン用のオブジェクトと色が変わるオブジェクトを配置する(どちらもDynamicに設定)

プロジェクトウィンドウ左上の”+”から”U# Script”をクリック
保存先をAssets\(サークルID)\UdonScriptsに設定し、任意の名前で保存する(今回の例ではColorChanger)
保存先に二つのファイルが生成されるのでアイコンが”#”のみの方(C#スクリプト)をダブルクリックで開く
中身を↓のように編集し、保存する(”public class”のあとの”ColorChanger”は保存した名前にする)

using UdonSharp;

using UnityEngine;

using VRC.SDKBase;

using VRC.Udon;

public class ColorChanger : UdonSharpBehaviour

{

    public MeshRenderer TargetRenderer;

    void Interact()

    {

        float r = Random.value;

        float g = Random.value;

        float b = Random.value;

        TargetRenderer.material.color = new Color(r, g, b, 1);

    }

}
編集したファイルをヒエラルキーウィンドウ上のボタン用のオブジェクトにドラッグアンドドロップする
ボタン用オブジェクトを選択し、インスペクターウィンドウに”ColorChanger”コンポーネントが追加されたことを確認する
“Target Renderer”の右の”なし(メッシュレンダラー)”にヒエラルキーウィンドウから色を変える用のオブジェクトをドラッグアンドドロップする

VketToolsの”VRChat動作確認”でボタン用オブジェクトをクリックすると設定したオブジェクトの色がランダムに変わる

プレイヤー同士でオブジェクトの状態を確認したいとき

アニメーションや色など、全てのプレイヤーが見えている状態を同じにしたいときは”VRC Object Sync”コンポーネントを任意のオブジェクトに追加する
(※1ブースあたり5個まで)
※オブジェクトまたはその子オブジェクトにColliderが含まれる場合は”Allow Collision Ownership Transfer”のチェックを外さなくてはならない
Udon#スクリプトでも変数の宣言前に[UdonSynced]を追加することで共有できる
(※1ブースあたり10個まで)

最後に

今回はVketを始める際に必要な入稿方法について説明していきました!
好評であればグラフィックを上げるコツなどについてをまとめていきたいと思います。

お使いのブラウザはサポートされていません。

詳しく見る