1. An @ before the variable's name means it's a class variable. An example would be an actor's name. The Game_Actor class represents the actor and the class variable @name is a string with his name.
2. attr_reader, attr_writer and attr_accessor are just what they are saying.
- attr_reader lets you read a class variable from "outside"
- attr_writer lets you write (that means change) a variable from "oustide"
- attr_accessor does like the two above together: read and write
3. the self. is actually accessing the class from "within" like it would be from the "outside". If you try self.name within the Game_Actor class, but there is no defined attr_reader :name or attr_accessor :name, it will give you the "Undefined method 'name' for class 'Game_Actor'"
Hope that helps.
EDIT:
BTW, the attr_reader is often used instead of an attr_accessor like for example he actor's HP. Then something called "encapsulation" is done instead and instead of just "writing" the actor's HP the given value for the actor's new current HP is first processed little bit, so the HP won't exceed the max HP and won't go lower than 0. Check out
def hp=(hp) in the Game_Actor class to see what I mean.