So I’m working on a 2.5D game that has loops. My entire issue here is no matter what, my character’s Z position is always 0. I’ve tried using triggers that set the character’s Z position with no luck.

The red path is the one my character is currently taking, locked on the Z axis, and the blue path is the one I would like my character to take.
So my main question is, what is a good spline asset and how can I make my character follow it?
Something is locking your character’s Z position, but it’s impossible for anyone here to tell you why. At least not without more information. However, you will probably need to debug and figure this out yourself, since if you knew exactly what was causing it you probably wouldn’t need any of us to help you anyway. 
All I can really suggest is to try to isolate the issue as much as possible. This will help you narrow down the possible causes. Maybe an animator controller or root motion is locking the position?
A very bad “hack” until you figure out what’s causing it or if you’re just lazy would be to just forcibly reset the Z position in late or fixed update to whatever you want like this:
// whatever you want the Z position to be.
public float zOffset = 10f;
// cache the transform to improve performance.
private Transform m_Transform;
private void Awake()
{
m_Transform = GetComponent<Transform>();
}
void FixedUpdate()
{
m_Transform.position = new Vector3(m_Transform.position.x, m_Transform.position.y, zOffset);
}