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

How do you go about making an RTS camera / city builder camera in ROBLOX Studio?

所以我想为 ROBLOX 做一些 Minimum VPs 的一些游戏想法,其中大多数是 RTS / City Building 游戏。我曾多次尝试让相机正确,但我就是做不到。我无法使用 WASD 移动相机。有人可以帮忙吗?

我尝试将相机连接到一个部件,并让玩家在地图上方的另一个不可见平台上不可见。 None 他们中的摄像头在 Banished 或 Halo Wars 等游戏中的工作方式(我希望摄像头的工作方式)

嘿嘿!

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

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

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

由于您制作的是像星际争霸或光晕战争这样的 RTS 风格游戏,我建议制作一个简单的摄像机悬停在空中,以大约 60 度角指向地面,并沿 X 轴移动WS键盘输入,Z轴沿AD键盘输入。

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

  1. 确保未选中复选框 Players.CharacterAutoLoads
  2. StarterPlayerScripts 中创建一个名为 CameraScript
  3. 的 LocalScript
  4. 将以下脚本粘贴到 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,此脚本会出现一些问题,但它应该足以让您入门。 祝你好运!