VRゲームの作成の続きです。(VR関係のコンテンツが多くなったらページを整理しようと思います)
ここでは Beat Saber のように、ビームサーベルを持ち、それを自由自在に動かせるようにしてみたいと思います。
- テンプレート「Baseplate」から新規作成します。
- StarterPlayer の StarterPlayerScripts に LocalScriptを追加します。
- 名前を VRhand とし、以下のプログラムを入力します。
local VRService = game:GetService("VRService")
local StarterGui = game:GetService("StarterGui")
StarterGui:SetCore("VREnableControllerModels", false) -- コントローラーの非表示
StarterGui:SetCore("VRLaserPointerMode", 0) -- ビームの非表示
コントローラーの表示と非表示
- 非表示・・・StarterGui:SetCore(“VREnableControllerModels”, false)
- 表示・・・・StarterGui:SetCore(“VREnableControllerModels”, true)
ビームの表示と非表示
- 非表示・・・StarterGui:SetCore(“VRLaserPointerMode”, 0)
- 表示・・・・StarterGui:SetCore(“VRLaserPointerMode”, “Pointer”)
ビームサーベルの表示
まずは、1つのパーツでビームサーベルっぽいものを作成してみます。左右同じものを使いますので関数にしました。
local function createSaber()
local part = Instance.new("Part",workspace)
part.Shape = Enum.PartType.Cylinder
part.Size = Vector3.new(3,0.2,0.2)
part.BrickColor = BrickColor.new("New Yeller")
part.Material = Enum.Material.Neon
part.CanCollide = false -- これを行わないとおかしな動きになる
return part
end
local rightHand = createSaber() -- 右手用のサーベル
local leftHand = createSaber() -- 左手用のサーベル
コントローラーの動きに同期
コントローラーが移動されたときに発生するイベントは、VRService.UserCFrameChanged です。
local handCorrection = CFrame.Angles(0, math.rad(90), math.rad(90)) + Vector3.new(0,1.2,0) -- 向きと位置を調整する
local function track(Type, Value)
if Type == Enum.UserCFrame.LeftHand then
local handOffset = VRService:GetUserCFrame(Enum.UserCFrame.LeftHand)
handOffset = handOffset.Rotation + handOffset.Position * workspace.CurrentCamera.HeadScale
leftHand.CFrame = (workspace.CurrentCamera.CFrame * handOffset) * handCorrection
end
if Type == Enum.UserCFrame.RightHand then
local handOffset = VRService:GetUserCFrame(Enum.UserCFrame.RightHand)
handOffset = handOffset.Rotation + handOffset.Position * workspace.CurrentCamera.HeadScale
rightHand.CFrame = (workspace.CurrentCamera.CFrame * handOffset) * handCorrection
end
end
VRService.UserCFrameChanged:Connect(track)
handCorrection 変数は、サーベルの角度と位置の調整に使います。以下のように変更して実行してみてください。サーベルの角度と位置が変な感じになると思います。その後に適切な数値を見つけて調整してください。
local handCorrection = CFrame.Angles(0,0,0) + Vector3.new(0,0,0)
パーツとの接触
サーベルが自由自在に動かせるようになったところで次のステップに移ります。
複数のパーツを空中に設置しておき、ビームが触れたらパーツを消すというものを作成してみたいと思います。
- Workspace に TouchParts という名前のフォルダを作成します。
- このフォルダ内にパーツを作成し、空中に移動させ Anchored をオンにします。
- このパーツをいくつか作成しておきましょう。
- 以下のプログラムを追加します。
local function onTouch(hit)
if hit.Parent.Name == "TouchParts" then
hit:Destroy()
end
end
rightHand.Touched:Connect(onTouch)
leftHand.Touched:Connect(onTouch)
このプログラムはローカルで処理していますので、マルチプレイで他のプレーヤーがいた場合、あなたが消したパーツはなくなっていません。もし他のプレイヤーと同期されたい場合は、サーバー側でパーツを消去する必要があります。この方法は、VRゲームの作成で解説していますのでそちらをご覧ください。
これらの基本が分かれば、Beat Saber のように前方からパーツが迫ってきて、それをサーベルで消すというようなゲームが作れるような気がします。
ステップアップ
次は飛び道具です。弾を発射してみたいと思います。