EzUISprings - Simple UI Movement Module

yooooo its not the ultrakill hud in roblox!!! /j
anyways cool module, might use

Hey all, I have decided to revisit this old module I made a bit ago and clean it up a bit since it was made in a night when I had less of an idea what I was doing. I haven’t added too much functionality but I did fix a few lurking bugs that were roaming around after all this time.

Change Log V 1.1:

→ Bug Fixes:

  • Mouse3DInfluence no longer has janky SpringInfluence based on look Camera LookVector.
  • Fixed disconnect not destroying residual parts sometimes.
  • Isloated UISpringObjects into their own metatable.

→ Functionality Changes

  • ApplySpringEffect (the 2D one) has been deprecated and since removed.
  • Paramaters are no longer specified when calling apply functions, but rather when the UISpringObject is created. (Example can be found near the top of the module)
  • UISpringObject:Disconnect()UISpringObject:Destroy(), given a more fitting name but also done to avoid confusion as apply functions now return their connections.
  • Added EzUISpring:ClearAll(), just a way to destroy all active SurfaceGuis and SpringParts.

You can find this new version both on the toolbox, as I have updated it to include this new version, and also as an attachment here.

Toolbox Version:

Thanks for using my janky stuff!

I’m not quite sure how your gui is set up entirely but from the looks of it, this is intended behavior. It just plops your gui onto a part surface as is.

The problem is that no matter what gui it is, the Apply3DMouseEffect() is always centered in the middle of whatever size screen at 0.5, 0, 0.5, 0

But instead of whatever size screen it is,I want it to be the center of the gui/frame itself.

Hey so cool module, but for some reason im getting this error and the ui partially works, anyone has this error? Idk what im doing wrong tbh

Erm, that is really weird. Can you show me what you fed into the function for SurfaceGuiProperties?

Yeah, sure, I just used the example you gave for the 3D movement, but here it is


its a script inside of a frame, i tried using it in a imagelabel and gave me the same error, so yh, it errors in any kind of UI element you put it
Only thing i changed was the rotation to test if it worked but since it errors, it just moves side to side but nothing else

Yeah uhhh, I updated it a couple days ago and it doesnt take those constructors anymore.
There’s a small example at the top inside the modulescript that could help you, but I should probably make a new writeup on how to use it since that little bit clearly wasn’t enough xd, my apologies.

UISpring:Apply3DSpringEffect() takes in an optional SurfaceGuiProperties table, which is just a dictionary of properties for it, something like this:

UISpring:Apply3DSpringEffect({
   LightInfluence = 0;
   ZIndexBehavior = Enum.ZIndexBehavior.Global;
   --etc. etc.
})

If you want to change the properties of the spring effect, thats now done with a new parameters constructor for when you first make the UISpring object.

local SpringParams = EzUISprings.newSpringParams()
local UISpringObject = EzUISprings.new(MyGuiObject, SpringParams)

The SpringParams governs the behaviors of the spring, and is just a dictionary given this type:

type SpringParams = {
	SizeFactor: number;
	SpringIntensity: number;
	MouseIntensity: number;
	UseCameraFocus: boolean;
	ShowDebug: boolean;
	MouseCap: Vector2;
	BaseRotationOffset: Vector3;
};

You can also apply new spring params after you start displaying the object too, with UISpring:UpdateSpringParams(NewSpringParams)

In the end though, your new script should look something like

local EzUISprings = require(...) --path to module
local MyGuiObject = (...) -- path to object

local SpringParams = EzUISprings.newSpringParams({
  SpringIntensity = 2;
  BaseRotationOffest = Vector3.new(0, -90, 0);
})

local UISpringObject = EzUISprings.new(MyGuiObject, SpringParams)
UISpring:Apply3DSpringEffect({})

Let this be a lesson to myself not to update things out of the blue without writing extensive documentation! If there are any more issues then i’ll make a full write up but for now i will leave it be.

1 Like

…ok im just dumb, didnt think on checking the module itself lol…yeah, doesnt show up errors now and works better, thank you man and sorry for the trouble, loved the module

1 Like

