There’s a lot of really great things in the Asset Store. But there’s a lot of… not-so-great things too. And then there are some outright crappy things.
Unity have guidelines, but they’re a bit thin on the ground, and they’re not enforced very rigorously either. For example, I’m pretty sure I’ve bought packages from the store with JPG textures, or editor extensions that add company-named menus to the main menubar.
I think it might be interesting if we came up with a checklist of “things that must be true about an asset for it to qualify as good.” Ideally our checklist is something that the Asset Store team might adopt and integrate into their submission process (though not exclusively - sometimes a crappy, standards-violating package is better than no package), but if nothing else we could keep a community-maintained list of which packages are “certified awesome,” and it can function as a do-or-die list for package developers.
The checklist should also consist only of ‘testable’ criteria to as great an extent as possible - i.e. whether or not a package meets a particular criteria should not really be a matter of personal opinion. So “has good documentation” is no good, but “every public API method has an XMLDoc summary” is fine (if a bit on the strong side).
What would you put on the checklist?
Here’s the condensed form of the most interesting, non-subjective things from Unity’s submission guidelines, to start us off. I’ve strengthened some of their ‘you should do this’ into ‘you MUST do this’ in a couple of places, because either this stuff is worth doing or it isn’t, and if it is then people shouldn’t be allowed to skip it, and if it isn’t then it shouldn’t be on the list.
From my own experience, and input from some folks on Skype, here’s a few things to add/change to all that:
General:
- All files should be in one folder per compilation phase (which for most packages means: just one folder).
- Don’t include image effects purely for use in your sample scenes.
- Any documentation should be available outside of the package (e.g. on a website somewhere).
Art:
- All textures, unless they are GUI elements or intended to be atlased, should actually be power-of-two sizes. Don’t rely on the texture importer resizing them.
- All textures must have their texture type set correctly in the importer.
- Materials should not have ‘default’ names as generated by the modelling tool (e.g. no “Default #27” materials from 3DSMax models).
- All model vertices should be welded where appropriate.
- Models should come into Unity in the smallest number of separate objects appropriate - submeshes/multimaterials should be used instead of separate objects where possible.
- Models should not contain extra ‘bad’ data in the UV2/Color channels - i.e. no junk UVs getting left in by accident. (Using the UV2 channel for something other than lightmap UVs is fine, provided it’s deliberate and documented).
- Humanoid characters should have preconfigured Mecanim avatars.
Code:
- All Unityscript files must have #pragma strict turned on (except in Editor scripts).
- Components/prefabs in scenes should not be used for pure ‘data storage’ - ScriptableObject (or some other asset-based storage mechanism like XML files) should be used instead.
- All public types, properties, fields, and methods should be documented. If a symbol is not intended for package users, it should not be public.
- All types should be in namespaces.
Editor extensions:
- Read-only files must be handled correctly (code must respect the read-only flag and fail gracefully if needed files are readonly)
- Objects should never be marked as dirty when they have not actually changed.
What do you think? Are any of these unreasonable? What else would you add?