Borderlands 2 Classes Ranked from Worst to Best (2023)

");$( "#content-area" ).prepend($addFlag);} }// This function handles animation for the new ToC, which currently includes:// 1. Fading the ToC in and out to prevent it from covering up the Info section in the footer ; function handleTocAnim( $tocBox, winHeight, docHeight, scrollTop ) { // We're going to check if we're near the bottom for an animation to hide the ToC so we don't // cover up the Info section in the footer var bottomBuffer = 384; //px var isNearBottom = scrollTop + winHeight > docHeight - bottomBuffer; // Fetch the value for the animFlag key var tocAnimating = $tocBox.data( "animFlag" ); // If ToC has been hidden by the fade anim, display will be 'none' when // finished animating var tocHidden = $tocBox.css( 'display' ) === 'none'; if( isNearBottom ) { // If we're near the bottom, and the ToC is not animating // and not hidden, then hide it if( !tocAnimating && !tocHidden ) { $tocBox.data( "animFlag", true ) $tocBox.fadeOut( 400, function() { $tocBox.data( "animFlag", false ); }); } } else { // If we're not near the bottom, and the ToC is not animating // and hidden, then unhide it if( !tocAnimating && tocHidden ) { $tocBox.data( "animFlag", true ); $tocBox.fadeIn( 400, function() { $tocBox.data( "animFlag", false ); }); } } }// Calculate the available height for the ToC Box ; function calcAvailableHeight( height ) {return height * 80.0 / 100.0;}// This function resizes specific page elements, depending on // window size and whether the ToC is present, to keep things // consistent.// The boolean debug arg enables verbose logging. ; function handleReflow( $, winOuterWidth, winInnerHeight, debug ) {if( debug ) {console.log( "Checking if page layout should be reflowed..." );}// We want to reflow the layout whether or not we have the TOC, // with the hasTOC bool as a flag for if it exists on the pagevar tocFlag = $("#content-side");var hasToC = true; // FORCE HAS TOC, DEPLOYING SITEWIDE -supersoup// Check number of H2 elements. If <= 3, early returnvar numH2 = $("h2");if( numH2.length <= 3 ) {return;}// Cache varsvar $mainContainer = $("#main-content");var $logoContainer = $(".hgg-logo-space");var $navContainer = $(".hgg-menu-icon");var $contentArea = $("#content-area");// Null-check variablesvar anyNull = $mainContainer.length && $logoContainer.length && $navContainer.length && $contentArea.length;if( !($mainContainer.length) && debug ) {console.log( "$mainContainer null in reflowLayout..." );}if( !($logoContainer.length) && debug ) {console.log( "$logoContainer null in reflowLayout..." );}if( !($navContainer.length) && debug ) {console.log( "$navContainer null in reflowLayout...")}if( !($contentArea.length) && debug ) {console.log( "$contentArea null in reflowLayout..." );} if( debug ) {console.log( "anyNull: " + anyNull );console.log( "hasTOC: " + hasToC );}if( hasToC ) {// The previous process for initializing offsetTopForView didn't play well when// refreshing the page while partially down the post, switching to pulling the // main-header height for consistency -supersoupvar offsetTopForView = $("#main-header").height() ; //pxvar $toc = $( ".toc-box" );if( $toc.length > 0 ) {var availableHeight = calcAvailableHeight( winInnerHeight - offsetTopForView );if( debug ) {console.log( "window.innerHeight: " + winInnerHeight );console.log( "availableHeight: " + availableHeight );console.log( "toc[0].scrollHeight: " + $toc[0].scrollHeight );console.log( "toc.height(): " + $toc.height() );}if( $toc.outerHeight() > availableHeight ) {$toc.css( 'height', availableHeight );if( debug ) {console.log( "Setting ToC height to ", availableHeight );}} else {var newHeight = availableHeight < $toc[0].scrollHeight ? availableHeight : $toc[0].scrollHeight;$toc.css( 'height', newHeight );if( debug ) {console.log( "Setting ToC height to ", newHeight );}}/*// Update largest sizevar maxSize = $toc.data( "maxSize" );var outerHeight = $toc.outerHeight;if( maxSize === 0 || maxSize == undefined || maxSize == NaN || maxSize < cssHeight ) {$toc.data( "maxSize", $toc.outerHeight);console.log( "maxSize is now " + $toc.outerHeight );}*/if( $toc.height() < $toc[0].scrollHeight ) {$toc.css( 'overflow-x', 'hidden' );$toc.css( 'overflow-y', 'auto' );}else {$toc.css( 'overflow-x', 'hidden' );$toc.css( 'overflow-y', 'none' );}}if( winOuterWidth >= 1600 ) {$mainContainer.css( "margin-left", "15.95rem" );$logoContainer.css( "margin-left", "-6.1rem" );$navContainer.css( "margin-right", "-8.0rem" );} else if( winOuterWidth < 1600 && winOuterWidth >= 1440 ) {$mainContainer.css( "margin-left", "14.8rem" );$logoContainer.css( "margin-left", "-3.8rem" );$navContainer.css( "margin-right", "-3.8rem" );} else if( winOuterWidth < 1440 ) {// Clear applied CSS$mainContainer.css( "margin-left", "0" );$logoContainer.css( "margin-left", "0" );$navContainer.css( "margin-right", "0" );} else {if( debug ) {console.log( "Unhandled window width in reflowLayout() - With ToC" );}}} else {if( winOuterWidth >= 1600 ) {// Don't do anything yet on non-ToC pages} else if( winOuterWidth < 1600 && winOuterWidth >= 1440 ) {$contentArea.css( "margin-left", "0");} else if( winOuterWidth < 1440 ) {// Don't do anything yet on non-ToC pages} else {if( debug ) {console.log( "Unhandled window width in reflowLayout() - Without ToC" );}}} }// Handles reflowing content on the page depending on different variables; (function (window, $, undefined) {$.fn.reflowLayout = function() {// Should we enable verbose logging for debugging?// SHOULD NOT BE TRUE IN PRODUCTION! -supersoupvar debug = false;handleReflow( $, window.outerWidth, window.innerHeight, debug );$(window).on( 'load', function () {handleReflow( $, window.outerWidth, window.innerHeight, debug );});// For reflowing when browser size changes$(window).on( 'resize', function () {handleReflow( $, window.outerWidth, window.innerHeight, debug );});/*$(window).on( 'scroll', function () {var $toc = $( ".toc-box" );if( $toc.length === 0 )return;console.log( "availableHeight: " + calcAvailableHeight( window.innerHeight ) );console.log( "toc[0].scrollHeight: " + $toc[0].scrollHeight );console.log( "toc.outerHeight(): " + $toc.outerHeight() );});*/};})(this, jQuery);// Transform guide content by visually organizing it into cards ; (function(window, $, undefined) { $.fn.cardify = function() { var $contentBody = $("#content-body"); if($contentBody === 0) { return; } var $contentBodyChildren = $contentBody.children(); var $h2s = $contentBody.children("h2"); console.log("H2 children of #content-body: " + $h2s.length); if($h2s.length === 0) { return; } for(var i = 0; i < $h2s.length; i++) { var $array = $contentBodyChildren.nextUntil("h2"); $array.each( function(index) { console.log("Element " + index + ": " + $(this).html()); }); // console.log("Card " + i + ":" + $contentBodyChildren.nextUntil("h2").html()); } } }(this, jQuery));// The main function for creating, populating, and managing the new ToC ; (function (window, $, undefined) { $.fn.createTOC = function (settings) {const MAX_MOBILE_WIDTH = 1438;// Before anything else, if this is a post in a Category that we // specifically want to force the ToC on, let's handle that// THIS IS NO LONGER NEEDED, as we're pushing ToC sitewide -supersoup// handleForceToC( $ );// For now, we only want to add the new ToC to manually flagged posts.// The post is flagged with the presence of a

