Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Why doesn't coroutine.create() work and am I doing it right?

So, I was having to use two scripts instead of one. But I wanted to just combine it into one script. Nothing works. If. you could help please, thank you. I may use this in other scripts.

Only a part of LocalScript. The rest of the LocalScript works. This is after some of the code in the LocalScript.

Code:


function create()
	local isnil = false
	repeat
	if workspace:FindFirstChild("Car") == nil and isnil == false then
		isnil = true
		wait(1)
		script.Parent.Parent.screen.Frame2:TweenPosition(UDim2.new(0,0,0,0),nil,nil,0.5)
		script.Parent.Parent.screen.Frame2.Visible = true
	end
	wait(1)
	until not workspace:FindFirstChild("Car") == nil
end

local co = coroutine.create(create)

Thanks, b_mni

2 answers

✓ Accepted answer

In this scenario, you are creating the coroutine but not running it. There are two ways you can go about this:

1.

The line local co = coroutine.create(create) creates the coroutine. This basically means you are creating the coroutine, or thread, and storing it in the variable co. To then run the coroutine you created, use coroutine.resume.

function create()
    local isnil = false
    repeat
    if workspace:FindFirstChild("Car") == nil and isnil == false then
        isnil = true
        wait(1)
        script.Parent.Parent.screen.Frame2:TweenPosition(UDim2.new(0,0,0,0),nil,nil,0.5)
        script.Parent.Parent.screen.Frame2.Visible = true
    end
    wait(1)
    until not workspace:FindFirstChild("Car") == nil
end

local co = coroutine.create(create) -- Creates the coroutine with the code in the above function

coroutine.resume(co) -- This runs, or resumes the coroutine

2.

The second thing you can do is use a handy function called coroutine.wrap. This will create a coroutine and store it in a variable, with the function you want to run when the coroutine is called as the only parameter. When you use coroutine.wrap to create a coroutine, you then have to simply call it as you would any normal function.

local co = coroutine.wrap(function() -- creates the coroutine/thread with the below code as the source
    local isnil = false
    repeat
    if workspace:FindFirstChild("Car") == nil and isnil == false then
        isnil = true
        wait(1)
        script.Parent.Parent.screen.Frame2:TweenPosition(UDim2.new(0,0,0,0),nil,nil,0.5)
        script.Parent.Parent.screen.Frame2.Visible = true
    end
    wait(1)
    until not workspace:FindFirstChild("Car") == nil
end)

co() -- runs the thread

If you only plan to run the thread once, I would use the second option, but if you plan to use coroutine.yield and coroutine.resume often as more complex code would require, then use to first option. I hope this helped! If you need more information check out this article about coroutines: https://developer.roblox.com/en-us/articles/Beginners-Guide-to-Coroutines

I figured it out: You have to use coroutine.resume() to start it.

function create()
    local isnil = false
    repeat
    if workspace:FindFirstChild("Car") == nil and isnil == false then
        isnil = true
        wait(1)
        script.Parent.Parent.screen.Frame2:TweenPosition(UDim2.new(0,0,0,0),nil,nil,0.5)
        script.Parent.Parent.screen.Frame2.Visible = true
    end
    wait(1)
    until not workspace:FindFirstChild("Car") == nil
end

local co = coroutine.create(create)
coroutine.resume(co)

1 comment

0

how can i accept my own answer lol

This discussion is preserved as it was. New answers, comments, and votes are closed.