Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Не срабатывает анимация персонажа

Андрей Костромин Ученик (99), на голосовании 8 месяцев назад
У персонажа есть тригер "takeOf", объект feetPos который определяет расстояние до земли
Если ты нажимаешь на кнопку прыжка то все работает, а если он просто падает без нажатия кнопки то тригер не срабатывает
Код:

 using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class PlayerMovement : MonoBehaviour
{
[Header("Controls")]
public float speed;
public float jumpForce;
public float checkRadius;

[Header("Not changeable")]
public float moveInput;
public Transform feetPos;
public LayerMask whatIsGround;
public Joystick joystick;

private Animator anim;
private Rigidbody2D rb;
private bool facingRight = true;
private bool isGrounded;

SavePlayerPos playerPosData;

private void Awake()
{
playerPosData = FindObjectOfType();
playerPosData.PlayerPosLoad();
}

void Start()
{
anim = GetComponent();
rb = GetComponent();
}

private void FixedUpdate()
{
moveInput = joystick.Horizontal;
rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
if(facingRight == false && moveInput > 0)
{
Flip();
}
else if(facingRight == true && moveInput < 0)
{
Flip();
}

if (moveInput == 0)
{
anim.SetBool("isRunning", false);
}
else
{
anim.SetBool("isRunning", true);
}
}

void Update()
{
isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);

if (isGrounded == true)
{
anim.SetBool("isJumping", false);
}
else
{
anim.SetBool("isJumping", true);
}
}

public void OnJumpingDown()
{
if(isGrounded == true)
{
rb.velocity = Vector2.up * jumpForce;
anim.SetTrigger("takeOf");
}
}

void Flip()
{
facingRight = !facingRight;
Vector3 Scaler = transform.localScale;
Scaler.x *= -1;
transform.localScale = Scaler;
}

private void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == "Entity")
{
speed = 0f;
jumpForce = 0f;
anim.SetBool("isDeath", true);
anim.SetBool("isJumping", false);
anim.SetBool("isRunning", false);
Invoke("Entity", 2);
}
}

private void Entity()
{
SceneManager.LoadScene("Death");
}


}
Голосование за лучший ответ
Математика Профи (961) 9 месяцев назад
takeOf" не срабатывает, когда персонаж падает без нажатия кнопки прыжка.

Для того чтобы исправить это, вам нужно добавить дополнительную проверку на падение персонажа без нажатия кнопки прыжка. Вместо использования только флага isGrounded для определения состояния персонажа на земле, вы можете проверять скорость вертикального движения персонажа.

Вот как можно модифицировать ваш код:

csharp
Копировать
void Update()
{
isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);

if (isGrounded)
{
anim.SetBool("isJumping", false);
}
else if (rb.velocity.y < 0) // Добавляем проверку на падение
{
anim.SetBool("isJumping", true);
}
}

public void OnJumpingDown()
{
if (isGrounded || Mathf.Abs(rb.velocity.y) < 0.1f) // Добавляем дополнительную проверку на вертикальную скорость
{
rb.velocity = Vector2.up * jumpForce;
anim.SetTrigger("takeOf");
}
}
Эти изменения позволят триггеру "takeOf" срабатывать не только при нажатии кнопки прыжка, но и при падении персонажа без нажатия кнопки.
МатематикаПрофи (961) 9 месяцев назад
 void Update() 
{
isGrounded = Physics2D.OverlapCircle(feetPos.position, checkRadius, whatIsGround);

if (isGrounded)
{
anim.SetBool("isJumping", false);
}
else if (rb.velocity.y < 0) // Добавляем проверку на падение
{
anim.SetBool("isJumping", true);
}
}

public void OnJumpingDown()
{
if (isGrounded || Mathf.Abs(rb.velocity.y) < 0.1f) // Добавляем дополнительную проверку на вертикальную скорость
{
rb.velocity = Vector2.up * jumpForce;
anim.SetTrigger("takeOf");
}
}
Андрей Костромин Ученик (99) До сих пор не работает
Похожие вопросы