Weapon Switching - Unity Tutorial

Поделиться
HTML-код
  • Опубликовано: 18 янв 2025

Комментарии • 594

  • @talha9585
    @talha9585 7 лет назад +507

    These small but useful tutorials are best to watch.

    • @talha9585
      @talha9585 7 лет назад +10

      also, i would like to see switch animation

    • @coolboidoesstuff9828
      @coolboidoesstuff9828 5 лет назад +4

      @@talha9585 It is really not so hard, you can search up how to do it
      Edit: Never mind, it's harder than I thought

    • @dmudda90
      @dmudda90 5 лет назад +1

      @@coolboidoesstuff9828 no making games is much easier than you think! .. :D

    • @coolboidoesstuff9828
      @coolboidoesstuff9828 5 лет назад

      @@dmudda90 No I was talking about him asking for switching animation

    • @norriswu213
      @norriswu213 5 лет назад

      @@dmudda90 "You should take this course on Udemy"

  • @chantendo2941
    @chantendo2941 7 лет назад +140

    your tutorials are super helpful!

  • @Jamesthe1
    @Jamesthe1 7 лет назад +33

    You could also use modulo (aka the % operator) for the upward weapon switch. It would look like this:
    selectedWeapon++;
    selectedWeapon %= transform.childCount;
    If you don't know what modulo is, it basically gets the remainder from the division statement. You don't have to write a bunch of if statements that way. This saves a few lines and is actually quite efficient.

  • @dexister6959
    @dexister6959 7 лет назад +18

    Your newest tutorials are so professional I can't imagine how long it takes to make a 2 minute video for you...

  • @zevac
    @zevac 7 лет назад +23

    you're helping me create a universe, brackeys. i love you

  • @bisharakhuri2504
    @bisharakhuri2504 5 лет назад +343

    Tutorial unclear.. Accidentally created CS:GO

    • @BredMan_
      @BredMan_ 4 года назад +5

      lol

    • @sillyfella2009
      @sillyfella2009 4 года назад +35

      I hate it when that happens

    • @KlutzOfAMan
      @KlutzOfAMan 4 года назад +29

      Task Failed Successfully

    • @ShyGus
      @ShyGus 4 года назад +7

      That's litterally how good these tutorials are😂😂

    • @Mikelica69
      @Mikelica69 4 года назад +1

      @@KlutzOfAMan XD

  • @SuperRalle123
    @SuperRalle123 7 лет назад +15

    As always, these small tutorials are really great! I would love to see one about animations :)

  • @light6602
    @light6602 7 лет назад +7

    Definitely should continue these smaller videos Brackeys!! Love them! I saw someone request an ammo system and I think that would be awesome! Along with a ui of course.

  • @Cyreides
    @Cyreides 7 лет назад +10

    I was going to need something similar like this for switching characters in my game, and this is perfect!

  • @OilRacki
    @OilRacki 7 лет назад +1

    Funny enough, I think I did 80% of this video on my own before seeing this. I think it just makes a lot of sense to do the way described here. It is good confirmation that I'd done things in a good way.
    There was one thing I did differently though.. I didn't have a "weapon holder" object, and just simply reference children below it, but I think that's just because of my game design. I have more weapons as children than the player can use, so I have something else to manage the weapons they're carrying and have armed. All in all, though, this is a great tutorial, and the method described here about the weapon holder is actually a really good idea. Thumbs up!

  • @deraidos45
    @deraidos45 7 лет назад +2

    Very helpful as always. Been watching you since the first Survival Game tutorial

  • @TheReal-Infinite
    @TheReal-Infinite 7 лет назад +17

    i'd love to see a continuation of the Multiplayer FPS Shooter with a Single Player Part of the Shooter

  • @obsidian295
    @obsidian295 7 лет назад +1

    Been following Brackeys since survival game, awesome channel !

  • @theodorescontras5569
    @theodorescontras5569 7 лет назад +2

    Great tutorial, got weapon switching working in my game before even having my coffee.

  • @renzocfn4669
    @renzocfn4669 3 года назад

    Best coding tutorial channel I've ever seen in this world!

  • @Gathrey
    @Gathrey 7 лет назад +1

    Thanx Brackeys. Good efficient tutorial. Exactly what I was looking for. Keep it up! Looking forward to future tutorials.

  • @faisalsajjad7396
    @faisalsajjad7396 7 лет назад +4

    thx brackeys loving this series

  • @david35k
    @david35k 5 лет назад +1

    Thank you! I really like your simple and clean tutorials! Very helpful

  • @ppnhzk
    @ppnhzk 7 лет назад +4

    Nice tutorial as always. As I want to free up memory as much as I can, I do the switch by instantiating the weapon at a placed spawn point every time it is selected. Also, I store all the functions in the weapon object, even key presses like fire. It was easier because of the differences in their behaviour. After watching your tutorial however I might go with your method as it seems much more fluid in the end, though it might get heavy with 10+ weapons, so some testing might be needed. Not sure how much extra load the inactive stuff means.

  • @КолянКоляныч-б1ь
    @КолянКоляныч-б1ь 7 лет назад +16

    How to make a weapon appear when you pick it up and not just a full set of weapons? Good lessons, thank you.

    • @chaosmastermind
      @chaosmastermind 4 года назад +1

      You would set the weapons all to inactive and then make a power up collectible that activates only one type of weapon for each.

    • @ThatRazzy
      @ThatRazzy 3 года назад

      Hey were you able to figure this out?

  • @xiaobodong726
    @xiaobodong726 5 лет назад +1

    Love your model, it’s so detailed

  • @artinmajidi1654
    @artinmajidi1654 4 года назад +4

    I had two animator components on my player, one for upper body and one for lower body. I made different controllers for each weapon and if that weapon is equipped, I simply switch animator controllers. Like this, I can do everything infinitely. And also, this took me a month to figure out. And another to do it.

  • @vanthele5623
    @vanthele5623 8 месяцев назад

    Thank you. The script is straightforward to understand

  • @alimirbagheri453
    @alimirbagheri453 3 года назад

    You are just so awesome. words cant describe how you help. thank you brackey,s i miss you a lot. and hope that you are living your dream wherever you are.

  • @AshratAR
    @AshratAR 7 лет назад

    I thought the whole process was much more difficult than this!! But this tutorial made it all simple!!!! Thanks!!

  • @WeaverKnight777
    @WeaverKnight777 7 лет назад +209

    can we make an animation for weapon switching

    • @flashgames1273
      @flashgames1273 7 лет назад +18

      also shooting/aiming animations!

    • @davidenale17
      @davidenale17 7 лет назад +5

      Saad Tv yes will be nice to see it (and check if i'm doing it correctly)

    • @solomonlyons10
      @solomonlyons10 7 лет назад +11

      Saad Tv It's really really simple, I think a few really good videos on RUclips goes over it. I feel like the only challenging part for a lot of people is the mecanim portion.

    • @JayAnAm
      @JayAnAm 7 лет назад +8

      Actually it isn't that hard, will put it to my list.

    • @remove6796
      @remove6796 7 лет назад +2

      switching with animations are easy you just need to make a default state anim and then make a sound fx play on awake and walla. you didn't understand did you? :(

  • @chaosmastermind
    @chaosmastermind 4 года назад

    This is really useful and helpful. Thank you.
    Pretty much everyone that makes an FPS is going to need this.

  • @magnusm4
    @magnusm4 7 лет назад +3

    Simple, short and easy as it should be for programming

  • @lockedonbiome
    @lockedonbiome 7 лет назад +56

    Could you do a tutorial on enemy ai with shooting

    • @BlackMesaEmployee
      @BlackMesaEmployee 6 лет назад +10

      Boss Hog306 do you still need that tutorial? I’m considering making one

    • @sconosciutosconosciuto2196
      @sconosciutosconosciuto2196 6 лет назад +2

      @@BlackMesaEmployee you don't make video :(

    • @anshivvv.vfx99
      @anshivvv.vfx99 4 года назад +3

      @@sconosciutosconosciuto2196 he said he was considering. Duh?

    • @theasin_old
      @theasin_old 3 года назад

      @@BlackMesaEmployee please

    • @ranger10301
      @ranger10301 3 года назад

      @@BlackMesaEmployee do it

  • @RegenerationOfficial
    @RegenerationOfficial 4 года назад +1

    One of the most reused scripts Ive ever needed.

  • @woofiewill
    @woofiewill 7 лет назад +2

    When you want to restrict an index to a range of numbers (like wrapping the index back to 0 when incrementing) it's almost always better practice to use modulus. Write `selectedWeapon = (selectedWeapon + 1) % transform.childCount` instead. This is a slight performance increase over using an if statement, and it's much more succinct.
    Even better would be this (I'll use some slight pseudocode):
    if (scrollUp) selectedWeapon++;
    else if (scrollDown) selectedWeapon--;
    selectedWeapon = selectedWeapon % transform.childCount;
    This way it's much simpler and you only need to apply modulus once to make sure the variable stays in your desired range.

  • @Oliver_TGB
    @Oliver_TGB 7 лет назад +5

    Really cool! I have an idea. How about you made a tutorial on how to make an ammo amount. In sense of being able to see how many bullets you can fire before there are none left and possibly a reloading animation.

  • @mrsparklepants5636
    @mrsparklepants5636 7 лет назад

    HE MADE IT ATLAST I LOVE YOU BRACKEYS YOU ARE THE

  • @DavidAdochiti
    @DavidAdochiti 3 года назад +1

    we miss u brackeys! come back plzzz

    • @thelightningfurycore3901
      @thelightningfurycore3901 3 года назад

      I don't think he ever will. He is leaving youtube, forever (or is he?) But there is a chance that he will come back

  • @aaravagrawal8799
    @aaravagrawal8799 3 года назад

    Brackeys is so underrated

  • @numadeveloper
    @numadeveloper 6 дней назад

    3:17 Brackeys farting is the last thing I expected to hear today...

  • @yikes1910
    @yikes1910 7 лет назад +1

    been absolutely buzzing for this video since Wednesday

  • @TrifleWaffle
    @TrifleWaffle 7 лет назад +4

    thank you! I waited for this for so long!

  • @Random-uo8sp
    @Random-uo8sp 5 лет назад

    You have no right to be so good

  • @GoldenGamer26
    @GoldenGamer26 7 лет назад

    Best tutorial channel, why dislikes!?!

  • @seifmustafa2004
    @seifmustafa2004 7 лет назад +2

    your tutorials are super awesome 🙆

  • @systematicloop3215
    @systematicloop3215 7 лет назад +2

    In the foreach statement in the SelectWeapon method, you could have simply said SetActive(selectedWeapon == i) instead of routing it to separate if statements.

  • @craze52
    @craze52 7 лет назад

    You are one of the best youtuber for scripting and youtube

  • @AnuragJhaCreations
    @AnuragJhaCreations 7 лет назад

    i watched 1 video of yours and my mouse automatically went to subscribe this guy

  • @gametips7627
    @gametips7627 5 лет назад

    All the way first class tutorial. Love your tutorial

  • @emerickdorval3713
    @emerickdorval3713 3 года назад +1

    Barckeys you are my idole i like you so much i love your tutorials they teach me allot

  • @thevikaskandari
    @thevikaskandari 4 года назад

    Now that's called a awesome tutorial

  • @PandeyJiGames
    @PandeyJiGames 7 лет назад +2

    thnx a loot brackeys, awesome video again...

  • @doxel8691
    @doxel8691 7 лет назад

    wow! I didn't know the transform class implemented the IEnumerator interface that returned the children, good to know. thanks brackeys!

  • @justarandomguy9234
    @justarandomguy9234 7 лет назад +5

    that feeling when you realize you put all the player variables (like health) in the shoot script and now u must break it apart

    • @seraphimsarecoool
      @seraphimsarecoool 4 года назад

      lol thats pretty easy to remove and CTR+V to a new script lol its been 3yrd

    • @nuclearbomb9483
      @nuclearbomb9483 3 года назад +1

      @@seraphimsarecoool ctrl x

  • @FlyGuy8701
    @FlyGuy8701 7 лет назад

    I really like the new thumbnails.

  • @purpleguy9002
    @purpleguy9002 5 лет назад

    Thanks Brackeys! I love your videos!

  • @NakaLore
    @NakaLore 5 лет назад +1

    I used this for character swapping on my game. It is awesome!

    • @NakaLore
      @NakaLore 5 лет назад

      Ok, it works and it doesn’t work at the same time. The characters switch, but only at the position of the parent object. But I dunno how to make them appear at right position.

    • @icantth1nkofanam40
      @icantth1nkofanam40 4 года назад +1

      @@NakaLore make a script that changes their position?

  • @SuperManIsDope
    @SuperManIsDope 7 лет назад +3

    Love the new thumb nails !

  • @laurel8831
    @laurel8831 7 лет назад

    I love your thumbnails by the way

  • @JustKatoh
    @JustKatoh 7 лет назад +2

    Thank you for the video, i have learned a lot

  • @NachoMan154
    @NachoMan154 2 года назад +1

    4:15 you could write that in one line: weapon.gameobject.SetActive(i == selectedWeapon);(instead of lines 22-25) should also be faster!

  • @mlgsquirrel
    @mlgsquirrel 4 года назад

    i used this for switching attachments, but instead of scroll wheel its a button. great video man

  • @drimihq7724
    @drimihq7724 4 года назад +10

    H,i I just started with Unity and C# last week and your videos are really helping me. I was wondering whether you could use a for loop instead of having to copy paste the "if statements" and whether it's beneficial (Timestamp 9:00) I used an array for the keycodes like this private UnityEngine.KeyCode[] Keycodes = {KeyCode.Alpha1, KeyCode.Alpha2, KeyCode.Alpha3, KeyCode.Alpha4, KeyCode.Alpha5, KeyCode.Alpha6, KeyCode.Alpha7, KeyCode.Alpha8,
    KeyCode.Alpha9, KeyCode.Alpha0};
    and then I used a for loop and it works fine
    for (int i = 0; i

    • @Viski982
      @Viski982 2 года назад

      Thanks man.

    • @ЄвгенГавриловський
      @ЄвгенГавриловський Год назад

      Thank you, I tried it and it really worked and this code is not massive. However, I should specify that in my case it worked when I declared in "Update" method KeyCode array without "private" together with loop between "if" statements for mouse scroll wheel switching and
      if (previousWeapon != selectedWeapon).

  • @Kanal994
    @Kanal994 7 лет назад +2

    Great tutorials. Cheers !

  • @ildarildar1546
    @ildarildar1546 6 лет назад +1

    thank you Brackeys you rea
    lly helped me

  • @magnusm4
    @magnusm4 7 лет назад

    I like this way of making weapons best as it allows me to make each individual gun unique and not have to include every single stat on a single constructor file as some guns might be fired once or be selected as an ability so fire rate would be useless. Though i'm planning on having more than 30 or even 60 different weapons

  • @lucasgamesfr6s5
    @lucasgamesfr6s5 3 года назад

    i really love the idea of pay what you want or grab it for free. I'm very sorry that i can't afford to support the model developpers but i'm grateful i can still use their creations

  • @Notchmods
    @Notchmods 6 лет назад

    Thanks a lot sensei brackeys

  • @tatepayton7368
    @tatepayton7368 2 года назад

    Very helpful for both 2D and 3D

  • @LLITALKER
    @LLITALKER 7 лет назад

    Ingeniously and simply !!!

  • @alphachicken3225
    @alphachicken3225 7 лет назад +7

    Brackeys please do a tutorial (or tutorials) on 2D procedural generation with blocks, similar to Terraria or Starbound.

    • @lordofpenutbutter
      @lordofpenutbutter 2 года назад

      i think theres a tutorial about that on Sebastian league's channel

  • @bransoncostin2070
    @bransoncostin2070 2 года назад

    Thank you so much this helps me in my farming game!

  • @hiddeloman1967
    @hiddeloman1967 7 лет назад

    Do you have a new thumbnail style or is it just for this type of video's? The look really cool!!!

  • @Hasnain1F
    @Hasnain1F 5 лет назад +1

    I am not even a Game Developer. Full-stack web developer instead but I love watching these videos! Why don't you make a game development course on Udemy? I am sure you will sell tons of it!!

    • @Incognitus30
      @Incognitus30 5 лет назад

      Because, as stated in his description "All content by Brackeys is 100% free. I believe that education should be available for everyone. Any support is truly appreciated so I can keep on making the content free of charge."
      Making a payed course on Udemy would pretty much make him a full on hypocrite.

  • @mastai7624
    @mastai7624 6 лет назад

    You are m'y best teacher with you i Can understand

  • @lars-sorensen
    @lars-sorensen 7 лет назад +1

    Elsker disse simple tutorials!

  • @remysadventures-official8357
    @remysadventures-official8357 7 лет назад +1

    Cool man! Btw a local Splitscreen tut? Just asking

  • @LorcanG
    @LorcanG 4 года назад +6

    i added a transition to it so its not static
    using UnityEngine;
    using System.Collections;
    public class WeaponSwitching : MonoBehaviour
    {
    public int selectedWeapon = 0;
    public float WeaponSwitchSpeed = 5f;
    public Vector3 position1;
    public Vector3 position2;
    public GameObject weapon1;
    public GameObject weapon2;
    public GameObject weapon3;
    public bool Selected1;
    public bool Selected2;
    public bool Selected3;
    void Start()
    {
    StartCoroutine(SelectWeapon());
    }
    void Update()
    {
    int i = 0;
    int previousSelectedWeapon = selectedWeapon;
    if (Input.GetAxis("Mouse ScrollWheel") < 0f)
    {
    if (selectedWeapon >= transform.childCount - 1)
    selectedWeapon = 0;
    else
    selectedWeapon++;
    }
    if (Input.GetAxis("Mouse ScrollWheel") > 0f)
    {
    if (selectedWeapon = 2)
    {
    selectedWeapon = 1;
    }
    if (Input.GetKeyDown(KeyCode.Alpha3) && transform.childCount >= 3)
    {
    selectedWeapon = 2;
    }
    if (previousSelectedWeapon != selectedWeapon)
    {
    StartCoroutine(SelectWeapon());
    SelectWeapon();
    }

    #region Selection bools
    if (selectedWeapon == 0)
    {
    Selected1 = true;
    }
    else
    {
    Selected1 = false;
    }
    if (selectedWeapon == 1)
    {
    Selected2 = true;
    }
    else
    {
    Selected2 = false;
    }
    if (selectedWeapon == 2)
    {
    Selected3 = true;
    }
    else
    {
    Selected3 = false;
    }
    #endregion
    #region transitions
    if(Selected1 == true && weapon1.activeSelf == true)
    {
    weapon1.transform.localPosition = Vector3.Lerp(weapon1.transform.localPosition, position1, WeaponSwitchSpeed * Time.deltaTime);
    }
    else
    {
    weapon1.transform.localPosition = Vector3.Lerp(weapon1.transform.localPosition, position2, WeaponSwitchSpeed * Time.deltaTime);
    }
    if (Selected2 == true && weapon2.activeSelf == true)
    {
    weapon2.transform.localPosition = Vector3.Lerp(weapon2.transform.localPosition, position1, WeaponSwitchSpeed * Time.deltaTime);
    }
    else
    {
    weapon2.transform.localPosition = Vector3.Lerp(weapon2.transform.localPosition, position2, WeaponSwitchSpeed * Time.deltaTime);
    }
    if (Selected3 == true && weapon3.activeSelf == true)
    {
    weapon3.transform.localPosition = Vector3.Lerp(weapon3.transform.localPosition, position1, WeaponSwitchSpeed * Time.deltaTime);
    }
    else
    {
    weapon3.transform.localPosition = Vector3.Lerp(weapon3.transform.localPosition, position2, WeaponSwitchSpeed * Time.deltaTime);
    }
    #endregion
    }
    IEnumerator SelectWeapon()
    {
    yield return new WaitForSeconds(1f);
    int i = 0;
    foreach (Transform weapon in transform)
    {
    if (i == selectedWeapon)
    weapon.gameObject.SetActive(true);

    else
    weapon.gameObject.SetActive(false);
    i++;
    }
    }
    }

    • @LorcanG
      @LorcanG 4 года назад

      keep the position 1 at 0x 0y 0z and for position 2 x0.5 y-0.5 z-0.5 worked for me

    • @atomicalex1732
      @atomicalex1732 4 года назад +1

      bro thats awesome, thanks

    • @Markleap
      @Markleap 2 года назад

      my gun go in my head, how would i fix?

    • @LorcanG
      @LorcanG 2 года назад

      @@Markleap move the game object coordinates (the gun) forward

  • @jahangirakbar4524
    @jahangirakbar4524 7 лет назад +1

    your Channel is awesome! I am your Subscriber! Everything I need is Already Available on this Channel. Highly Recommended to Everyone!

  • @BenignoFilippo
    @BenignoFilippo 2 года назад

    Congrats!!! When did you first start investing

  • @blaizefar45
    @blaizefar45 7 лет назад

    Another Great Tutorial

  • @frostymug3123
    @frostymug3123 2 года назад

    Great tutorial thank you!

  • @DeaMikan
    @DeaMikan 7 лет назад +1

    loved it! can you make a tutorial all about post processing effects on the camera!

  • @abluecherry7937
    @abluecherry7937 6 лет назад

    you could also make it so if the gun isn't in view the gun wont fire then you could make a cube that has all 3 guns attached to it and it spins a certain amount when you press a button

  • @eldubaroos
    @eldubaroos 4 года назад +2

    How bout a tutorial about aiming down sights?

  • @farrukhkamal2315
    @farrukhkamal2315 4 года назад +1

    Very good tutorial, helped me alot. Can you make a tutorial on how to add animations when switching weapons.Thanks again

  • @kaiser9321
    @kaiser9321 7 лет назад +3

    A better way for wrapping around would be using variable % number, I remember using it in another coding language but I'm not sure if it works in C#, get back to me on that, thanks

  • @ashwinanand4208
    @ashwinanand4208 7 лет назад +14

    can you connect this to the fps series please

  • @PikBo100
    @PikBo100 3 года назад +1

    wrote the code step by step like in video but when i run the game..all weapons are enabled when selectedweapon index is 0 and when is 1 all weapons are disabled(((

  • @EDemircivi
    @EDemircivi 7 лет назад +2

    Simple & effective, thank you for your tutorials. Keep it up, and don't mind your view counts, you're great :).

  • @NiteHawkk123
    @NiteHawkk123 6 лет назад

    Amazing tutorial!

  • @willmathonsi2286
    @willmathonsi2286 7 лет назад

    Another brilliant video Asbjørn. Any idea on how to do ammo switching?

  • @JoanToh
    @JoanToh 7 лет назад

    thanks for your generous sharing. :)

  • @chaosmastermind
    @chaosmastermind 4 года назад

    You do have to add the number keys code for each weapon you add though.
    You don't need to add it for the mouse wheel though.
    There are ways to make that automated, but it's better not to get into it for a beginner tutorial.

  • @kieran977
    @kieran977 7 лет назад

    re: 6:05. I think a better solution would be (in pseudocode) "selectedWeapon++; selectedWeapon = selectedWeapon % weaponList.length". And the same, but with "selectedWeapon--" for scrolling down. Same effect, but a lot cleaner IMO

  • @admiralhyperspace0015
    @admiralhyperspace0015 6 лет назад

    THANK YOU MAN.You r the best!!!!!!.

  • @yoyotvyoo
    @yoyotvyoo 7 лет назад +1

    simply dope

  • @andreig2946
    @andreig2946 7 лет назад +1

    Hey can you make a video about how to make a car moove? Great job on your videos man!

  • @cryora
    @cryora 5 лет назад +1

    So the foreach (Transform weapon in transform) line searches only children transform, not grandchildren?

  • @punisherioi
    @punisherioi 4 года назад +2

    Hello Brackeys, can you make a Weapon pick up tutorial please, like picking a weapon by pressing 'F' and and 'Q' to drop. To be simple, like COD weapon picking...(pick, drop, swap)... your videos are really amazing and easy to understand... thanks...

    • @ThatRazzy
      @ThatRazzy 3 года назад

      Hey did you figure this out? I'm trying to do the same thing :)

  • @we2000h
    @we2000h 6 лет назад

    You are a great guy !! Love you

  • @vwx1st
    @vwx1st Год назад +1

    i know its 6 years old but its almost at 10k likes we only need 8 more

  • @hackermub2598
    @hackermub2598 5 лет назад +1

    5:50 well we can easily do that by
    selectedWeapon++;
    selectedWeapon%=transform.childCount;
    That means whenever selectedWeapon gets to the limit.. it will be set to 0

  • @user-th8nx4cp7w
    @user-th8nx4cp7w 4 года назад

    For some people like me you might have this problem where when foreach the transform, it acess the transform on the WeaponSwitcher too, so when you use your scroll wheel and keep scrolling up, you could end up in a empty space where the player is holding nothing. To deal with that, I add - public Transform weaponSwitcher -, and under the foreach -if(weapon.transform.IsChildOf(weaponSwitcer)){//rest of the code}