Chris Pioli's Avatar

Chris Pioli

@cpioli.bsky.social

Gameplay Engineer and Game Designer. Loves Nintendo, Square-Enix, Sony, Jedi, Muppets, and cooking! Opinions are my own and do not represent my employers!

1,240 Followers  |  2,714 Following  |  2,019 Posts  |  Joined: 03.08.2023  |  1.8871

Latest posts by cpioli.bsky.social on Bluesky


I had not heard of data channels in Niagara systems before now. It's experimental yes, but still cool. Hmm.

25.02.2026 13:40 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

If I can successfully get looping effects to work, that's a huge challenge over and done with.

At some point I need to write functionality so effects can be triggered in code by collisions, too. And ones that are emitted by default, like on a weapon...

God this is getting so complex. Y.Y

25.02.2026 13:18 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Otherwise, I would have done it already!

So what's the solution?

๐Ÿ’ก

Delegates!

When an Actor is going to be destroyed, pass a function that destroys its Registry inside the subsystem's "Looping Effects" directory.

So back to the original problem... use UStructs.

#RubberDuckCoding

25.02.2026 13:14 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

To maintain encapsulation, I can't just write an AActor subclass and expect all projects to rearrange their architecture. The plugin's component could keep track of looping effects... if that didn't create a circular dependency. The Subsystem would have to send looping effects back to the Component!

25.02.2026 13:14 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I just realized something...

If an Actor - that owns components emitting looping effects spawned by my plugin - is removed from the level, I'd have to update the Subsystem to remove that Actor from the Directory, and all its references. Seems inelegant?

The alternative is...

25.02.2026 13:14 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I'm frustrated that template errors and incompatible argument lists are causing this problem. That's such a junior-level problem! The only thing that's changed is I am not using ustructs or uclasses, just normal structs. I do not understand why that would be the problem, but whatever man...

25.02.2026 13:14 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

However, the *other issue* remains. I created a bunch of structs like in my original post, but every time I implement them, some template error stopped the compilation.

I was hoping I could just use plain structs, but the more I think about it the less it makes sense, especially in Unreal C++

25.02.2026 13:14 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

#UnrealEngine All I had to do for the first problem was get the AssetManager to front load. It refused to load into the class's member, though. *That* caused a crash for some reason. Had to use a pointer in-scope. Maybe I should grab the Asset Manager and Stream Manager in the constructor?

25.02.2026 13:14 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 1

"YO DAWG, I HEARD YOU LIKE TEACHING YOUR AI WITH DATA!

SO I TAUGHT MY AI
WITH THE DATA THAT CAME FROM
THE AI YOU TAUGHT WITH DATA!"

...there's a way to make this work, I swear to God! That Is the 5th draft. I can do this.

24.02.2026 08:05 โ€” ๐Ÿ‘ 18    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Oh, riiiiiiight!

The object referenced could also be an AActor, so I will probably need to use a different pointer type. Urgh...

Maybe I can make an ActorManagementComponent to hold reference to all these Actors the system might be generating? Wait that sounds ridiculous...

24.02.2026 07:47 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

And LoopingEffectsReference would house the essential data: the pointer to the thing, maybe the owning Actor, the time that has passed since the object was fired, etc.

Honestly? This might be overdoing it, but if it works for the AnimNotifyEventReference, it can work for me!

24.02.2026 07:40 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

TMap<AActor*, FLoopingEffectsOwnedByActor> LoopingEffectsDirectory;

struct FLoopingEffectsOwnedByActor
{
TMap<FName, FLoopingEffectsContext> LoopingEffectsIndex;
}

struct FLoopingEffectsContext
{
TArray<FLoopingEffectReference*> LoopingEffectsList;
}

struct FLoopingEffectsReference
{
}

24.02.2026 07:40 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

The Key is the Actor's address and the Event Name, but I turn them into an FString. The intent is to make these looping effects accessible to any part of code that knows the owning actor and the event that was fired.

The best idea is probably using structs.

24.02.2026 07:40 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

#UnrealEngine I did not realize that in AnimPreview my WorldSubsystem does not call OnWorldBeginPlay(UWorld&)...

Because that's what's happening. And it is one of two suspects into why my code crashes.

The other being a poorly implemented Data Structure that crashes when I lookup a key.

24.02.2026 07:40 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 1

If you're used to using Facetime but it's a voice-only call, that can definitely happen and it's just force of habit. Not your fault.

If you still do it, it's still not your fault but just make sure nobody noticed you... ๐Ÿ˜…

