- Home /
Creating a wrap around bullet effect like Asteroids.
A bit of context: I'm making a 2D top-down shooter very similar in gameplay to the classic Asteroids Atari game.
Basically, when my bullets go off screen, I want them to come back around on the other side preserving the speed and direction.
I've managed to achieve this two different ways:
The first is with OnBecameInvisible()
void OnBecameInvisible()
{
this.transform.position = -this.transform.position;
}
and the second way is with !renderer.isVisible
void Update()
{
if (!renderer.isVisible)
{
this.transform.position = -this.transform.position;
}
}
Now, the issue that I'm having with these two methods is that the visibility is based on the camera frustum and not the boundaries of the scene's camera. This is to say that when I zoom out in the scene's view, this increases the range that the bullets are allowed to travel before wrapping around.
What I'd like to do is have the bullets wrap just as the leave the visible area of the game when it's being played. This problem is also present when I want other objects to destroy upon leaving the scene. Ultimately, sticking with either of the two methods means that bullets may hit enemies or targets off-screen (for which some do not wrap around) earning the player points erroneously.
Ideally, I want to solve this issue with the same amount of code with an OnScreenExit() or OnCameraExit() or something similar instead of having to get the camera's boundaries and converting them to screen points or world points or whatever. However, I'll cut my loses and use as much code as I need to so that this is as accurate as possible.
Answer by Baste · Sep 26, 2014 at 09:11 PM
You could make a collider around your scene, and either use OnTriggerExit to activate the bullet move, or use ClosestPointOnBounds to check if the bullet is within the bounds of the collider if triggers are not a possibility.
If you make sure that the collider is centered around the origin, then this replication of your old code should work perfectly fine, you just place it on the collider instead of the bullets:
void OnTriggerExit(Collider c) {
if(c.gameObject.GetComponent<YourBulletScript>() != null) {
c.transform.position = -c.transform.position;
}
}
You could also use OnTriggerEnter with a collider at the top, bottom, left and right of the screen.
You should also consider having a dead zone.