Brickshooter tutorial: bounding camera movement

I’m obviously a total newb, and I’m probably making a rookie mistake, but this one seems obviously right to me, and behaves obviously wrong.

I completed the brickshooter assignment and was annoyed that you could fly the camera completely out of the environment. So I modified the controller to enforce some min and max bounds in X and Y. It works solidly in Y, but in X when I touch a bound, I get shot off into infinity.

Then I notice I had rotated the camera 180 degrees in Y earlier, and when I faced it back forward, everything works as I expect (except I can’t see the acutal game =o)).

So it’s some sign error and I’m thinking about camera’s in 3D (or just Unity) wrong or something. What would be the more correct way to do what I’m trying to do here?

public class CameraController : MonoBehaviour {
	
	public Transform ShotPosition;
	public Rigidbody Projectile;

    public float ShotForce = 1000f;
    public float MoveSpeed = 10f;
    
	private float minX = -6f;
	private float maxX = 6f;
	private float minY = 0.5f;
	private float maxY = 7f;
    
    void Update ()
    {
        float h = Input.GetAxis("Horizontal") * Time.deltaTime * MoveSpeed;
        float v = Input.GetAxis("Vertical") * Time.deltaTime * MoveSpeed;
		
		float x = transform.position.x + h;
		float y = transform.position.y + v;
		
		x = Mathf.Min(x, maxX);
		x = Mathf.Max(x, minX);
		
		y = Mathf.Min(y, maxY);
		y = Mathf.Max(y, minY);
        
        Vector3 moveTo = new Vector3(x, y, transform.position.z);
		
		transform.Translate(moveTo - transform.position);
		
		if(Input.GetButtonUp("Fire1"))
        {
            Rigidbody shot = Instantiate(Projectile, ShotPosition.position, ShotPosition.rotation) as Rigidbody;
            shot.AddForce(ShotPosition.forward * ShotForce);
        }
    }
}

Maybe the error is due to Translate - its default is local space, thus the camera may go in the wrong direction when its rotation isn’t zero. You could simplify your code and solve the problem modifying it as follows:

...
void Update ()
{
    float h = Input.GetAxis("Horizontal") * Time.deltaTime * MoveSpeed;
    float v = Input.GetAxis("Vertical") * Time.deltaTime * MoveSpeed;
    Vector3 curPos = transform.position; // get the current position
    // calculate new position and clamp it to the limits
    curPos.x = Mathf.Clamp(curPos.x + h, minX, maxX);
    curPos.y = Mathf.Clamp(curPos.y + v, minY, maxY);
    transform.position = curPos; // update camera position
    if(Input.GetButtonUp("Fire1"))
    {
        Rigidbody shot = Instantiate(Projectile, ShotPosition.position, ShotPosition.rotation) as Rigidbody;
        shot.AddForce(ShotPosition.forward * ShotForce);
    }
}