// contained within the content of the post. Originally, this div was being used// to wrap the ToC, but I (supersoup) am going to move the ToC out to a new div.// So, the first thing we want to do is test for this div, early return if not // found, or remove it and recreate a #content-side div elsewhere if it is found.var tocFlag = $("#content-side");var hasToC = !(tocFlag.length === 0);// If #content-side element is foundif( hasToC ) {// Get rid of tosFlag #content-side elementtocFlag.remove();} // If on mobile, early return if( $(window).width() <= MAX_MOBILE_WIDTH ) {return; }// Check number of H2 elements. If <= 3, early returnvar numH2 = $("h2");if( numH2.length <= 3 ) {return;}// Recreate #content-side element in new locationvar $tocDiv = $("

");$( "#content-area" ).prepend($tocDiv); // Want it to be the first subdiv of #content-area// Proceed with .CreateTOC() var option = $.extend({ title: "hgg-toc", insert: "body", }, settings); var ACTIVE_CLASS = 'active'; var list = ["h2", "h3"]; var $headings = this.find(list.join(",")); var tocBox = document.createElement("ul"); var $tocBox = $(tocBox); tocBox.className = "toc-box"; var idList = []; $headings.map(function (i, head) { var nodeName = head.nodeName; var id = 'toc_' + i + '_' + nodeName; head.id = id; idList.push(id); var row = document.createElement("li"); row.className = 'toc-item toc-' + nodeName; var link = document.createElement('a'); link.innerText = head.innerText; link.className = 'toc-item-link'; link.href = '#' + id; row.appendChild(link); tocBox.appendChild(row); }); // Control the takeover of the highlighted elements var isTakeOverByClick = false; // Event delegate, add click ,Highlight the currently clicked item $tocBox.on("click", ".toc-item", function (ev) { // Set as true ,Represents the click event to take over the control of the highlighted element isTakeOverByClick = true; var $item = $(this); var $itemSiblings = $item.siblings(); $itemSiblings.removeClass(ACTIVE_CLASS); $item.addClass(ACTIVE_CLASS); }); var headBox = document.createElement("div"); headBox.className = "toc-titler"; headBox.innerHTML = option.title; var wrapBox = document.createElement("div"); wrapBox.className = "wrap-toc"; wrapBox.appendChild(headBox); wrapBox.appendChild(tocBox); var $insertBox = $(option.insert); var $helperBox = $("

