您如何在ROBLOX Studio中制作RTS摄像机/城市建设者摄像机?

时间:2019-01-02 21:05:56

标签: lua camera roblox

因此,我想为ROBLOX牢记一些游戏创意的最低限度VP,其中大多数是RTS / City Building游戏。我已经尝试过多次以正确安装相机,但我做不到。我无法让相机随WASD一起移动。有人可以帮忙吗?

我尝试将相机连接到零件上,并使播放器在地图上方的另一个不可见平台上不可见。他们都没有像《放逐》或《光环战争》(我希望摄影机的工作方式)这样的游戏中的摄影机工作方式一样

1 个答案:

答案 0 :(得分:1)

Heyo!

如果您不熟悉编写照相机脚本,我建议您查看Roblox开发人员中心,以获得一些非常好的教程:https://developer.roblox.com/articles/Camera-manipulation

默认情况下,Roblox提供了一个非常复杂的相机脚本,该脚本会在玩家生成时跟随角色。在Studio中运行游戏时,您可以看到这些脚本,并查看Players > [YourPlayerName] > PlayerScripts > PlayerModule > CameraModule下的解决方案资源管理器。在这里,您将看到Roblox已经为您编写的所有不同类型的摄像机。

但是,如果您想自己进行实验,则可以尝试制作这些脚本的副本,或者通过简单地在StarterPlayer > StarterPlayerScripts中创建名为CameraScript的新LocalScript来制作自己的脚本。

由于您正在制作《星际争霸》或《光晕战争》之类的RTS风格的游戏,因此我建议您制作一个简单的相机悬停在空中,以60度角指向地面,并使用WS键盘沿X轴移动输入,并使用AD键盘输入沿Z轴输入。

这是一个简单的示例,可帮助您入门:

  1. 确保未选中复选框Players.CharacterAutoLoads
  2. StarterPlayerScripts中创建名为CameraScript的LocalScript
  3. 将以下脚本粘贴到CameraScript中。

local cam = game.Workspace.CurrentCamera

-- place the camera high in the air, looking down at the ground
local startingPos = Vector3.new(0, 30, 0)
local downwardLookAngle =  CFrame.Angles(-math.rad(60), 0, 0)
cam.CFrame = CFrame.new(startingPos) * downwardLookAngle

-- create a function that moves the camera around
local moveDir = Vector3.new(0, 0, 0) -- we'll use this vector to control our movement
local moveSpeed = 0.5
spawn(function()
    while true do
        -- animate the camera movement
        local c = game.Workspace.CurrentCamera.CFrame
        game.Workspace.CurrentCamera.CFrame = CFrame.new(c.Position) * CFrame.new(moveDir) * downwardLookAngle
        wait(0.01)
    end
end)

-- create a function to handle keyboard inputs
local function onKeyPress(actionName, userInputState, inputObject)
    -- when a key is pressed, modify our moveDir vector so our camera moves

    -- W key input
    if actionName == "moveCameraForward" then
        if userInputState == Enum.UserInputState.Begin then
            moveDir = Vector3.new(moveDir.X, moveDir.Y, -moveSpeed)
        elseif userInputState == Enum.UserInputState.End then
            moveDir = Vector3.new(moveDir.X, moveDir.Y, 0)
        end

    -- A key input
    elseif actionName == "moveCameraLeft" then
        if userInputState == Enum.UserInputState.Begin then
            moveDir = Vector3.new(-moveSpeed, moveDir.Y, moveDir.Z)
        elseif userInputState == Enum.UserInputState.End then
            moveDir = Vector3.new(0, moveDir.Y, moveDir.Z)
        end

    -- S key input
    elseif actionName == "moveCameraBackward" then
        if userInputState == Enum.UserInputState.Begin then
            moveDir = Vector3.new(moveDir.X, moveDir.Y, moveSpeed)
        elseif userInputState == Enum.UserInputState.End then
            moveDir = Vector3.new(moveDir.X, moveDir.Y, 0)
        end

    -- D key input
    elseif actionName == "moveCameraRight" then
        if userInputState == Enum.UserInputState.Begin then
            moveDir = Vector3.new(moveSpeed, moveDir.Y, moveDir.Z)
        elseif userInputState == Enum.UserInputState.End then
            moveDir = Vector3.new(0, moveDir.Y, moveDir.Z)
        end
    end
end

-- listen for keyboard input that moves the camera
game.ContextActionService:BindAction("moveCameraForward",  onKeyPress, false, Enum.KeyCode.W)
game.ContextActionService:BindAction("moveCameraLeft",     onKeyPress, false, Enum.KeyCode.A)
game.ContextActionService:BindAction("moveCameraBackward", onKeyPress, false, Enum.KeyCode.S)
game.ContextActionService:BindAction("moveCameraRight",    onKeyPress, false, Enum.KeyCode.D)

如果您最终同时按下W + S或A + D,则此脚本会出现一些问题,但足以使您入门。 祝你好运!