How about this:
Code
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{arrows,calc}
\newcommand{\unitvec}[3][->]% [options], start point, vector
{ \xdef\mysum{0}
\foreach \c in {#3}
{ \pgfmathsetmacro{\mysquare}{\mysum+pow(\c,2)}
\xdef\mysum{\mysquare}
}
\pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
\draw[#1] (#2) -- ($1/\myveclen*(#3)$);
}
\begin{document}
\begin{tikzpicture}
\draw[-latex] (0,0,0) -- (3,6,2);
\unitvec[-latex,red,thick]{0,0,0}{3,6,2}
\draw[->] (0,0,0) -- (-2,4,3);
\unitvec[->,blue,thick]{0,0,0}{-2,4,3}
\draw[-stealth] (0,0,0) -- (-1,-4,-1);
\unitvec[-stealth,green,thick]{0,0,0}{-1,-4,-1}
\end{tikzpicture}
\end{document}
Output

Edit 1: Here's a version with a new \Coordinate(<name>)(<vector>). To work it now needs \Unitvec, as \unitvec only works with direct numbers.
Code
\documentclass[parskip]{scrartcl}
\usepackage[margin=15mm]{geometry}
\usepackage{tikz}
\usetikzlibrary{arrows,calc}
\def\Coordinate(#1)(#2)% name, vector
{ \expandafter\xdef\csname#1\endcsname{#2}
\coordinate (#1) at (#2);
}
% for use with \Coordinates
\newcommand{\Unitvec}[3][->]% [options], start point, vector
{ \xdef\mysum{0}
\foreach \myconstant [count=\mycount] in #3
{ \pgfmathsetmacro{\mysquare}{\mysum+pow(\myconstant,2)}
\xdef\mysum{\mysquare}
}
\pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
\draw[#1] (#2) -- ($1/\myveclen*(#3)$);
}
%for use with direct numbers, e.g. \unitvec[-latex,red,thick]{0,0,0}{3,6,2}
\newcommand{\unitvec}[3][->]% [options], start point, vector
{ \xdef\mysum{0}
\foreach \c in {#3}
{ \pgfmathsetmacro{\mysquare}{\mysum+pow(\c,2)}
\xdef\mysum{\mysquare}
}
\pgfmathsetmacro{\myveclen}{sqrt(\mysum)}
\draw[#1] (#2) -- ($1/\myveclen*(#3)$);
}
\begin{document}
\begin{tikzpicture}
\Coordinate(o)(0,0,0)
\Coordinate(a)(3,6,2)
\Coordinate(b)(-2,4,3)
\Coordinate(c)(-1,-4,-1)
\draw[-latex] (o) -- (a);
\Unitvec[-latex,red,thick]{\o}{\a}
\draw[->] (o) -- (b);
\Unitvec[->,blue,thick]{\o}{\b}
\draw[-stealth] (o) -- (c);
\Unitvec[-stealth,green,thick]{\o}{\c}
\end{tikzpicture}
\end{document}
Output
Ecactly the same as before.
Please note:
\Coordinate uses \xdef to store the vectors, so it will overwrite existing commands without hesitation. Furthermore, it uses commands, so you'll have to write \a instead of a. It also creates a regular \coordinate. If you just need the point on the canvas, you can use a (as in the \draw commands), if the true 3D position matters, you should use \a (like for \unitvec). Also, using things like - or 8 in a coordinate name, which works in TikZ does not work with edef, so only use letters.