C̶h̶a̶n̶g̶i̶n̶g̶ ̶t̶h̶e̶ ̶r̶o̶t̶a̶t̶i̶o̶n̶ ̶d̶o̶e̶s̶n̶’̶t̶ ̶s̶e̶e̶m̶ ̶t̶o̶ ̶w̶o̶r̶k̶ ̶w̶i̶t̶h̶ ̶t̶h̶e̶ ̶u̶p̶d̶a̶t̶e̶d̶ ̶v̶e̶r̶s̶i̶o̶n̶.̶ ̶T̶h̶e̶ ̶3̶D̶ ̶m̶o̶u̶s̶e̶ ̶e̶f̶f̶e̶c̶t̶ ̶d̶o̶e̶s̶n̶’̶t̶ ̶w̶o̶r̶k̶ ̶e̶i̶t̶h̶e̶r̶.̶ ̶I̶t̶ ̶s̶e̶e̶m̶s̶ ̶l̶i̶k̶e̶ ̶c̶h̶a̶n̶g̶i̶n̶g̶ ̶t̶h̶e̶ ̶S̶p̶r̶i̶n̶g̶P̶a̶r̶a̶m̶s̶ ̶d̶o̶e̶s̶n̶’̶t̶ ̶a̶f̶f̶e̶c̶t̶ ̶a̶n̶y̶t̶h̶i̶n̶g̶ ̶a̶t̶ ̶a̶l̶l̶.̶

Edit: Nvm, the code example you posted to the devforum doesn’t work. Using the example included in the actual module does work.

i apologize for reviving this dead topic, but i do have a question, how could i go about making this work for a custom camera?

normally it looks like this

but when i use a custom camera offset, it dissapears

i tried reading the code of the module but i just couldnt figure out how to offset the position of the surface gui

Are you using a secondary camera or modifying the camera that is being used already by the player?

i am modifying the default camera and giving it an offset to create this effect

Huh weird, my gut is telling me that the renderpriority for the effect needs to be set after camera, but im not entirely sure.

I don’t currently have my computer atm but I’ll make a new option in the SpringParams that lets you edit that. — Probably in a day or two

This is probably one of, if not the best UI utilities out there. I have been looking for a module capable of organizing a 3d HUD aspect to UI. Definite vouch from me!

1 Like

i was going to use the 2d thing for a sway but its gone now :disappointed_relieved:

I’ll work on readding it when I get back home after school assuming I don’t collapse onto my bed.
The reason I removed it in the first place was because it’s kinda common and easy to do in the first place so I just assumed nobody needed it. I should probably stop doing that…

Change Log V 1.2:

→ Functionality Changes

  • Added a new, separate type for 2D spring effects.
    It’s the same as the normal 3D variant… except 2D!!! wow.
    This type is made with EzUISprings.new2D() and takes (GuiObject: GuiObject, SpringParams2D: SpringParams2D?) as constructors.
  • You can now set the camera you wish to use as reference in the SpringParams, although it will default to the CurrentCamera if one is not set.
  • Got rid of some random prints that I forgot about. (Sorry!)

New version, as always, is on the toolbox and also downloadable as a .rbxm file here.

Hey, I believe the modules rotation is broken? I’m not sure if I’m using it incorrectly but the following happens when I try to change the rotation by even a bit. I have tried TextLabels, Frames, using decimal points for the rotation but it all ends up the same.

local uiSprings = require(game.ReplicatedStorage.Modules.Utils.EzUISpring)
local textLabel = script.Parent.Frame

local springParams = uiSprings.newSpringParams()
springParams.SpringIntensity = 15
springParams.BaseRotationOffset = Vector3.new(1, 0, 0)

local uiSpringObject = uiSprings.new(textLabel, springParams)
uiSpringObject:Apply3DSpringEffect()

textLabel.TextLabel1.MouseButton1Click:Connect(function()
	print("hi")
end)

(file was too large so I uploaded to google drive)

Hey yeah, so I made an oopsie and accidentally slotted in BaseRotationOffset for BasePositionOffset.

As you can tell, I didn’t test it at all lol :sweat_smile:
I’ve updated the toolbox and .rbxm file and it should be fixed now, just re-insert the module.