VRサイクリングの試作1
Meta QuestとRobloxとフィットネスバイクを組み合わせて、VRサイクリングを試作しました。
VRサイクリングとは、VR空間内でサイクリングすることです。
- Meta Quest:VR/MRゴーグル
- Roblox:3D/VRゲーム作成システム
- フィットネスバイク:自転車型フィットネス器具
試作記事は2回に分けて、今回はRobloxでサイクリングコースを作る話です。
次回は、Meta Questとフィットネスバイクを使って、そのコースをどうやってサイクリングするかの話です。
- 今回:サイクリングコース制作
- 次回:サイクリングコース走行
今回の試作では、VR上での走行速度とフィットネスバイクの回転数(及び負荷)は連動していません。
つまり、フィットネスバイクをゆっくりこいでも、張り切ってこいでも、VRでの周りの景色の変化は同じです。
どちらかというと、VRの景色変化に合わせてフィットネスバイクをこぐといった使い方です。
- VR景色の変化に合わせてフィットネスバイクをこぐ
実際にVRサイクリングすると、この差異は気にならなく、屋外を走行している圧倒的な爽快感を感じることができました。
- VR感がとても強く、差異は気にならない
サイクリングコース
サイクリングコースは、Conveyor(コンベアー)とテレポートで作ります。
Conveyorとは、自走する床のことです。プレイヤーがその床の上に立つと自動で移動してくれます。
テレポートは、瞬時に別の場所に移動できる機能のことです。
コンベアー
コンベアーは、下記記事で詳細に解説されています。
Conveyor
下図の黄色い部分が、Conveyorです。
Conveyorの左右端に緑色のテレポートがあります。
「パーツ」から「ブロック」を選び、名前を「Part」から「Conveyor」に変更します。
Conveyorのサイズとポジションを変更します。
- Size:726, 1, 20
- CFrame
- Position:-293, 578, -143
- Orientation:0, 0, 0
Conveyorに、ScriptとConfigurationを追加します。
Configuration
- Configurationの中に「IntValue」を追加
- 「IntValue」の名前を「Speed」に変更
Script
変数speedの値で、移動速度を調整します。
local conveyor = script.Parent
local speed = conveyor.Configuration.Speed.Value
speed = 5
conveyor.Velocity = conveyor.CFrame:vectorToWorldSpace(Vector3.new(speed, 0, 0))
※ソースをクリックすると、綺麗なソースが表示されます
テレポート
プレイヤーがConveyorに乗ると終点まで移動して終わってしまいます。
そこで、終点から始点までテレポートすることで、何度もConveyorに乗ることができます。
下図の緑色の四角形が、Conveyor終点にあるTeleport1Aです。
プレイヤーがTeleport1Aに触れると、Conveyor始点にあるTeleport1Bにテレポートします
- Teleport1A → Teleport1B
TeleportはConveyorの階層の中にあります。
「パーツ」から「ブロック」を選び、Conveyorの始点と終点に配置します。
名前は「Part」からそれぞれ「Teleport1A」と「Teleport1B」に変更します。
TeleportScript
local Teleport1A = script.Parent.Teleport1A
local Teleport1B = script.Parent.Teleport1B
-- A -> B へテレポート
local function TeleportA2B(part)
local humanoid = part.Parent:FindFirstChild("HumanoidRootPart")
if humanoid then
-- プレイヤーの位置をテレポートブロックBにする
humanoid.CFrame = Teleport1B.CFrame + Vector3.new(-10,0,0)
end
end
-- B -> A へテレポート
local function TeleportB2A(part)
local humanoid = part.Parent:FindFirstChild("HumanoidRootPart")
if humanoid then
-- プレイヤーの位置をテレポートブロックAにする
humanoid.CFrame = Teleport1A.CFrame + Vector3.new(0,0,10)
end
end
Teleport1A.Touched:Connect(TeleportA2B)
Teleport1B.Touched:Connect(TeleportB2A)
※ソースをクリックすると、綺麗なソースが表示されます
Script
テレポートの存在を点滅することで示しています。
while true do
script.Parent.Transparency = 0
wait(1)
script.Parent.Transparency = 0.7
wait(1)
end
※ソースをクリックすると、綺麗なソースが表示されます
参考