- Home /
Animator and Scripting problems. Help !!
So I'm making a 2D Platformer by following a youtube tutorial series(https://www.youtube.com/watch?v=SCRupyidkYA), basically, a few videos in we already made the player(Indingo) able to walk by using an animation called walk and inserting that animation into the animator and scripting the player movement in a script called Indingo. Now in the animator, I made a parameter of type float named "speed", now firstly I have an Idle animation and a Walk animation. Now to transition from Idle to Walk "speed" has to be greater than 0.01 and to transition back to Idle from Walk "speed" has to be less than 0.01. Now my problem is I made two if statements one for A and the other D, the if statement basically says if A OR D pressed twice increase the players(Indingo) movementSpeed ,and play the run animation, but I couldn't find a way to increase the players movementSpeed , and play the run animation for the if statement. I don't what this means but the man behind these tutorials said something about 0.01 being the horizontal value. He says something about horizontal value in this video-https://www.youtube.com/watch?v=KF0jepqDAtw .... at this time 6:36
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Indingo : MonoBehaviour {
int counter;
private Rigidbody2D MyRigidBody;
private Animator MyAnimator;
[SerializeField]
private float movementSpeed;
private bool facingRight;
// Use this for initialization
void Start ()
{
facingRight = true;
MyRigidBody = GetComponent<Rigidbody2D>();
MyAnimator = GetComponent<Animator>();
}
// Update is called once per frame
void FixedUpdate ()
{
if (Input.GetKeyDown (KeyCode.A))
{
print("A key was pressed");
counter++;
if (counter == 2)
{
// This is where I want to increase the players speed(movementSpeed) and play the run animation
print("A was pressed twice");
counter = 0;//Reset counnter
}
}
if (Input.GetKeyDown(KeyCode.D))
{
print("D key was pressed");
counter++;
if (counter == 2)
{
// This is where I want to increase the players speed(movementSpeed) and play the run animation
print("D was pressed twice");
counter = 0;//Reset counnter
}
}
float horizontal = Input.GetAxis("Horizontal");
HandleMovement(horizontal);
Flip(horizontal);
}
private void HandleMovement(float horizontal)
{
MyRigidBody.velocity = new Vector2(horizontal * movementSpeed, MyRigidBody.velocity.y); // x - 1, y = 0;
MyAnimator.SetFloat("speed", Mathf.Abs(horizontal));
}
private void Flip(float horizontal)
{
if (horizontal > 0 && !facingRight || horizontal < 0 && facingRight)
{
facingRight = !facingRight;
Vector3 thescale = transform.localScale;
thescale.x *= -1;
transform.localScale = thescale;
}
}
}
Answer by a161803398874 · Aug 02, 2017 at 08:01 AM
I recommend if you are a beginner ,to keep it simple and instead of a double tap run controller use a key from the keyboard, for example "Shift" or "Space", this way you can first test out how the animator controller works out and then you can tweak the controller as you like, the main idea is to learn how to comunicate with your script and the animator controller. 4example Lets say we have 3 animations in a character ( "Idle" "Walk" and "Run") and are all ready and setup in unity with animator and its controller, everything linked with the white arrows logicaly correct in the animator window(transitions) back and forth from idle to walk, and back and forth from walk to run, to transition between the animations we will need 2 parameters , one parameter is a float called "speed" same as you have and the other one will be a Bool called "isRun" ,the transitions between "Idle" and "Walk" have the condition called "speed" and to play the "Run" animation the condicions are the float parameter "speed" && the bool parameter "IsRun". Now we need the script to put some values in these parameter values Replace this script with your current one just add the parameter "isRun" in unity in the animator window configure the transitions and you are free to go.. i tried to modifi your script the less possible.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Indingo : MonoBehaviour {
public int runMod; // Run Speed multiplier
private Rigidbody2D MyRigidBody;
private Animator MyAnimator;
[SerializeField]
private float movementSpeed;
private bool facingRight;
// Use this for initialization
void Start ()
{
facingRight = true;
MyRigidBody = GetComponent<Rigidbody2D>();
MyAnimator = GetComponent<Animator>();
}
// Update is called once per frame
void FixedUpdate ()
{
float horizontal = Input.GetAxis("Horizontal");
HandleMovement(horizontal);
Flip(horizontal);
}
private void HandleMovement(float horizontal)
{
if(Input.GetKey(KeyCode.LeftShift))
{
MyRigidBody.velocity = new Vector2(horizontal * movementSpeed * runMod, MyRigidBody.velocity.y); // x - 1, y = 0;
MyAnimator.SetFloat("speed", Mathf.Abs(horizontal));
MyAnimator.SetBool("isRun", true);
}else{
MyRigidBody.velocity = new Vector2(horizontal * movementSpeed, MyRigidBody.velocity.y); // x - 1, y = 0;
MyAnimator.SetBool("isRun", false);
MyAnimator.SetFloat("speed", Mathf.Abs(horizontal));
}
private void Flip(float horizontal)
{
if (horizontal > 0 && !facingRight || horizontal < 0 && facingRight)
{
facingRight = !facingRight;
Vector3 thescale = transform.localScale;
thescale.x *= -1;
transform.localScale = thescale;
}
}
}
@ a161803398874 thanks so much, I started experimenting around with it, and I will ask you for your help if I run into problems if you don't $$anonymous$$d.
Your answer
Follow this Question
Related Questions
Character Animator controller/movement 1 Answer
Is there a new retargetting system for the animation in 5.5? 1 Answer
2 problems with new animation / animator,2 problems with animation 0 Answers
How to properly detect the end time of an Animation which wait for the end of the previous one ? 1 Answer
Help with animator controllers 1 Answer