- Home /
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);
}
}
}
Answer by aldonaletto · May 18, 2013 at 05:47 PM
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);
}
}
Works great. For some reason I had it in my head that I couldn't set position directly. Great tips, thanks!
Your answer
Follow this Question
Related Questions
UNITY 3D: How to make the camera follow the player? Smoothly 2 Answers
Multiple Cars not working 1 Answer
3D / Top-Down - Make a script to let the player zoom the camera in and out 0 Answers
Smooth Camera follow script is causing framerate drops when moving 1 Answer
Distribute terrain in zones 3 Answers