I think having an NFT token format standard for games is a neat idea as a concept.
I do not think you should be enforcing as much as you are - like a version. The version could just be an attribute described in the external JSON format if it is needed. Could be byte 0 inside the a uint256/bytes32.
Perhaps attributes can be packed outside of Solidity, described in the JSON format, into a single uint256 or bytes32 in alignment with EVM word size.
Not sure why setting or getting attributes needs more than the token ID - like a player id.
ERC721 tokens usually have a map of token ID to Address, given an ID you can find the owner.
Also, ERC721 implements a tokenURI method. You might want a method dedicated to replying back with the JSON URL to describe your attributes, similar methodology?