"); $helperBox.append(wrapBox); $insertBox.prepend($helperBox); // The style of the storage container box var CACHE_WIDTH = $insertBox.css('width'); var CACHE_PADDING_TOP = $insertBox.css('paddingTop'); var CACHE_PADDING_RIGHT = $insertBox.css('paddingRight'); var CACHE_PADDING_BOTTOM = $insertBox.css('paddingBottom'); var CACHE_PADDING_LEFT = $insertBox.css('paddingLeft'); var CACHE_MARGIN_TOP = $insertBox.css('marginTop'); // var scrollTop = $('html,body').scrollTop(); // var offsetTop = $insertBox.offset().top; // var marginTop = parseInt($insertBox.css('marginTop')); // var offsetTopForView = offsetTop - scrollTop - marginTop; // For initialization on load$(window).on( 'load', function () {initTocAnimData( $insertBox );}); // Rolling ceiling $(window).scroll(function () {// If on mobile, early returnif( $(window).width() <= MAX_MOBILE_WIDTH ) {return;}// The previous process for initializing offsetTopForView didn't play well when// refreshing the page while partially down the post, switching to pulling the // main-header height for consistency -supersoupvar offsetTopForView = $(".hgg-top-nav").height() ; //px// IE6/7/8: // For pages without doctype declaration, document.body.scrollTop can be used to get the height of scrollTop; // For pages with doctype declaration, document.documentElement.scrollTop can be used;// Safari: // Safari is special, it has its own function to get scrollTop: window.pageYOffset;// Firefox: // Relatively standard browsers such as Firefox can save more worry, just use document.documentElement.scrollTop;var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop; // Scroll highlight // Only when the click event cancels the control of the highlighted element, the scroll event can have the control of the highlighted element !isTakeOverByClick && $.each(idList, function (index, id) { var $head = $('#' + id); var $item = $('[href="#' + id + '"]').parent(); var $itemSiblings = $item.siblings();var offsetBuffer = 64; // px, we want the class swap to trigger slightly before so we show an accurate active element// when zooming to a specific element var offsetTopHead = $head.offset().top - offsetBuffer; var isActived = $item.hasClass(ACTIVE_CLASS); if (scrollTop >= offsetTopHead) { $itemSiblings.removeClass(ACTIVE_CLASS); !isActived && $item.addClass(ACTIVE_CLASS); } else { $item.removeClass(ACTIVE_CLASS); } }); // Set to false, which means that the click event will cancel the control of the highlighted element isTakeOverByClick = false;// Handle animation for the ToChandleTocAnim( $insertBox, $(window).height(), $(document).height(), scrollTop );// Handle any changes to ToC CSS on scrollvar isFixed = $helperBox.css("position") === "fixed"; if (scrollTop >= offsetTopForView) {if (isFixed) return;$tocBox.css({overflow: 'auto',padding: 0,});$helperBox.css({position: 'fixed',top: CACHE_MARGIN_TOP,width: CACHE_WIDTH,paddingTop: CACHE_PADDING_TOP,paddingRight: CACHE_PADDING_RIGHT,paddingBottom: CACHE_PADDING_BOTTOM,paddingLeft: CACHE_PADDING_LEFT,backgroundColor: $tocBox.css('backgroundColor')});} else {if (!isFixed) return;$helperBox.css({position: 'static',padding: 0});$tocBox.css({overflow: 'auto',paddingTop: CACHE_PADDING_TOP,paddingRight: CACHE_PADDING_RIGHT,paddingBottom: CACHE_PADDING_BOTTOM,paddingLeft: CACHE_PADDING_LEFT,});} }); };}(this, jQuery));});

