After redshirting in 2011, Williams appeared in nine games as Bryn Renner's backup as a redshirt freshman in 2012. He passed for 127 yards and a touchdown and also rushed for 186 yards with three touchdowns. Williams entered his sophomore season in 2013 as Renner's backup. After Renner suffered an injury that caused him to miss the rest of the season, Williams became the starter. Against Old Dominion, he set the school record for total yards in a game with 469. In total he appeared in 12 games with six starts, completing 126 of 217 passes for 1,698 yards, 15 touchdowns and six interceptions. He also led the team in rushing yards with 536, becoming the first quarterback to lead North Carolina in rushing since Gayle Bomar in 1968. Williams entered his junior season in 2014 as the starter. He passed for 3,068 yards with 21 passing touchdowns and added 13 rushing touchdowns. Williams returned as a starter and team captain his senior year in 2015, leading the Tar Heels to the ACC Coastal Division title and the ACC Championship Game. Over the course of the season, Williams passed for 3,072 yards and 24 passing touchdowns while recording 13 rushing touchdowns. Against Duke University, Williams had a historic performance. He threw for 494 passing yards, a school record passing yards, threw for four touchdowns, and rushed for another touchdown.
Williams was signed by the Green Bay Packers on May 26, 2016. On September 3, 2016, he was released by the Packers during final team cuts.
Saskatchewan Roughriders
In May 2017, Williams signed as a rookie free agent with the Saskatchewan Roughriders of the Canadian Football League. Throughout the two-game preseason, Williams completed 10 passes out of 12 attempts, for 115 yards, and one interception. Williams made the Roughriders roster as the third quarterback on June 17, beating out Vince Young who, like Williams, had also played for the Green Bay Packers during a preseason. Williams also beat out Bryan Bennett for the job. In May 2018, Williams took reps against the Edmonton Eskimos in the opening preseason game of the 2018 CFL season, completing 3 of his 7 pass attempts for 32 yards and an interception. On May 28, 2018, Williams and three other players were released by the Roughriders the day after their 35–12 preseason loss to the Eskimos.
In the inaugural AAF QB Draft, the San Antonio Commanders used their second-round pick on Williams, who had initially been allocated to the Atlanta Legends. He was primarily used as a change-of-pace backup, earning a handful of plays but filling in well whenever starter Logan Woodside was benched or injured. Williams completed over 70% of his passing attempts, including a touchdown and a two-point conversion, and rushed for nearly six yards per carry. The league ceased operations in April 2019.
In October 2019, Williams was drafted by the New York Guardians in the tenth round of the 2020 XFL Draft. Williams was active for all 5 games in the COVID-19 shortened season, seeing snaps in 3 of them. Williams' completed 23 out of 48 passes in relief work, as well as being used as a situational rusher with 5 carries for 29 yards and a touchdown. Another of Williams' runs gained 16 yards on a fake punt, converting the first down in opponent territory. He had his contract terminated when the league suspended operations on April 10, 2020.