From my experiences:
A unit test is a test or set of tests that covers a particular module. In OO programming, a module is typically a function or class. Unit tests are grouped into test suites. Unit tests are the building blocks of regression and smoke tests, and in some cases can serve as documentation for the intended behavior of a system or pieces of a system.
Regression testing is the act of running most or all of the unit tests on a changed module. This ensures that the changed module continues to work as expected following the changes.
Smoke testing is the act of running a (small - you want smoke testing to be fairly quick) number of unit tests on unchanged modules to ensure that a change to a module did not have any unintended side effects on other modules. The focus is typically on classes that have associations with the changed class as well as the modules that provide key functionality to the application.
Depending on your build environment, any of these might be automated or executed by the developer. A committed change set should be small enough such that regression tests don't take an unacceptably long amount of time, and smoke testing is designed to be fairly quick. Typically, I run at least regression and smoke tests on code before it even gets checked in so I don't break the build. I've usually seen the build system be designed to execute and report on the status of all test cases on a regular basis, ranging from daily to weekly depending on the rate of development and time to build and execute the tests.