by Cody D. Campbell | Nov 13, 2020

Borderlands 2 Classes Ranked from Worst to Best (1)

Borderlands 3was released to rapturous reviews last year, but its predecessor from 2012 remains a fan favorite. To this day,Borderlands 2is the most unanimously beloved installation in Gearbox Software’s signature series. That’s why we put it at number one on our list ofBorderlandsgames ranked. It’s been repackaged and resold numerous times, adding new textures, skins, quests, and playable characters with each iteration.

New players are still joining the servers even though the game is over eight years old. This is partially due to the game’s inclusion inThe Handsome Collection,which combinesBorderlands 2, Borderlands: The Pre-Sequel,and all of their DLC in a single package. The collection has been free on nearly every gaming platform at one point or another and is regularly featured in big sales.

Another reason is simply that the game still holds up. The stark black lines and vibrant colors of its comic-like design work well with the bombastic chaos of the gameplay and gives the game a timeless feel. It feels just as good sniping Psychos and battling Badasses today as it did when we still thought the Mayan apocalypse would end us all.

One of the most important decisions you make in the game happens right in the beginning, when you have to choose a character and their associated class. “So,” some of you newcomers may be wondering, “who is the bestBorderlands 2character?”

Well, friends, we’ve put together a ranking of theBorderlands 2character classes to answer that question once and for all!

The Best Borderlands 2Classes Ranked

There are a couple of quick qualifiers we want to get out of the way before we figure out what is the best character in Borderlands 2.

Firstly,BL2is an incredibly well-balanced game. Every character has unique abilities that favor certain use cases, and none of them are necessarily weak or bad. Don’t be discouraged if your favorite character ranks lower than you expected — it probably just means they’re a bit more niche than the others.

Secondly, this list will be including both DLC characters on top of the original four. These characters are included inThe Handsome Collectionbut may need to be purchased separately if you have the vanilla version of the game.

Thirdly, it’s important to keep in mind that each character hasthree different upgrade trees. You won’t be able to max out all three, so your results may vary depending on how you use your upgrade points and which abilities you end up with.

Are you ready to take on Handsome Jack? Here’s our list ofBorderlands 2best classes ranked!

6. Psycho

The best Borderlands 2 class for chaos

Borderlands 2 Classes Ranked from Worst to Best (2)

Krieg was the last character to be added to theBorderlands 2roster back in March 2013. The Psycho has an ability called Buzz Axe Rampage that makes him go into a fit of rage, exchanging his guns for a giant, two-handed axe that deals 500% melee damage and has a self-heal on every kill.

The Psycho is kind of the wildcard of the group of Borderlands 2 classes ranked (which is really saying something in this game). You can make him grow into a Mutant Badass Psycho and smash his enemies with brutal melee attacks, focus on weapons and grenades, or light yourself on fire to deal extra fire damage while you run screaming through the battlefield. This makes him a lot of fun to play, but tactically difficult to place. Being locked into a melee build can prompt a lot of challenges.

Krieg’s Bloodlust tree focuses on kill skills and bloodlust stacks, his Mania tree on melee, and his Hellborn tree on upgrading fire damage.

5. Assassin

The best Borderlands 2 class for veterans

Borderlands 2 Classes Ranked from Worst to Best (3)

I wouldn’t recommend most new players use Zer0 on their first (or even their second)Borderlands 2playthrough. That isn’t to say he’s not worth playing, he’s just difficult to use and doesn’t get really good until his best abilities are unlocked fairly late into the game.

The Assassin is best suited to melee combat and sniper rifles. So much of the game comes down to battling waves of mid-range enemies, though, which is partially why we hesitate to recommend him. His health is also lower than most of the other characters’.

That said, Zer0 has some of the best endgame abilities and is much more useful when paired with a tank like Salvador, Axton, or Gaige. His special ability, Decapitati0n, allows you to create a hologram as a distraction while Zer0 himself turns invisible.

When upgrading, you can pursue the Bloodshed tree for melee skills, Cunning for utilities and damage effects, and Sniping for… well, sniping.

4. Siren

The best Borderlands 2 class for team players

Borderlands 2 Classes Ranked from Worst to Best (4)

Maya is the Siren, which is the closest thingBorderlands 2has to a support/healer class. Her Phaselock special ability creates a stasis bubble, which starts as a simple midair suspension and evolves to become a damage-dealing force cage.

