Войти
UnityФорумПрограммирование

Нуб-проблема с 2D анимацией в Unity (C#)

#0
15:44, 7 окт. 2018

  Проблема, собсна, вот в чем. У меня есть анимация смерти ГГ и вроде как всё отлично. Герой теряет хп, умирает и не двигается. Имеет возможность перезапуска уровня или выхода из игры. Одно но, анимация смерти проигрывается бесконечно. Я уже весь Animator облазил и не могу найти какого-либо параметра за это отвечающего. Лазил в гугл - тоже ничего полезного, там либо 3D, либо анимации тупо нет. Ниже приведу код (который тупо спесд*л модифицировал)

using UnityEngine;
using UnityEngine.SceneManagement;
using System.Collections;

public class Character : Unit
{
    [SerializeField]
    private int lives = 5;

    private int jumps = 1;
    public int Lives
    {
        get { return lives; }
        set
        {
           if (value < 5) lives = value;
            livesBar.Refresh();
        }
    }
    private LivesBar livesBar;

    [SerializeField]
    private float speed = 3.0F;
    [SerializeField]
    private float jumpForce = 15.0F;

    private bool isGrounded = false;
    private bool isAlive = true;

    private Bullet bullet;

    private CharState State
    {
        get { return (CharState)animator.GetInteger("State"); }
        set { animator.SetInteger("State", (int)value); }
    }

    new private Rigidbody2D rigidbody;
    private Animator animator;
    private SpriteRenderer sprite;

    private void Awake()
    {
        livesBar = FindObjectOfType<LivesBar>();
        rigidbody = GetComponent<Rigidbody2D>();
        animator = GetComponent<Animator>();
        sprite = GetComponentInChildren<SpriteRenderer>();

        bullet = Resources.Load<Bullet>("Bullet");
    }

    private void FixedUpdate()
    {
        CheckGround();
    }

    private void Update()
    {
        if (isGrounded & isAlive)
            State = CharState.Idle;

        if (isAlive & Input.GetButton("Horizontal")) Run();
        if (isAlive & jumps < 2 & Input.GetButtonDown("Jump")) Jump();
        if (Lives <= 0) Death();
        if (Input.GetButtonDown("Cancel")) Application.Quit();
        if (Input.GetButtonDown("Submit") & isAlive == false)
            SceneManager.LoadScene("Level");
    }

    private void Run()
    {
        Vector3 direction = transform.right * Input.GetAxis("Horizontal");

        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);

        sprite.flipX = direction.x < 0.0F;

        if (isGrounded & isAlive)
            State = CharState.Run;
    }

    private void Jump()
    {
        rigidbody.AddForce(transform.up * jumpForce, ForceMode2D.Impulse);
        jumps += 1;
    }

    /*    private void Shoot()
        {
            Vector3 position = transform.position; position.y += 0.8F;
            Bullet newBullet = Instantiate(bullet, position, bullet.transform.rotation) as Bullet;

            newBullet.Parent = gameObject;
            newBullet.Direction = newBullet.transform.right * (sprite.flipX ? -1.0F : 1.0F);
        }*/

    public override void ReceiveDamage()
    {
        Lives--;

        rigidbody.velocity = Vector3.zero;
        rigidbody.AddForce(transform.up * 5.0F, ForceMode2D.Impulse);

        Debug.Log(lives);
    }
    private void Death()
    {
        State = CharState.Death;
        isAlive = false;
    }
    /*public override void Stun()
    {
        Unit;
    }*/
    private void CheckGround()
    {
        Collider2D[] colliders = Physics2D.OverlapCircleAll(transform.position, 1F);

        isGrounded = colliders.Length > 1;
        if (!isGrounded)
            State = CharState.Jump;
        if (isGrounded)
            jumps = 1;
    }

    private void OnTriggerEnter2D(Collider2D collider)
    {

        Bullet bullet = collider.gameObject.GetComponent<Bullet>();
        if (bullet && bullet.Parent != gameObject)
        {
            ReceiveDamage();
        }
    }
}


public enum CharState
{
    Idle,
    Run,
    Jump,
    Death
}

Пробовал так же баловаться в аниматоре с Exit, но тоже не задалось. Хоть намек киньте, ох, Геймдев.ру ლ(¯ロ¯"ლ)


#1
16:50, 7 окт. 2018

В самой анимации повтор включен?

#2
17:22, 7 окт. 2018

Visteras
Был включен, отключил - не помогло. Видимо из-за того что метод Death() в апдейте весит
UPD: Перевесил в ReceiveDamage, всё так же не работает

#3
18:33, 7 окт. 2018

Daylight
> Видимо из-за того что метод Death() в апдейте весит

И?
Я вижу два решения:
1) Вводить новый state isDead, вызывать по завершении анимации.
2) Вызывать новый idle по достижения условия, но не в update, т.е. changeState(to: Death) {
if state != .Death { callDeathAnimataionStart() }
}

https://answers.unity.com/questions/1460741/how-to-stop-animation… -the-end.html

#4
20:13, 7 окт. 2018

CasDev
Скорее всего я болван криворукий, потому что не могу прописать вызов по завершении анимации. Попробовал что по ссылке - работает, вот только ломаются остальные анимации

#5
0:56, 10 окт. 2018

Короче говоря, парни. Как обычно проблема не в кампутерах, как говорится. Не выключил Can Transition To в настройках направления на State :'( Спасибо всем! Тема закрыта.

UnityФорумПрограммирование

Тема в архиве.

Тема закрыта.