コントローラーから弾を発射するというプログラムを作成してみます。弾が当たったパーツは消去するという単純なものです。
準備
- Workspace に Folder を追加します。
- 名前を TouchParts に変更します。
- このフォルダの中に、Part を複数個作成します。
- Part は空中に浮かせ、AnchoredをONにしてもいいでしょう。(この辺りは自由です)
RemoteEvent の追加
弾はサーバー側で表示移動したいので、クライアントからサーバーのプログラムを実行する RemoteEvent を使います。
- ReplicatedStorage に RemoteEvent を追加します。
- 名前を ShootEvent に変更します。
サーバー側のプログラム
クライアントから RemoteEvent で呼ばれるイベントです。球体のパーツ(弾)を作成し、LinearVelocity を使って移動させます。
- ServerScriptService に Script を追加します。
- 名前を EventScript に変更します。
- 以下のプログラムを入力します。
local Debris = game:GetService("Debris")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local shootEvent = ReplicatedStorage.ShootEvent
shootEvent.OnServerEvent:Connect(function(player,cframe,velocity)
    local part = Instance.new("Part",workspace)
    part.Material = Enum.Material.Neon
    part.Shape = Enum.PartType.Ball
    part.CFrame = cframe
    part.Size = Vector3.new(1,1,1)
    part.BrickColor = BrickColor.new("White")
    part.Material = Enum.Material.Neon
    part.CanCollide = false
    local attachment = Instance.new("Attachment", part)
    local linearVelocity = Instance.new("LinearVelocity", attachment)
    linearVelocity.Attachment0 = attachment
    linearVelocity.VectorVelocity = velocity
    linearVelocity.MaxForce = math.huge
    part.Touched:Connect(function(hit)
        if hit.Parent.Name == "TouchParts" then
            hit:Destroy()    -- 当たったパーツを消す
            part:Destroy()   -- 弾を消す
        end
    end)
    Debris:AddItem(part,2)
end)
クライアント側のプログラム
- StarterPlayer の StarterPlayerScripts に LocalScript を追加します。
- 名前を VRgun とします。
- 以下のプログラムを入力します。
local VRService = game:GetService("VRService")
local HapticService = game:GetService("HapticService")
local UserInputService = game:GetService("UserInputService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local mouse = Players.LocalPlayer:GetMouse()
local rightHand
local function onInputBegan(input, processed)
    if input.KeyCode == Enum.KeyCode.ButtonR2 then
        local position = mouse.Hit.Position
        local velocity = (position - rightHand.Position).Unit * 300
        local handOffset = rightHand.Rotation + rightHand.Position * workspace.CurrentCamera.HeadScale
        local cframe = workspace.CurrentCamera.CFrame * handOffset
        ReplicatedStorage.ShootEvent:FireServer(cframe,velocity)  -- RemoteEvent の実行
    end
end
local function track(Type, Value)
    if Type == Enum.UserCFrame.RightHand then
        rightHand = VRService:GetUserCFrame(Enum.UserCFrame.RightHand)
    end
end
UserInputService.InputBegan:Connect(onInputBegan)
VRService.UserCFrameChanged:Connect(track)2 thoughts on “VRゲームの作成(3)”
コメントを残す
コメントを投稿するにはログインしてください。

こんにちは
いつも おせわになっています.
準備の次のセクションのタイトル
現:RemoveEvent の追加 → RemoteEvent ではないでしょうか?
また,サーバー側のプログラム 3行目
local changePartEvent = ReplicatedStorage.ChangePartEvent
↑
これは必要でしょうか?
ご指摘ありがとうございます。
おっしゃる通りでございます。早速修正させていただきました。