When playing a Siren, your core strategy pretty much revolves around this special ability. Phaselock has the lowest cooldown of all class special abilities, and it’s great for crowd control. Solo players can have a lot of fun as Maya, but you won’t experience her full utility unless you venture into multiplayer. Check out this “nurse build” if you want to see the best way to play her for support.

You can pursue Maya’s Cataclysm tree for upgrading damage types, her Harmony tree for building up defense and health, and her Motion tree to make Phaselock more of a defensive ability.

3. Commando

The best Borderlands 2 class for beginners

Borderlands 2 Classes Ranked from Worst to Best (5)

What is the bestBorderlands 2character for beginners?

If you want to swap, reload, and shoot faster using any gun in the game, Axton’s your guy. Axton is the most well-rounded character in the game, and we consider him to be among theBorderlands 2best character for solo play. He’s also the best character for beginners who may not know their preferred playstyle, as many of his abilities upgrade the basic mechanics of the game.

His Sabre Turret ability is useful in almost any situation. You simply drop a turret, and it starts firing at the nearest enemy. This is especially useful when you’re playing by yourself since you can use the turret to draw the aggro of enemy crowds while you shoot from the sidelines and regain your shields.

Axton’s Guerilla tree improves basic combat and weapons, his Gunpowder tree upgrades long-range combat, and his Survival tree enhances his defense.

2. Mechromancer

The best Borderlands 2 class for bosses

Borderlands 2 Classes Ranked from Worst to Best (6)

Gaige is the other DLC character on this list. Do you like giant robots and explosions? Well, I’ve got good news. Gaige’s special ability, “Death Trap,” allows her to summon a massive-floating-killer-robot of the same name. Like Axton’s turret, Death Trap is also useful for drawing enemy fire.

A lot of the Mechromancer’s abilities are shock damage-based. This can be a little bit of a mixed bag. Shock is 50% more useful against enemy shields, but it suffers a 10% penalty against flesh. It’s also useless against zombies, andTankensteinsare actually healed by it.

The real reason we ranked Gaige so high is her Anarchy stacks. Anarchy goes up with every kill and every empty clip. Each stack grants a 1.75% attack damage increase and a 1.75% accuracy decrease, with a possible max of 400 stacks. Pairing this ability with a shotgun at close range makes her the ideal character for dealing with bosses. After all, accuracy doesn’t matter point-blank.

Her Best Friends Forever tree upgrades longevity, her Little Big Trouble tree adds shock, and her Ordered Chaos tree deals with damage, health, and shield upgrades.

1. Gunzerker

The best Borderlands 2 class overall

Borderlands 2 Classes Ranked from Worst to Best (7)

Guns, guns, and more guns! Salvador is our pick for the bestBorderlands 2character classes ranked, which will come as no surprise to anyone who’s played him. Gunzerking allows him to wield any two guns simultaneously, but the main reason he takes our number one spot is a popular hack that utilizes this special ability.

Certain guns inBorderlands 2can heal the player while they do damage. TheGrog Nozzleis a particularly effective one that not only heals you for 65% of the damage it deals, but also slags enemies (which forces them to take additional damage). Using these features in conjunction with another, more powerful gun like theUnkempt Haroldmakes Salvador virtually unkillable while dealing massive amounts of damage. This technique is so broken that you can pretty much muscle your way through the whole game with it.

The Brawn tree builds up the Gunzerker’s physical toughness, the Gun Lust tree makes his weapons stronger, and the Rampage tree adds stat bonuses to Gunzerking.

Borderlands 2 Classes Ranked from Worst to Best (8)

Good Luck, Vault Hunters!

We hope you’ve enjoyed our list of the bestBorderlands 2classes ranked. Now go show Jack who’s boss!

Happy gaming!

Related Reading

  • Best Borderlands Games Ranked
  • Best PS Now Games
  • Top Stadia Games
  • Best Split-Screen Co-Op Games
  • Best Looter Shooters
" );})(jQuery);});

Submit a Comment

Top Articles
Latest Posts
Article information

Author: The Hon. Margery Christiansen

Last Updated: 02/26/2023

Views: 5904

Rating: 5 / 5 (50 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: The Hon. Margery Christiansen

Birthday: 2000-07-07

Address: 5050 Breitenberg Knoll, New Robert, MI 45409

Phone: +2556892639372

Job: Investor Mining Engineer

Hobby: Sketching, Cosplaying, Glassblowing, Genealogy, Crocheting, Archery, Skateboarding

Introduction: My name is The Hon. Margery Christiansen, I am a bright, adorable, precious, inexpensive, gorgeous, comfortable, happy person who loves writing and wants to share my knowledge and understanding with you.