Rotation Flicker in 2d platformer gun
So I've gotten started with Unity recently, and I have been working on a 2d platformer with shooting. Everything is going smoothly but I couldn't help but notice a little flicker whenever I rotate the gun in my game- the rotation works fine but when say the player stops moving right and starts moving left, the rotation flickers for a moment until it goes back to the correct position. I have the gun as a child of the player, and the transform where the bullet comes out as a child of the gun.
Problem can be seen here: https://gyazo.com/0fdb979b2e7e7d8b8448601b5e38fcbb
Script for gun (child of Player):
public class ShootGun : MonoBehaviour
{
public float shotSpread;
public int pauseRate;
public Transform bSpawnLocation;
public GameObject Bullet;
private Vector3 mousePos;
private Vector3 objectPos;
private float angle;
private float rotationAngle;
private bool mousePressed;
private GameObject bullet;
private Rigidbody2D bulletRb;
void Update()
{
mousePos = Input.mousePosition;
mousePos.z = 0;
objectPos = Camera.main.WorldToScreenPoint(transform.position);
mousePos.x = mousePos.x - objectPos.x;
mousePos.y = mousePos.y - objectPos.y;
angle = Mathf.Atan2(mousePos.y, mousePos.x) * Mathf.Rad2Deg;
Debug.Log(angle);
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));
rotationAngle = (transform.eulerAngles.z < 180f) ? transform.eulerAngles.z : 360 - transform.eulerAngles.z;
if (rotationAngle > 90)
{
if (transform.localScale.y > 0)
{
transform.localScale = new Vector3(transform.localScale.x, -transform.localScale.y, transform.localScale.z);
}
}
else if (rotationAngle < 90)
{
if (transform.localScale.y < 0)
{
transform.localScale = new Vector3(transform.localScale.x, -transform.localScale.y, transform.localScale.z);
}
}
if (mousePressed)
{
if (Time.frameCount % pauseRate == 0)
{
bullet = Instantiate(Bullet, bSpawnLocation.position, Quaternion.Euler(new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, angle - 90)));
bulletRb = bullet.GetComponent<Rigidbody2D>();
bulletRb.velocity = new Vector3(Mathf.Cos((angle + Random.Range(-shotSpread, shotSpread)) * Mathf.Deg2Rad) * 20, Mathf.Sin((angle + Random.Range(-shotSpread, shotSpread)) * Mathf.Deg2Rad) * 20, 0);
}
}
if (Input.GetMouseButtonDown(0))
{
mousePressed = true;
}
else if (Input.GetMouseButtonUp(0))
{
mousePressed = false;
}
}
}
Main script for Player (should be self explanatory):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float moveSpeed;
public float jumpForce;
private Rigidbody2D rb;
private Vector2 velocity;
private float width;
private float height;
private Vector3 scale;
private Vector3 position;
private float xScale;
private bool canJump;
void Start()
{
rb = GetComponent<Rigidbody2D>();
width = GetComponent<Collider2D>().bounds.extents.x * 2.0f;
height = GetComponent<Collider2D>().bounds.extents.y * 2.0f;
scale = transform.localScale;
xScale = scale.x;
}
void Update()
{
position = transform.position;
}
public void ProcessInput(float horizontal, bool jumpKeyPressed)
{
velocity = rb.velocity;
velocity.x = horizontal * moveSpeed;
rb.velocity = velocity;
if (jumpKeyPressed && CanJump())
{
velocity.y = jumpForce;
rb.velocity = velocity;
}
if (velocity.x < 0.0f)
{
scale.x = -xScale;
transform.localScale = scale;
if (transform.GetChild(0).gameObject.transform.localScale.x > 0)
{
transform.GetChild(0).gameObject.transform.localScale = new Vector3(-transform.GetChild(0).gameObject.transform.localScale.x, transform.GetChild(0).gameObject.transform.localScale.y, transform.GetChild(0).gameObject.transform.localScale.z);
}
}
else if (velocity.x > 0.0f)
{
scale.x = xScale;
transform.localScale = scale;
if (transform.GetChild(0).gameObject.transform.localScale.x < 0)
{
transform.GetChild(0).gameObject.transform.localScale = new Vector3(-transform.GetChild(0).gameObject.transform.localScale.x, transform.GetChild(0).gameObject.transform.localScale.y, transform.GetChild(0).gameObject.transform.localScale.z);
}
}
}
private bool CanJump()
{
if (Physics2D.BoxCast(transform.position, new Vector2(width, height), 0.0f, Vector2.down, 0.1f))
{
return true;
}
return false;
}
}
,
Your answer
Follow this Question
Related Questions
Inaccurate shooting script for gun 1 Answer
Why won't the coin disappear when the player collides with it? 1 Answer
Problem with the gun reloading 0 Answers
how would I make a capsule rotate and go down a platform on the y axis? 0 Answers
How do I make a client hosted game with multiple character classes? 0 Answers