We use cookies on this site to enhance your user experience
Collapse Sidebar




The LeftSurfaceInput property determines the kind of input provided to a part’s /BasePart/LeftSurface. This is only relevant for Motor or SteppingMotor SurfaceTypes. This property determines how /BasePart/LeftParamA and /BasePart/LeftParamB are used. For brevity, these properties will be referred to as ParamA and ParamB, respectively.

  • By default, this is set to NoInput. This stops the motor altogether,
  • For Constant, the motor rotates at a constant velocity equal to ParamB.
  • For Sin, the motor rotates at a velocity equal to ParamA * math.sin(workspace.DistributedGameTime * ParamB). See /Workspace/DistributedGameTime.

Code Samples

Motor Control

This code sample demonstrates how surface properties can be set using only a NormalId (Top, Front, etc). It switches a motor’s -SurfaceInput from NoInput, Constant and Sin to show how each work using -ParamA and -ParamB properties.

-- Paste this into a Script inside a part with a Motor SurfaceType
local partMotor = script.Parent
-- Place a brick called "MovingPart" so it is touching the Motor surface
local partMoving = partMotor.Parent.MovingPart

-- For this example, we use TopSurface, TopSurfaceInput, TopParamA and TopParamB
-- However, this will work for all faces (NormalId): Top, Bottom, Left, Right, Front and Back

-- A function to quickly set all surface properties at once 
local function setFaceSurfaceInputParams(normalId, surfaceType, inputType, paramA, paramB)
	local surfaceName = normalId.Name -- e.g. "Top", "Bottom", etc

	-- Syntax Note: in Lua, part.Something is the same as part["Something"]
	-- The difference is that the latter allows us to use a string ("Something"), while
	-- the former requires use of an identifier (.Something). Below, we build of each the surface
	-- properties below by concatenating the surface name with the property postfix.
	-- Set "___Surface", eg "TopSurface"
	partMotor[surfaceName .. "Surface"] = surfaceType
	-- Set "___SurfaceInput", eg "TopSurfaceInput"
	partMotor[surfaceName .. "SurfaceInput"] = inputType
	-- Set "___ParamA", eg "TopParamA"
	partMotor[surfaceName .. "ParamA"] = paramA
	-- Set "___ParamB", eg "TopParamB"
	partMotor[surfaceName .. "ParamB"] = paramB

local normalId = Enum.NormalId.Top

while true do
	-- Set to NoInput, where the motor will not operate at all
	setFaceSurfaceInputParams(normalId, Enum.SurfaceType.Motor, Enum.InputType.NoInput, 0, 0)
	-- Set to Constant, where motor rotational velocity = paramB
	setFaceSurfaceInputParams(normalId, Enum.SurfaceType.Motor, Enum.InputType.Constant, 0, .25)
	-- Set to Sin, where motor rotational velocity = paramA * math.sin(time * paramB)
	-- Since we're using pi (~3.14), the frequency of rotation is 1 second (per definition of sine function)
	setFaceSurfaceInputParams(normalId, Enum.SurfaceType.Motor, Enum.InputType.Sin, .25, math.pi)