- Home /
Jittering bug with screenwrap
To learn Unity, I'm trying to make a simple Pong clone where instead of bumping against the edge of the screen you wrap around to the bottom (like Asteroids). I have a decent working implementation of the wraparound using a parent-child pair of paddles that flip to the opposite side of the screen when their y position is greater than a certain point above the top of the camera rectangle.
However, when the child has low velocity and its x position is exactly zero, the parent gets stuck in a loop flipping back and forth between the top and the bottom because its position is slightly greater than the threshold on either side. The parent is out of view but the loop has weird side effects on the child's local position. A few ideas I've tried:
Adding a small bump to the pair's velocity when one flips, which makes the bug happen less often but with worse behavior
Making the flip threshold different on the top vs the bottom, which doesn't prevent the bug when the absolute value of the y position of the flipping paddle is bigger than both
Changing the child's localPosition instead of either paddle's world position, which just breaks the flipping mechanism entirely
I figure that since I'm brand new to Unity there might be a solution that I simply don't know about yet. Here's the script for the paddle:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class PlayerPaddle : MonoBehaviour {
private Rigidbody2D rb2d;
void Start() {
rb2d = GetComponent<Rigidbody2D>();
rb2d.freezeRotation = true;
rb2d.drag = GlobalVars.drag;
rb2d.gravityScale = 0;
}
void FixedUpdate() {
rb2d.AddForce(new Vector2(0, GlobalVars.paddleSpeed * Input.GetAxis("Vertical")));
}
void LateUpdate() {
if (Mathf.Abs(transform.position.y) > (2 * GlobalVars.ceiling))
transform.position = new Vector2(-1 * GlobalVars.paddleXPos, -1 * rb2d.position.y);
if (transform.parent != null)
transform.localPosition = transform.localPosition.normalized * (2 * GlobalVars.ceiling) * (1 / transform.parent.lossyScale.y);
rb2d.position = new Vector2(-1 * GlobalVars.paddleXPos, rb2d.position.y);
}
}
I'd also appreciate any comments on code style/practices if I've messed anything up, wouldn't be surprised if I did :)
Your answer

Follow this Question
Related Questions
Moving Object Control by Joystick in unity2d 0 Answers
How to make the bullet shoot in the sprite direction 1 Answer
Move the camera in 2D when target reaches bounds. Is there a better way? 0 Answers
how to move child object inside a moving parent in 2d using Vector2.MoveTowards()? 1 Answer
How can i create multiplayer game using wifi hotspot in unity 0 Answers