Object Pooling (in depth) - Game Programming Patterns in Unity & C#

  Рет қаралды 59,853

Jason Weimann

Jason Weimann

Күн бұрын

Пікірлер: 124
@Unity3dCollege
@Unity3dCollege 5 жыл бұрын
Download the project source here - unity3dcollege.blob.core.windows.net/site/YTDownloads/Pooling%20Pattern.zip
@user-lv6qm3fj2z
@user-lv6qm3fj2z 5 жыл бұрын
Hey, Jason. I see you doing the Enqueue objects back into the queue only after they expire their lifetime. Is there a reason for that? Why not just put it back in right after we Dequeue() ? Like: GameObject obj = pool.Dequeue(); pool.Enqueue(obj); This way we make sure that even if somehow the lifetime of the object isn't ended yet and we already need it again it will just disappear from where it stuck and get back into usage.
@herohiralal3255
@herohiralal3255 4 жыл бұрын
​@@user-lv6qm3fj2z it would prevent instantiations entirely because the queue will always have a pooled object which would be reused every time it's needed.
@user-lv6qm3fj2z
@user-lv6qm3fj2z 4 жыл бұрын
@@herohiralal3255 ummm... no? Why would you even mention instantiation? We instantiate all needed objects on start. We don't instantiate anything during the process of dequeuein/enqueueing.
@danielschulz7391
@danielschulz7391 4 жыл бұрын
@@user-lv6qm3fj2z we do. If the queue is empty we instatiate a new object. If you don't know exactly how many objects you will need, your option on the pool won't work.
@user-lv6qm3fj2z
@user-lv6qm3fj2z 4 жыл бұрын
@@danielschulz7391 that doesn't make any sense. We make queue to avoid instantiation during the game to lower the script "weight". Why would we start instantiating objects in the middle? And the fact that the queue isn't big enough to satisfy all the requests - that's when the way I described comes to the rescue. If we return the object into the queue right after we took it from there, then in case the queue makes a "full turn" then we just use the object that is already in use "despawning" it from where it was an inserting it into place, where we need the new one.
@marck0zz
@marck0zz 3 жыл бұрын
I was using the classic "Instantiate and destroy" method on an shooter like game, then I decided to try this... the difference in the performance is HUGE!!! Thanks man!!
@quadtychgort6485
@quadtychgort6485 5 жыл бұрын
IMO you're like Cherno but for Unity/C#. Really appreciate what you're doing. You're dragging my old head up to speed! Thanks, man.
@lunkums
@lunkums 2 жыл бұрын
cherno is the friggen goat
@zombievirals
@zombievirals 4 жыл бұрын
Huge help, even two years later. For some reason I just kept avoiding object pooling, but now that I'm working on a serious team project, I feel a duty to do everything I can to make the game run as efficiently as possible. Thanks a million, this was much easier to implement than I though it would be!
@mrp0001
@mrp0001 4 жыл бұрын
"even two years later" The video was released 1 year ago though?
@ahmedaghadi8281
@ahmedaghadi8281 2 жыл бұрын
@@mrp0001 not for me though xD
@TheDiggidee
@TheDiggidee 4 жыл бұрын
Coming from a .NET MVC background and watching your videos I'm really glad that someone follows proper coding principals like you. So many Unity videos I see that are just terrible code.
@GameDevNerd
@GameDevNerd 3 жыл бұрын
Now that's some real C# programming right there ... generics, lambda expressions, LINQ, delegates & events, those are the sweet features that make C# stand out from the crowd.
@MaximumSpice
@MaximumSpice 5 жыл бұрын
awesome tutorial man, explains 3 different cases really well. Perfect, I've watched it 3 times now and I feel like I fully understand how to setup my own pooling case in any situation. Thanks a ton!
@TheBcoolGuy
@TheBcoolGuy 4 жыл бұрын
In other words, reincarnation.
@devsmartnothard530
@devsmartnothard530 2 жыл бұрын
object reincarnation pattern, sounds good
@rajmishra6769
@rajmishra6769 5 жыл бұрын
Loving your videos more and more , although i didn't understand most of it , it will take me at least 2-3 re watches to fully understand the core concept. It gave me a reason to study other concepts also like queue,singleton etc.So thanks for that, will follow your videos regularly to learn new things.
@danieljayne8623
@danieljayne8623 3 жыл бұрын
Easier than I expected and clearly very useful and effective, thank you. Nice to see some clean code in a Unity tutorial. Everyone else seems to be competing on speed!
@Fenixmaiden666
@Fenixmaiden666 4 жыл бұрын
Been trying to wrap my head around object pooling for a lttle while. Thanks you this is way clearer and simplified. Thanks for sharing :D
@Dbl_Plus_Good
@Dbl_Plus_Good 3 жыл бұрын
Used this video to substitute a different pooling pattern I was using and this is a lot better. Well done, sir.
@mykilpee
@mykilpee 5 жыл бұрын
I've always used arrays and create everything when the scene loads. This is a cool new way to do it! Nice!
@alan138
@alan138 5 жыл бұрын
If you dont destroy the objects inside the array at anytime is pretty much a pooling system anyway, maybe not a proper way of pooling but a pool anyway.
@dopplegangerdavid
@dopplegangerdavid Жыл бұрын
I have a different way of doing this where I'll immediately Enqueue the prefab that the pool dequeues. This may seem counterintuitive, but what that's doing is moving the prefab to the back of the line, but the reference to that object can still be returned to the user. So, that way, the pool never runs out of objects. It also means that the prefab isn't dependent on the pool.
@GiannyDev
@GiannyDev 4 жыл бұрын
Amazing video Jason, the best Unity channel out there
@RossYlitalo
@RossYlitalo 5 жыл бұрын
This is wonderful! Please Make More of These (Tutorials on Unity!)
@raptorswire7212
@raptorswire7212 3 жыл бұрын
this solution is so elegant and brilliant! Love it!! Works great!
@hologram_sam9487
@hologram_sam9487 3 жыл бұрын
helped me instantly wrap my head around the concept
@codersexpo1580
@codersexpo1580 5 жыл бұрын
Good stuff Jason. Nice to see someone who knows what their talking about. Keep it up. Subscribed.
@paddomat686
@paddomat686 4 жыл бұрын
Thank you! You helped me a lot with my Project!! :)
@firepro20
@firepro20 4 жыл бұрын
Thanks for teaching me what game courses did not.
@quadtychgort6485
@quadtychgort6485 5 жыл бұрын
Subbed and I'm a patron! Thanks for your work!
@shivanshchanana1
@shivanshchanana1 5 жыл бұрын
Thank you so much for sharing this information with us, sir. I love your videos especially game programming patterns video. would love to have more of them
@ale-hl8pg
@ale-hl8pg 5 жыл бұрын
I tried making a similar pooling concept to this, however where the poolable objects can pool themselves but ran into a problem, the Queue being static in an abstract class means that every class inheriting from the genericobjectpool will technically have the same pool Static variables don't get inherited and stay on the "level" of the class that they're at currently, if you pooled a house and a bullet (as long as the house had the same script as the bullet) they would both be used from the same pool.
@mikoaj7956
@mikoaj7956 4 жыл бұрын
Idk if I had the same problem as you, although indeed, where I tried the last approach having the same script component but different prefabs, this didnt worked as the Instance was pointing to whatever object was first to claim it. I think its a very important remark. I ve dealt with that using multiple generics "GenericObjectPool" And then "public static GenericObjectPool Instance {get; private set; }" And K should be a specific pool.
@luckasberguecioebensperger1665
@luckasberguecioebensperger1665 5 жыл бұрын
thanks bro.... being trying to understand how to code object pooling for a week already, people explain it like sh*t even in my own language hahaha thanks! keep going please!
@ralpholiver2889
@ralpholiver2889 4 жыл бұрын
There is another pooling tutorial with much more views, that fails to explore all the basic and necessary pooling techniques you introduce here, this video should be the topmost one on the subject. Nice job!
@klarnorbert
@klarnorbert 4 жыл бұрын
One of the reason why games made with Unity have poor performance: game devs can't optimize their games, because their knownledge is non-existent.
@alvin4100
@alvin4100 4 жыл бұрын
Thanks man for going in depth into this
@TheJacksonFaller
@TheJacksonFaller 5 жыл бұрын
I like a non-generic approach better, you can create a poolable object component with a reference to a pool and a lifetime and inside of update check for lifetime, return it to the pool and disable it. On the pool itself just require this pooling object component instead of GameObject so you can assign pool reference and a lyfetime of the pooling object if needed. You can also make Update method protected virtual inside of poolable object so you can override it and also use a base one.
@MrWaaaaah
@MrWaaaaah 4 жыл бұрын
Good Stuff Jason, many thanks!
@benjamingerd4703
@benjamingerd4703 3 жыл бұрын
Doesn't appear to work with Prefabs! Jason, I don’t think method 3 is usable in the following scenario: If your blaster is a prefab, but your object pool is a game object in your scene’s hierarchy, then adding the object pool to the blaster via the inspector, and then applying the change to the blaster prefab, will not be possible, because: “A reference to an object in the scene cannot be applied to the Prefab asset”.
@theebulll
@theebulll 3 жыл бұрын
All of this information was really great. But my head exploded when I saw that you can vertically select code in the editor???
@marcusotter
@marcusotter 5 жыл бұрын
Small error with the AddObjects() method on line 30 in GenericObjectPool: It has the argument "count" but that's never used, guessing you just missed to wrap the method in a for loop. Good video nonetheless!
@Wanfanel
@Wanfanel 5 жыл бұрын
if (count > 1) AddObjects(count - 1);
@e0architect
@e0architect 5 жыл бұрын
Hello, The download link contains different project than the video. Am i missing something here?. Thanks
@TheAceInfinity
@TheAceInfinity 5 жыл бұрын
Great detail and explanations.
@kobi665
@kobi665 4 жыл бұрын
i don't understand how he instantiates the prefab.. The prefab is a gameobject, but the type he uses is the controller type (C# class file), How can you instantiate this while still accessing the Controller's functions?
@devsmartnothard530
@devsmartnothard530 2 жыл бұрын
When your prefab has a monobehaviour on it you can instantiate it and assign to a variable of a type of that monobehaviour. That's how unity works - here: kzfaq.info/get/bejne/q96dZ8RhttS1aXk.html
@RossYlitalo
@RossYlitalo 5 жыл бұрын
Awesome Tutorial--Thanks!!
@johnnguyen1655
@johnnguyen1655 4 жыл бұрын
Love the video, thanks!
@scotmcpherson
@scotmcpherson 3 жыл бұрын
Jason, is there a threshold before you choose object pooling vs instantiation and destruction or is it always just go for object pooling?
@ambitiousgamestudio4661
@ambitiousgamestudio4661 2 жыл бұрын
Master
@parthpandya008
@parthpandya008 5 жыл бұрын
Wonderful Tutorial. It will be great if you Can you show how to spawn different objects like player bullet, enemy bullet, their particles etc... using same generic pool system ?
@rafaluklejewski9625
@rafaluklejewski9625 5 жыл бұрын
Any chance Jason you would let us download your little projects? I would understand much better by following you around on my screen at the same time. The same goes for the pattern videos you do - its just kinda too fast for me plus it would be give me much better understanding if we could just look around how the things are connected
@Unity3dCollege
@Unity3dCollege 5 жыл бұрын
Sure, here it is - unity3dcollege.blob.core.windows.net/site/YTDownloads/Pooling%20Pattern.zip
@rafaluklejewski9625
@rafaluklejewski9625 5 жыл бұрын
@@Unity3dCollege Thank you!
@Chief-wx1fj
@Chief-wx1fj 3 жыл бұрын
Love the last version with Generics. What would be the best way to change bullets types, "look" or "skin" depending on weapon. This system is for the same type of bullet?
@netional5154
@netional5154 5 жыл бұрын
Great video, I like the progression in the designs. Have you ever tried to completely decouple the object being pooled from the pool? So the object being pooled has no pool code / awareness?
@DrunkGeko
@DrunkGeko 4 жыл бұрын
How do you deal with the integrity of the objects? What if the pooled objects get modified (even by just adding components) and then they end up back in the pool while they are "dirty"? How do you prevent that from happening
@colbykuzontkoski3872
@colbykuzontkoski3872 2 жыл бұрын
Does anyone know why when using the generics version with spawning enemy prefabs they get sent back to the pool instantly after being re-spawned (after being killed once)? This only happens after being killed and works normally when OnBecameInvisible() is called, also works great with my bullets. I thought it was something with the death animation/animator and calling the returnToPool method with animation evens, but nothing has worked. I'm stumped!
@SirRelith
@SirRelith 5 жыл бұрын
You have any tips on how to keep your code manageable as it grows bigger and bigger? I'm having a hard time keeping my code legible as I keep adding things. I used to have a script that did all character functions, but now I've broken it up into Player.cs, PlayerInput.cs, PlayerMovement.cs, PlayerWeapon.cs, PlayerAbility.cs and this seemed to work fine. But now I'm adding multiple Weapons that all function differently like hitscan, projectile, multiple projectile, and melee. And abilities that are AOE, spawn objects, extra movement, controller enemy movement (like a hook), etc... So I started using inheritance, a base weapon class, a base ability class, a base Entity class (for players and enemies) but it's all becoming too much for my little brain to handle. Any tips on keeping it clean, coherent, and manageable? Have a great day! :)
@gwills9337
@gwills9337 5 жыл бұрын
Keep notes and draw out your class structure/game's pattern on paper and post it on your walls. The more visual you can represent your code structure, the easier it will be to navigate.
@SirRelith
@SirRelith 5 жыл бұрын
@@gwills9337 Great idea! I'll give it a try. Thanks amigo!
@RossYlitalo
@RossYlitalo 5 жыл бұрын
Check this (really great, on-topic content!): kzfaq.info/get/bejne/qpqKmJacrrDZnn0.html
@logan4179
@logan4179 3 жыл бұрын
I wonder, is there a reason to do this for rapid-fire audioclips? I know that they disappear after the clip is complete, but I can't help but wonder if there's some ramification to that.
@semnet3217
@semnet3217 2 жыл бұрын
i like ur beard also nice tutorial
@TheRoboticLlama
@TheRoboticLlama 4 жыл бұрын
I learned about garbage collection when I was programming a WebGL Minecraft clone in javascript and I was instantiating a 4x4 matrix for every block every frame 😂
@jasonwerber9154
@jasonwerber9154 3 жыл бұрын
Hi Jason, been watching alot of your videos, some really insane stuff! I was wondering how you would do this type of approach with textures being downloaded from a web api. 1000s of different textures in varying sizes, how do you deal with the caching, storing and reusing. In webgl builds its extremely memory intensive. Was just wondering if you had any ideas? Thanks
@sharkspread
@sharkspread 4 жыл бұрын
too useful, thanks alot
@HasanVurucu
@HasanVurucu 4 жыл бұрын
How does this code determine the count of pooled objects in the scene? I couldn't catch that part in source code. Thanks for the awesome video btw.
@metsuke
@metsuke 5 жыл бұрын
nice video, I have a question, if I am shoting using the particles system, does it has its own pool, being a particle system?
@joseph_everland9488
@joseph_everland9488 3 жыл бұрын
Hi, please how to create those instanties from pool in specific hierarchy place ? now it is creating in root, but I need it as child of something else.
@joseph_everland9488
@joseph_everland9488 3 жыл бұрын
nothing, fixed, at least looks like , lets go sleep :D
@FullMe7alJacke7
@FullMe7alJacke7 5 жыл бұрын
When you try to scroll down the page to see more of the IDE but you end up at the comments section xD
@CtisGaming
@CtisGaming 3 жыл бұрын
The IDE is called Rider. He details it and its uses in Unity in a recent-ish video called something like: "11 tips that made me a better programmer".
@FullMe7alJacke7
@FullMe7alJacke7 3 жыл бұрын
@@CtisGaming That's not what I was saying, I already use Rider regularly. thanks though :)
@bahtiyarozdere9303
@bahtiyarozdere9303 5 жыл бұрын
About 3rd method. What if we need 2 pools for same GameObjectType?
@phambaoha170
@phambaoha170 5 жыл бұрын
Thanks!
@KuzaFkto
@KuzaFkto 3 жыл бұрын
I have this problem when I try to make the first object pool that appears in the video (only for one object): -ArgumentException: The Object you want to instantiate is null. I don't know why, but the pool just instantiate once and after that it just "recycles" that same game object but it doesn't instantiates more copies of it. I searched in google and in a Unity support blog said that I wasn't referencing a prefab in the pool script but I am doing that,I'm sure, plsss, I am new in Unity.
@kobe_24
@kobe_24 3 жыл бұрын
drag the prefab from the AssetsPanel to the gameobject slot in the inspector
@madhackademy3558
@madhackademy3558 4 жыл бұрын
i will take the project source and try it cuz i dont see how it work with more type of gameobject and how it will select the "shootV2.0" as exemple. Anyway thx i like the way you do it with the lazy instantiation integrated. Cuz one pool automated for all gameObject will be asweome. See you
@My_Big_Dragon
@My_Big_Dragon 5 жыл бұрын
Would you please make a video about frames and how can we do animation within those frame like many VR drawing tools.
@ale-hl8pg
@ale-hl8pg 5 жыл бұрын
Since you're using generics is there a way to make it so that the parameter in shotspool would show up in the inspector, and be able to be set up? That way you wouldn't have to create multiple scripts just to change the type of the item they're pooling
@FullMe7alJacke7
@FullMe7alJacke7 5 жыл бұрын
Not with generics. You'd just need a single new script inheriting from the generic pool
@r1pfake521
@r1pfake521 4 жыл бұрын
You can do it with a custom inspector script
@motorhackz6014
@motorhackz6014 5 жыл бұрын
Just implemented the generic version. Really instructive. I still wonder how to implement different types of bullets. Does it require to define a new class for each type of prefab (like GenericObjectPool)? I tried to reference the pool and call Get() from that reference, without success. Two set ups with two different bullet pools and bullet prefabs. But it's the same bullet prefab appearing in both set-ups, and only one pool is filled with instances...
@motorhackz6014
@motorhackz6014 5 жыл бұрын
Stupid me... I forgot the ReturnToPool part! So finally I could make two pools of the same type manage their own prefabs just by having public references and passing it to the projectile as well : public ProjectilePool pool; // changed the pool name for convenience ... public void Fire() { var shot = pool.Get(); shot.pool = pool; // because there is another public reference in the projectile class as well. ... } It's working fine without the need to create a class for each type of projectile and just playing with different pools. We could even think of having different pools referenced in the weapon as to switch bullet types, say. @Unity3d College Would you suggest another approach? Thanks for all the efforts you put in sharing your knowledge.
@abdullahamjad3612
@abdullahamjad3612 3 жыл бұрын
The Unity DumbleDore of Knowledge....
@ZoidbergForPresident
@ZoidbergForPresident 5 жыл бұрын
21:04 But then, wouldn't it be better to make a pool of IGameObjectPool? That way were sure that the pooled object will manage their own poolability, no?
@Ziplock9000
@Ziplock9000 5 жыл бұрын
Yes normally. But Unity is moving towards data only objects plus factory or manager classes for ECS
@martingrof1685
@martingrof1685 4 жыл бұрын
Honestly, I get why you shaved your beard that that beard was Godly!
@Mumbolian
@Mumbolian Жыл бұрын
I'm going crazy trying to get an object pool working. Must have watched 10 videos now. They all run into an issue one way or another and I must be retarded or something. In this case I'm typing word for word and it simply breaks once I write the Blastershot Get() because it's less accessible than the instance. I've seen this error on 3 videos now and I just don't get what they're doing that isn't being explained or what I'm missing.
@user-st8td6er7u
@user-st8td6er7u 4 жыл бұрын
Not clear to which object to attach scripts.
@apoleyta9760
@apoleyta9760 3 жыл бұрын
14:32 , 21:32
@rupsje7974
@rupsje7974 4 жыл бұрын
How do you make a selection like you do at 20:17?
@rupsje7974
@rupsje7974 4 жыл бұрын
Also thanks for this vid I really needed it!
@trayfenodonnell5386
@trayfenodonnell5386 4 жыл бұрын
@@rupsje7974 In Visual Studio Code, just use shift and middle mouse. If in Visual Studio (like Jason here), Alt + Shift and left click.
@rupsje7974
@rupsje7974 4 жыл бұрын
@@trayfenodonnell5386 Thanks!
@trayfenodonnell5386
@trayfenodonnell5386 4 жыл бұрын
@@rupsje7974 Sorry it took 9 months for someone to answer...
@rupsje7974
@rupsje7974 4 жыл бұрын
@@trayfenodonnell5386 I have been waiting so long for this day!
@MrLordWarren
@MrLordWarren 5 жыл бұрын
BEARD!
@xaxababa6616
@xaxababa6616 4 жыл бұрын
Fuck I miss that beard
@ZaCkOX900
@ZaCkOX900 4 жыл бұрын
A queue for this is not necessary, I would much rather use something less heavy with speed. Array, integer index increase / reuse, simple and better.
@klarnorbert
@klarnorbert 4 жыл бұрын
Queue is the most logical choice for this. You can use array, but you need to write more code.
@ZaCkOX900
@ZaCkOX900 4 жыл бұрын
Norbert Klar Actually not true, it's the same amount of code or less. I've done object pools for years. I know what is more efficient and what to use. Just from watching how the queue is used, I can see one bad flaw. That comes from experience and using the object pools in many ways.
@klarnorbert
@klarnorbert 4 жыл бұрын
IMO with queue it's easier to implement, without overcomplicating it. If you need more performance, yeah, fixed sized arrays is the way to go.
@ZaCkOX900
@ZaCkOX900 4 жыл бұрын
@@klarnorbert is index = index + 1 mod length too complicated to understand? Maybe if people don't practice they feel things are over complicated? I agree without experience it will feel complicated but that's all it is. If you sit down and use this queue excessively, you'll realize just because there is a video on it, doesn't mean it is the best approach. I see people use lists in other situations and give the same excuse but then they call toarray() without understanding just use an array. At least with my comment people could get curious, investigate and realize a queue is not the only approach, less overhead for same code exists. That is the point I made and not an opinion. If you wanna use a queue, I won't stop you.
@MasterofGalaxies4628
@MasterofGalaxies4628 4 жыл бұрын
@@ZaCkOX900 Okay, you've made me curious now, so I'd like to know your thoughts on this: isn't one of the appeals of collections like queues, lists, and stacks the ability to easily resize themselves on the go? I'm a relatively new Unity/C# coder and so haven't really dug into this myself, but I've often heard that arrays are hard to resize once defined, and pools seem to me like they rarely have a consistent size the way arrays seem to require, thus queues or lists seem better suited for them. The only fix I can think of is making the array way bigger than you'll ever need, which seems like a waste of memory to me. Anything I might not be aware of?
@topsjohnny8131
@topsjohnny8131 5 жыл бұрын
santa!!! :D
@dvandamme00
@dvandamme00 5 жыл бұрын
one person turned the video off after a 1min becuase they didn't understand 'lets look at a bad example'
@maxbernasch2266
@maxbernasch2266 5 жыл бұрын
May I ask how old you are?
@maxbernasch2266
@maxbernasch2266 5 жыл бұрын
Not rude or something.
@SunnyApples
@SunnyApples 5 жыл бұрын
I can't wait for ECS, we will no longer have to do all of this stuff.
@EqualToBen
@EqualToBen 5 жыл бұрын
lol
@Ziplock9000
@Ziplock9000 5 жыл бұрын
Its a lot more abstract than monobehaviours, at last at the moment. So beginners gonna have issues
@xaxababa6616
@xaxababa6616 4 жыл бұрын
Fuck I miss that beard
How to use Singletons in Unity3D without breaking everything...
25:34
Creating Objects in Unity3D using the Factory Pattern
17:54
Jason Weimann
Рет қаралды 97 М.
а ты любишь париться?
00:41
KATYA KLON LIFE
Рет қаралды 3,6 МЛН
Glow Stick Secret Pt.4 😱 #shorts
00:35
Mr DegrEE
Рет қаралды 11 МЛН
How to use the Decorator Pattern (Card Game Example)
14:55
git-amend
Рет қаралды 7 М.
Code Smells - 'Switches' in Unity3d / C# Architecture
25:21
Jason Weimann
Рет қаралды 78 М.
Fast & Efficient Spawning with Object Pooling - Unity and C#
11:23
One Wheel Studio
Рет қаралды 23 М.
10 Steps I use to Design and Code Big Game Systems in Unity3D
30:14
Jason Weimann
Рет қаралды 70 М.
Unity async / await: Coroutine's Hot Sister [C# & Unity]
16:18
Bob Nystrom - Is There More to Game Architecture than ECS?
23:06
Roguelike Celebration
Рет қаралды 200 М.
The Power of Scriptable Objects as Middle-Men
17:41
samyam
Рет қаралды 124 М.
Unity Game Dev - Why I Wrote My Own Object Pool Manager
16:57
Midnite Oil Software LLC
Рет қаралды 1,2 М.
I LOST My Candy!!! 😨🍭 #candy #asmr #trendytreats #tjmaxx  #mukbang
0:39
At the end of the video, deadpool did this #harleyquinn #deadpool3 #wolverin #shorts
0:15
Anastasyia Prichinina. Actress. Cosplayer.
Рет қаралды 1,8 МЛН
At the end of the video, deadpool did this #harleyquinn #deadpool3 #wolverin #shorts
0:15
Anastasyia Prichinina. Actress. Cosplayer.
Рет қаралды 1,8 МЛН