I have spent many a frustrating hour working through some of the querks that come along with Unity3D. In particular, making Blender models work was something I had to figure out through trial and error because I could not find it online anywhere. The following Image shows the way you need to orient your model in blender to have the Z or Vector3.Forward in Unity work.

After the model is in this orientation in blender, Press "N" to show the transform panel. In the interface that shows up you will see the "Rotation" section. Set all the values to "0" and hit "CTRL+A" to apply the rotation. After that, you can save the .blend file and drop it straight into Unity3D. The Z vector will then be forward on the model, and your whole life will be better.
Leave a comment if this helped. Good luck.
Here's a problem I had to solve that I couldn't find anything on Google about: turning a given parent-child hierarchy upside-down.

I had a group of GameObjects, A, B, and C. They were parented in that order, A > B > C (A was the parent of B, which was the parent of C). I wanted to turn this structure upside-down, so that it looked like C > B > A. I came up with this recursive algorithm to do it, starting with C and walking up to the highest parent:

 private void becomeParent(Transform newParent) {
     if (transform.parent == null) {
         transform.parent = newParent;
         return; // already is the parent
     }
     transform.parent.GetComponent<MyObjectScript>().becomeParent(transform);
     transform.parent = newParent;
 }


When I executed it, the parent of C would change, but the parents of B and A would remain the same. I didn't get any error messages, but it wasn't doing what I wanted. I went through some iterations with the same result. Then I realized one thing:
You aren't allowed to assign the child of a Transform to be that Transform's parent.
So when I was telling A to set its parent to be B, it couldn't do it, because B was its child.
The solution was to disconnect the parent-child relationship first (by setting the parent to null):

 private void becomeParent(Transform newParent) {  
     if (transform.parent == null) {  
         transform.parent = newParent;  
         return; // already is the parent  
     }  
     // We have to disconnect ourselves first because you can't set a child as a parent  
     GameObject currentParent = transform.parent.gameObject;  
     transform.parent = null;  
     currentParent.GetComponent<MyObjectScript>().becomeParent(transform);  
     transform.parent = newParent;  
 }  

Works like a charm!