My characters arm wont follow the mouse in my platformer

Updated on January 7, 2018 in [A] Brackeys Courses
Share on Facebook0Tweet about this on TwitterShare on Google+0Share on Reddit0
5 on August 15, 2014

So I am following the tutorial about how to make an platformer and it went well untill now.

My problem is that my arm simply dont follow my mouse when I move it around, it’s just kind of dingling around when I walk back and forth. Checked my scripts about 10 times allready, but I will put it here anyway.

Script ”Armrotation”:


using UnityEngine;

using System.Collections;
public class ArmRotation : MonoBehaviour {
public int rotationOffset = 90;
// Update is called once per frame

void Update () {

// subtracting the position of the player from the mouse position

Vector3 difference = Camera.main.ScreenToWorldPoint (Input.mousePosition) - transform.position;

difference.Normalize (); // normalizing the vector. Meaning that all the sum of the vector will be equal to 1
float rotZ = Mathf.Atan2 (difference.y, difference.x) * Mathf.Rad2Deg; // find the angle in degrees

transform.rotation = Quaternion.Euler (0f, 0f, rotZ + rotationOffset);

}

}

Script ”PlatformerCharacter2D”:


using UnityEngine;
public class PlatformerCharacter2D : MonoBehaviour

{

bool facingRight = true; // For determining which way the player is currently facing.
[SerializeField] float maxSpeed = 10f; // The fastest the player can travel in the x axis.

[SerializeField] float jumpForce = 400f; // Amount of force added when the player jumps.
[Range(0, 1)]

[SerializeField] float crouchSpeed = .36f; // Amount of maxSpeed applied to crouching movement. 1 = 100%
[SerializeField] bool airControl = false; // Whether or not a player can steer while jumping;

[SerializeField] LayerMask whatIsGround; // A mask determining what is ground to the character
Transform groundCheck; // A position marking where to check if the player is grounded.

float groundedRadius = .2f; // Radius of the overlap circle to determine if grounded

bool grounded = false; // Whether or not the player is grounded.

Transform ceilingCheck; // A position marking where to check for ceilings

float ceilingRadius = .01f; // Radius of the overlap circle to determine if the player can stand up

Animator anim; // Reference to the player's animator component.
Transform playerGraphics; // Reference to the Graphics so we can change direction
void Awake()

{

// Setting up references.

groundCheck = transform.Find("GroundCheck");

ceilingCheck = transform.Find("CeilingCheck");

anim = GetComponent<Animator>();

playerGraphics = transform.FindChild ("Graphics");

if (playerGraphics == null)

{

Debug.LogError ("Dont freak out! There is no 'Graphics' object as a child of the player");

}

}
void FixedUpdate()

{

// The player is grounded if a circlecast to the groundcheck position hits anything designated as ground

grounded = Physics2D.OverlapCircle(groundCheck.position, groundedRadius, whatIsGround);

anim.SetBool("Ground", grounded);
// Set the vertical animation

anim.SetFloat("vSpeed", rigidbody2D.velocity.y);

}
public void Move(float move, bool crouch, bool jump)

{
// If crouching, check to see if the character can stand up

if(!crouch && anim.GetBool("Crouch"))

{

// If the character has a ceiling preventing them from standing up, keep them crouching

if( Physics2D.OverlapCircle(ceilingCheck.position, ceilingRadius, whatIsGround))

crouch = true;

}
// Set whether or not the character is crouching in the animator

anim.SetBool("Crouch", crouch);
//only control the player if grounded or airControl is turned on

if(grounded || airControl)

{

// Reduce the speed if crouching by the crouchSpeed multiplier

move = (crouch ? move * crouchSpeed : move);
// The Speed animator parameter is set to the absolute value of the horizontal input.

anim.SetFloat("Speed", Mathf.Abs(move));
// Move the character

rigidbody2D.velocity = new Vector2(move * maxSpeed, rigidbody2D.velocity.y);
// If the input is moving the player right and the player is facing left...

if(move > 0 && !facingRight)

// ... flip the player.

Flip();

// Otherwise if the input is moving the player left and the player is facing right...

else if(move < 0 && facingRight)

// ... flip the player.

Flip();

}
// If the player should jump...

if (grounded && jump) {

// Add a vertical force to the player.

anim.SetBool("Ground", false);

rigidbody2D.AddForce(new Vector2(0f, jumpForce));

}

}
void Flip ()

{

// Switch the way the player is labelled as facing.

facingRight = !facingRight;
// Multiply the player's x local scale by -1.

Vector3 theScale = playerGraphics.localScale;

theScale.x *= -1;

playerGraphics.localScale = theScale;

}

}
  • Liked by
Reply
2 on August 19, 2014

I had the same problem and couldn’t figure it out.
I started thinking of an alternative and remembered an old scripts I was playing around with a while ago but it is in JS.
After finding it and playing around with again I came up with this.
I’m not exactly amazing at programming so there might be a more efficient way than the code I’ve provided, but it works fine for me.
It does pretty much the same thing.
Hope it helps

var rotationOffset : int = 0;
function Update ()
{
 object_pos = Vector3.transform;
 mouse_pos = Input.mousePosition;
 object_pos = Camera.main.WorldToScreenPoint (transform.position);
 mouse_pos.x = mouse_pos.x - object_pos.x;
 mouse_pos.y = mouse_pos.y - object_pos.y;
 rotZ = Mathf.Atan2(mouse_pos.y, mouse_pos.x) * Mathf.Rad2Deg;
 transform.rotation = Quaternion.Euler(Vector3(0, 0, rotZ + rotationOffset));
}
on August 20, 2014

Will try! thx!

on January 7, 2018

where am i supposed to put that code? (Just started programming help plz)

Show more replies
  • Liked by
Reply
Cancel
1 on August 19, 2014

Stupid question……. you did put the ArmRotation script on the arm?

on August 20, 2014

Yup

Show more replies
  • Liked by
Reply
Cancel