Sorry for bumping this topic, but the 1 - (TweenService:GetValue) part just brings up an error “attempt to perform arithmetic (sub) on nil” why is get value nil?
You forgot to initialize startTime
at line 3, I think
any idea how I would make this faster? Not higher or farther horizontally, just faster.
Make t
increase faster, since it can only move at real time speed right now because it’s just t = tick()
, you would have to use DeltaTime instead, do t += deltaTime * speed
instead of t = tick()
Sorry for reviving this however I noticed that when you use alpha in this its always 1, meaning it will not tween the gun outwards however it will still quickly snap to the full walking movement. Any idea on how you could fix this?
How is it always one?
math.min(value, 1)
returns value
or 1 if value
is greater than 1, and in the case of my code, this value is ( tick() - startTime) / TweenTime
which is the time elapsed since the start of the animation divided by the time required to tween, which essentially gives a value going up from 0 to 1 within TweenTime
seconds (0.3 in our code).
The alpha
value is just the same as the 0…1 value except it uses TweenService
to make it look smoother, since the 0…1 value is linear.
https://gyazo.com/124248a8c9ed5d37197ffa4d838a56b6
In the video after using the same code your using but changing it to return the cframe so i can apply it to my ViewModel, It snaps when the player starts moving rather than tween between it.
Could you show me the full code? and could you try increasing TweenTime
?
This is the Code I’m using where I return a CF, BobTime = 0.3 and it works fine for tweening back in.
local function BobCF()
local cf = CFrame.new()
if Humanoid.MoveDirection.Magnitude > 0 then
t = tick()
StartTime = 0
local x = math.cos(t * 5) * 0.05
local y = math.abs(math.sin(t * 5)) * 0.05
local alpha = (TweenService:GetValue(math.min((tick() - StartTime) / BobTime, 1), Enum.EasingStyle.Cubic, Enum.EasingDirection.Out))
cf = CFrame.new(x * alpha , y * alpha , 0)
else
if StartTime < 1 then StartTime = tick() end
-- do math
local x = math.cos(t * 5) * 0.05
local y = math.abs(math.sin(t * 5)) * 0.05
local alpha = 1- (TweenService:GetValue(math.min((tick() - StartTime) / BobTime, 1), Enum.EasingStyle.Cubic, Enum.EasingDirection.Out))
cf = CFrame.new(x * alpha, y * alpha, 0)
end
return cf
end
You removed if lastState == 0 then lastState = 1 startTime = tick() end
, It wasn’t there for no reason lol.
if Humanoid.MoveDirection.Magnitude > 0 then
t = tick()
StartTime = 0
This code sets the StartTime
to 0
every render step which just resets the tween every step, it should only be set to tick()
(not 0) once the player goes from walking to running, which is why I used lastState
.
Try this instead:
local lastState = 0
local function BobCF()
local cf = CFrame.new()
if Humanoid.MoveDirection.Magnitude > 0 then
t = tick()
if lastState == 0 then lastState = 1 startTime = t end
local x = math.cos(t * 5) * 0.05
local y = math.abs(math.sin(t * 5)) * 0.05
local alpha = (TweenService:GetValue(math.min((t - StartTime) / BobTime, 1), Enum.EasingStyle.Cubic, Enum.EasingDirection.Out))
cf = CFrame.new(x * alpha , y * alpha , 0)
else
if lastState == 1 then lastState = 0 startTime = tick() end
-- do math
local x = math.cos(t * 5) * 0.05
local y = math.abs(math.sin(t * 5)) * 0.05
local alpha = 1- (TweenService:GetValue(math.min((tick() - StartTime) / BobTime, 1), Enum.EasingStyle.Cubic, Enum.EasingDirection.Out))
cf = CFrame.new(x * alpha, y * alpha, 0)
end
return cf
end
Thank you! Don’t know how I didn’t see that.