- Home /
2D Simulated Sword Swing - Sword Floating Away
Hello, I'm attempting to make one of my enemies swing a sword. This is in 2D. I'm doing this by saving the end point of the hilt of the sword before the rotation, then rotating the sword, then restoring the hilt position. Currently the sword rotation works, and the sword swings down and then up correctly.
The problem is that each time the enemy swings the sword, the sword starts to float away from the enemy. It seems that it is floating away to the positive x and negative y. Each sword swing seems to increase the distance very slightly, but after a while it becomes very noticeable.
Can anyone tell me why this is happening or how to fix it. I'm also open to better alternative ways to achieve this. Thank you in advance.
void Update(){
....
// See if should swing sword, has to be close to target
if (!swinging && Mathf.Abs (target.position.x - transform.position.x) < 1.0F)
swinging = true;
if (swinging)
handleSwing();
....
}
public void handleSwing(){
float zAngle = swordTransform.localRotation.eulerAngles.z; // Angle before rotating
// Check if withing angle limit of swing
if ((zAngle > 320 && zAngle <= 360) || (zAngle >= 0 && zAngle <= 30))
swinging = true;
else { // Done with swing, change swing direction
swingingDown = !swingingDown;
swinging = false;
}
// Save y point for restoring position later
float originalY = (zAngle > 320 && zAngle <= 360) ? swordRenderer.bounds.min.y : swordRenderer.bounds.max.y;
Vector3 rotVec = swordTransform.localRotation.eulerAngles; // Current rotation
rotVec.z += (swingingDown) ? 1 : -1; // Rotate depending on swing direction
if(facingRight){ // Boss is facing right
float originalX = swordRenderer.bounds.min.x; // Want to grab left most point
swordTransform.localRotation = Quaternion.Euler (rotVec); // Change rotation
float newX = swordRenderer.bounds.min.x; // Grab new left most point
// Grab new y point
float newY = (zAngle > 320 && zAngle <= 360) ? swordRenderer.bounds.min.y : swordRenderer.bounds.max.y;
float xDif = newX - originalX;
float yDif = newY - originalY;
swordTransform.Translate(new Vector3(-xDif, -yDif, 0f)); // Restore the position
}
else{ // Boss is facing left
float originalX = swordRenderer.bounds.max.x; // Want to grab right most point
swordTransform.localRotation = Quaternion.Euler (rotVec); // Change rotation
float newX = swordRenderer.bounds.max.x; // Grab new right most point
// Grab new y point
float newY = (zAngle > 320 && zAngle <= 360) ? swordRenderer.bounds.min.y : swordRenderer.bounds.max.y;
float xDif = newX - originalX;
float yDif = newY - originalY;
swordTransform.Translate(new Vector3(-xDif, -yDif, 0f)); // Restore the position
}
}
Comment