Adjust object rotation based on player direction
I'm trying to create a 2D top-down shooter. I want to setup a way for the player to hold the gun in the direction of the which he is moving in. For example, if the player is holding the W and A keys, his gun point in the top right direction. As he switches between directions, the gun also switches smoothly. If the player is going up at a straight angle (Ex. Holding W key), the whole player switches direction.
I have managed to replicate this but only in 6 directions. However, I want to make it smooth with the player movement and in all other directions.
I know there has to be a simple answer to this, I just can't figure it out. Here is my code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
[Header("Character Attributes:")]
public float movementBaseSpeed = 1.0f;
[Space]
[Header("Weapon Statistics:")]
public float upwardSideAngle = 30f;
public float downwardSideAgnle = -30f;
public float idleAngle = -10f;
[Space]
[Header("Character Statistics:")]
public Vector2 currentMovementDirection;
public float currentMovementSpeed;
[Space]
[Header("References:")]
public Rigidbody2D rb;
public Animator animator;
public GameObject weapon;
// Update is called once per frame
void Update()
{
ProcessInputs();
Move();
Animate();
MoveAim();
}
void ProcessInputs()
{
currentMovementDirection = new Vector2(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"));
currentMovementSpeed = Mathf.Clamp(currentMovementDirection.magnitude, 0.0f, 1.0f);
currentMovementDirection.Normalize();
}
void Animate()
{
if (currentMovementDirection != Vector2.zero)
{
animator.SetFloat("Horizontal", currentMovementDirection.x);
animator.SetFloat("Vertical", currentMovementDirection.y);
}
animator.SetFloat("Magnitude", currentMovementDirection.magnitude);
}
void Move()
{
rb.velocity = currentMovementDirection * currentMovementSpeed * movementBaseSpeed;
}
void MoveAim()
{
//When player is moving left
if(currentMovementDirection.x < 0)
{
weapon.transform.rotation = Quaternion.Euler(0, 180, 0);
}
//When player is moving right
else if(currentMovementDirection.x > 0)
{
weapon.transform.rotation = Quaternion.identity;
}
//When player is moving top right
if(currentMovementDirection.y > 0 && currentMovementDirection.x > 0)
{
weapon.transform.rotation = Quaternion.Euler(0f, 0f, upwardSideAngle);
}
//When player is moving bottom right
if(currentMovementDirection.y < 0 && currentMovementDirection.x > 0)
{
weapon.transform.rotation = Quaternion.Euler(0f, 0f, downwardSideAgnle);
}
//When player is moving top left
if(currentMovementDirection.y > 0 && currentMovementDirection.x < 0)
{
weapon.transform.rotation = Quaternion.Euler(0, 180, upwardSideAngle);
}
//When player is moving bottom left
if (currentMovementDirection.y < 0 && currentMovementDirection.x < 0)
{
weapon.transform.rotation = Quaternion.Euler(0, 180, downwardSideAgnle);
}
//When player is standing still
if (currentMovementDirection.y == 0 && currentMovementDirection.x == 0)
{
weapon.transform.rotation = Quaternion.Euler(0f, 0f, idleAngle);
}
}
}
Your answer
Follow this Question
Related Questions
Character movement that ends with a specific facing 0 Answers
Virtual camera odd behaviour. Scriptting noob questions 0 Answers
[HELP] Swiping multiple objects from a raycast 0 Answers
How can I incorporate a Rotation Towards the Mouse Position into this Script? I Tried. 0 Answers
Struggling to get the rotation the player is moving in. 1 Answer