Animation Help? (2D)
Hi, so I am using a 2dPlatformerCharacter script from Unity Assets, accept I edited it:
using System;
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
// Just in case so no "duplicate definition" stuff shows up
namespace UnityStandardAssets.Copy._2D
{
public class PlatformerCharacter2D : MonoBehaviour
{
[SerializeField] private float m_MaxSpeed = 10f; // The fastest the player can travel in the x axis.
[SerializeField] private float m_JumpForce = 400f; // Amount of force added when the player jumps.
[SerializeField] private bool m_AirControl = false; // Whether or not a player can steer while jumping;
[SerializeField] private LayerMask m_WhatIsGround; // A mask determining what is ground to the character
private Transform m_GroundCheck; // A position marking where to check if the player is grounded.
const float k_GroundedRadius = .2f; // Radius of the overlap circle to determine if grounded
private bool m_Grounded; // Whether or not the player is grounded.
private Animator m_Anim; // Reference to the player's animator component.
private Rigidbody2D m_Rigidbody2D;
private bool m_FacingRight = true;
public string GameOverScene;
// For determining which way the player is currently facing.
private void Awake()
{
// Setting up references.
m_GroundCheck = transform.Find("GroundCheck");
m_Anim = GetComponent<Animator>();
m_Rigidbody2D = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
m_Grounded = false;
// The player is grounded if a circlecast to the groundcheck position hits anything designated as ground
// This can be done using layers instead but Sample Assets will not overwrite your project settings.
Collider2D[] colliders = Physics2D.OverlapCircleAll(m_GroundCheck.position, k_GroundedRadius, m_WhatIsGround);
for (int i = 0; i < colliders.Length; i++)
{
if (colliders[i].gameObject != gameObject)
m_Grounded = true;
}
m_Anim.SetBool("Ground", m_Grounded);
}
public void Move(float move, bool jump)
{
//only control the player if grounded or airControl is turned on
if (m_Grounded || m_AirControl)
{
// The Speed animator parameter is set to the absolute value of the horizontal input.
m_Anim.SetFloat("Speed", Mathf.Abs(move));
// Move the character
m_Rigidbody2D.velocity = new Vector2(move*m_MaxSpeed, m_Rigidbody2D.velocity.y);
m_MaxSpeed += 0.5f * Time.deltaTime; /////////////////////////////////////////////////////////////////////////////////
m_JumpForce += 1.0f * Time.deltaTime; ////////////////////////////////////////////////////////////////////////////////
m_Rigidbody2D.gravityScale += 0.001f * Time.deltaTime; /////////////////////////////////////////////////////////////
// If the input is moving the player right and the player is facing left...
if (move > 0 && !m_FacingRight)
{
// ... flip the player.
Flip();
}
// Otherwise if the input is moving the player left and the player is facing right...
else if (move < 0 && m_FacingRight)
{
// ... flip the player.
Flip();
}
}
// If the player should jump...
if (m_Grounded && jump && m_Anim.GetBool("Ground"))
{
// Add a vertical force to the player.
m_Grounded = false;
m_Anim.SetBool("Ground", false);
m_Rigidbody2D.AddForce(new Vector2(0f, m_JumpForce));
}
}
private void Flip()
{
// Switch the way the player is labelled as facing.
m_FacingRight = !m_FacingRight;
// Multiply the player's x local scale by -1.
Vector3 theScale = transform.localScale;
theScale.x *= -1;
transform.localScale = theScale;
}
void OnCollisionEnter2D(Collision2D target)
{
if (target.gameObject.tag == "Enemy") {
m_MaxSpeed = 0f;
m_JumpForce = 0f;
m_Rigidbody2D.gravityScale = 1f;
m_Grounded = true;
StartCoroutine(DelayedSceneLoad());
}
}
IEnumerator DelayedSceneLoad()
{
yield return new WaitForSeconds(1.5f);
SceneManager.LoadScene(GameOverScene);
}
}
}
So I edited it so when the player collides with an enemy, it'll stop the player from being able to move. The reason I did that is because I also have the player play a death animation on collision, but in a separate script, so part of this script is to prevent the player from moving cause if the player moves while the death animation plays, the animation will be interrupted. So anyway when the player collides with an enemy, it plays the animation, but if the player jumps, while ascending in the air, it won't play the death animation, it'll just play the jump animation, then the game is over. Does anyone know how I can fix this? Thanks.
Answer by Aggerwal · Jun 26, 2016 at 09:48 PM
Can I see the m_Anim animator window?
Just as I guessed, you have the Jumping animation connected with any state. The way it is now, the Jumping animation will occur anytime the player jumps. Any state means it will transition from any other state it is playing. So if you take out that transition from any state, it won't do that anymore. But you would have to make transition from or to jumping to the other animations like walk, run. Based on what I see here, you should have transition from run and walk, to jumping :) Tell me if that solved your problem.
@Aggerwal It worked! Thank you so much! Just one problem. When the player walks, sometimes, it plays the jump animation every once in a while, for a split second. Here is the transition from idle to jumping:
and jumping to idle:
and it won't play the jump animation when the player jumps from idle.
Well I really can't see what is going on, one other thing I could suggest is make the m_Grounded variable public so you can see it in the inspector and see when it changes.
@Aggerwal So it turns out, when the player jumps, m_Grounded is still true. With your help though, I figured it out. On line 82, I added "= true" to the "m_Grounded" part. Then it worked! Thank you for taking your time to help me!