24.02.2026 01:13 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

2. Front-loading all effects in an AnimMontage before AnimNotifies fire, begin, tick, or end. I thought the Subsystem would handle this, but *boy was I wrong*

Why not just make the Async code into Synchronous Load Code? It'll stop this from happening...

24.02.2026 01:05 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Returning to the looping effects now. There are 2 huge problens

1. Creating a data structure that meets the criteria I have written (accessible through Subsystem, generated by owner Actor and Event Name, etc.) and DOES NOT CAUSE ANY FATAL ERRORS

(Cont'd)

24.02.2026 01:05 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Ask the OP/Author to give you a copy, directly through E-mail.

They'll probably give you a copy, free-of-charge. They want people to read it, those resources want people to pay for it.

24.02.2026 00:59 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0
Preview
a man with a beard wearing a gump hat is tired and walking down a road Alt: Forrest Gump has finished walking across the United States. He feels tired. He wants to go to bed now. And a group of people are waiting behind him, followers.

๐Ÿ˜ตGasp! ...shiny... ๐Ÿ˜ซ alpha...
Baxcalibur... ๐Ÿ˜ฉ
I caught it... ๐Ÿ˜ฎโ€๐Ÿ’จ

23.02.2026 04:04 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Someday he will be old, and he will be cast in a trailer

He will walk down wooden halls of hand carved mahogany; adorned in gray linens and prayer beads on his wrist. Hanging metal braziers glowing with green tongues of fire

He will enter an arena, raise his knotted finger, and shout the words...!

23.02.2026 01:06 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

I added config vars so the user can define which classes and what directories to search for asset references. An Interface is also provided so any class written can return them in list form.

AnimMontage doesn't let me make subclasses easily, tho, so it's hard to get the assets in all their Notifies

21.02.2026 07:20 โ€” ๐Ÿ‘ 2    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Asset loading works correctly now. Create Object libraries, cycle through all Blueprint Classes, find and upload all the assets. #UnrealEngine

I've isolated the redundant code into lambdas, and I created an Interface so any future classes that use this system can pass the assets their unique way.

21.02.2026 07:20 โ€” ๐Ÿ‘ 5    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

Let me tell you what happens when they canโ€™t manufacture enough parts for critical medical equipment: the companies will exit making that equipment and your insurance company will say โ€œtoo bad, do your best to keep it workingโ€.

Phillips did this with pediatric ventilators.

18.02.2026 00:31 โ€” ๐Ÿ‘ 621    ๐Ÿ” 329    ๐Ÿ’ฌ 3    ๐Ÿ“Œ 6

I really dread this one because a certain help forum was pretty unsupportive. Gatekeeping bullshit, "oh this looks like something written by an entry level programmer."

Give me a break! Oh well, better suck it up. If I let their remarks get in my head, I'll never get this work done.

16.02.2026 00:58 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

Once I'm done with asset loading, I must return to making my STUPID LOOPING EFFECTS WORK!

Maybe front-loading the effects will fix my looping effects bug, or make it easier to deal with.

16.02.2026 00:54 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I don't think this is absolutely necessary to implement right this moment, but it is a really cool programming challenge I'd like to get into.

16.02.2026 00:52 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

I suppose the best way to do this is to make an Interface and attach it to each class that houses this data, containing a function to return the List.

Fine for my classes. But engine classes like AnimMontage will need a child class. Sucks, but it'll simplify the ObjectLibrary part of the code.

16.02.2026 00:52 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

that "list of effects to fire" is going to be stored in several different class types. Some will be Blueprint objects, some will be assets. Each require a unique lambda to loop, cast, and dereference complex data structures to find these lists. I've decoupled the code as best as I can. But...

16.02.2026 00:52 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I was able to synchronously load all the effects during level load. Used ObjectLibraries, gathered FAssetData, and find the particles, sounds, and actors.

It's hard-coded into the subsystem, tho. Not very flexible, especially for more complex projects. They'd want to load assets "their way." Also

16.02.2026 00:52 โ€” ๐Ÿ‘ 0    ๐Ÿ” 0    ๐Ÿ’ฌ 1    ๐Ÿ“Œ 0

I am so sorry, Saleem. It must be unbearable. ๐Ÿซ‚

14.02.2026 04:43 โ€” ๐Ÿ‘ 1    ๐Ÿ” 0    ๐Ÿ’ฌ 0    ๐Ÿ“Œ 0

@cpioli is following 19 prominent accounts