GAM II
GAM II

Reputation: 45

I'm trying to get "leaves" to produce a rustling noise in a Roblox game by monitoring all child parts of the script

Using the Child-monitoring script @Kylaaa helped me with in another question, I've spent hours on this, altering the core functionality from healing and disappearing bricks to play a parent sound when the player "walks through the leaves". I've been studying various aspects of the problem ('IsA', 'TouchInterest', 'If...then', Classes, Operators, etc.), and done various things, such as altering my script to look at the name of touched objects instead of their classes, but I've had no luck getting the sound to play.

The script

-- create a helper function to access the brick and the thing that touched it
function OnTouched(thing)
    local active = false --start with this debounce variable off so that the function will run the first time
    return function(target) --provides actual target of the event
        if active then return end       -- do not do the animation again if it has already started
        local player=thing.Parent:findFirstChild("Humanoid") --determine if it's humanoid
        if player then --if it is, then
            active = true --toggle to prevent function from running again simultaneously
            script.Parent:play() --play rustling leaves sound
            wait(1)
            active = false -- reset so function can be used again
        end --end of if statement
    end
end

-- loop over the children and connect touch events
local bricks = script:GetChildren()
for i, brick in ipairs(bricks) do
    if brick:IsA("Part") then
        local onTouchedFunc = OnTouched(brick)
        brick.Touched:Connect(onTouchedFunc)
    end
end

This is a shot of the leaf litter I want to add the rustling sound to. I also have the same problem with the vines on the left side.

leafy area

Vines:

Vines structure and properties

All leaves are 'MeshParts' with 'SurfaceAppearance' inside, and are Anchored and CanTouch but not CanCollide. I tried turning on CanCollide but it didn't help.

Dense Leaf patch properties:

Dense Leaf patch properties

Surface Appearance properties:

Surface Appearance properties

I had tried "if brick:IsA("Model" or "MeshPart") then" and "if brick.Name=="Dense Leaf patch" or "SurfaceAppearance" or "DenseLeafPatch" then" but neither of those worked.

I then noticed that a TouchInterest wasn't generated by Roblox, and I learned that you can neither copy nor duplicate TouchInterests to use where you need them (they're not there for developers, according to a message in the DevForum).

I originally had 1-3 leaves 'MeshPart's in separate 'Model's, but then made a single, invisible part (name: TouchInterest), CanTouch not CanCollide, that was large enough to cover almost all of the physical area of the instances, and put all of the MeshParts into that part. Then, I altered the script to just look for 'Part's. As a result, a TouchInterest does get generated during run-time.

Shows the invisible part all leaves are in.

This is all of the stuff involved in the group "leaves", with the sound, then the script, the containing part, then all the leaves inside as children of the script.

Structure and properties of the containing part

Sound's properties:

Properties of the sound

No errors for this were in the Output.

I feel like there's something simple I don't understand. Do I need several small parts (instead of the one large one) encompassing groups of leaves? Please help!

Upvotes: 0

Views: 347

Answers (2)

TheStickminKing
TheStickminKing

Reputation: 1

On line 18, maybe try script:GetDescendants(), this also gets the children of the children. And if you want it to account for MeshParts and other types of part s, on line 20 you should use if brick:IsA("BasePart")

Upvotes: 0

GAM II
GAM II

Reputation: 45

I figured out the problems.

  1. On line 6, I used "thing" when I should've used "target".
  2. On line 9, I forgot to capitalize "Play".
  3. On line 10, I needed to make the wait 2 seconds instead of 1.

Upvotes: 1

Related Questions