FloatyAnimator.lua 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. local Workspace = game:GetService("Workspace")
  2. local CollectionService = game:GetService("CollectionService")
  3. local RunService = game:GetService("RunService")
  4. local FLOATY_TAG = "floaty"
  5. local PI = math.pi
  6. local TAU = PI * 2
  7. local SPEED = 1.5
  8. local floaties = {}
  9. local function addFloaty(part)
  10. floaties[part] = {
  11. part = part,
  12. originalCFrame = part.CFrame,
  13. offset = math.random() * TAU * SPEED
  14. }
  15. end
  16. local function removeFloaty(part)
  17. floaties[part] = nil
  18. end
  19. local function update(t, dt)
  20. for _, floaty in pairs(floaties) do
  21. local part = floaty.part
  22. local origCFrame = floaty.originalCFrame
  23. local scaledTime = (t*SPEED) + floaty.offset
  24. local xDisplacement = math.sin(scaledTime%TAU)
  25. local yDisplacement = math.sin((scaledTime+(0.2516623*TAU))%TAU)
  26. local zDisplacement = math.cos((scaledTime+(0.6572269*TAU))%TAU)
  27. local posTransform = CFrame.new(xDisplacement*0.5,yDisplacement*1, zDisplacement*0.5)
  28. local angularTransform = CFrame.Angles(xDisplacement*math.rad(10),yDisplacement*math.rad(15), zDisplacement*math.rad(15))
  29. local transform = posTransform * angularTransform
  30. part.CFrame = origCFrame * transform
  31. end
  32. end
  33. for _, part in pairs(CollectionService:GetTagged(FLOATY_TAG)) do
  34. addFloaty(part)
  35. end
  36. CollectionService:GetInstanceAddedSignal(FLOATY_TAG):Connect(addFloaty)
  37. CollectionService:GetInstanceRemovedSignal(FLOATY_TAG):Connect(removeFloaty)
  38. RunService.Stepped:Connect(update)