You’ve made an error in your implementation of Fisher-Yates. As written, you have a biased shuffle–you’ll get certain results more often than others. You want to change
r = Random.Range(0,tempList.Count);
to
r = Random.Range(i,tempList.Count);
So that once you’ve chosen a random element for the first position, it will stay there and not get swapped again while you are randomizing the rest of the list.
This is a common mistake. IIRC Unity even made this exact mistake in their own docs. (I reported it when I noticed, but I haven’t checked back to see if they fixed it.)
It may be hard to see why this would matter, but if you run some tests (shuffle the same original list a bunch of times, and count up how often each element ends up in each position) you’ll see that it does matter.
As a minor optimization, you could end your loop one iteration earlier, since once you’re down to the last element there’s only one choice left for what to put there. (In other words, shuffling a list of size 1 doesn’t require you to do anything.)
Also, I notice your function creates a copy of the list, shuffles the copy, and returns the copy. I’d say it’s more useful to have a function that shuffles a list in-place, without copying anything. If the caller wants to preserve the original, they can easily make a copy themselves before calling your function. But often, you don’t need the original anymore, in which case you’d rather not have to pay for the copy operation.