【问题标题】:Stop death animation after respawn in Unity在 Unity 中重生后停止死亡动画
【发布时间】:2018-05-04 19:06:51
【问题描述】:

所以我有一个玩家在与敌人碰撞时会开始“受伤”动画。 2 秒后他会重生回到起始位置,但“受伤”动画不会停止。即使玩家四处移动,它也会继续播放。

这是我的整个播放器脚本:

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

public class Player : MonoBehaviour
{
    public float speed = 3.0f;
    public Vector2 jumpHeight;
    [HideInInspector] public bool facingRight = true;
    private float minX = -10.5f;
    private float maxX = 10.5f;
    public int count;
    public Text countText;
    private Animator anim;
    public GameObject NECText;
    public GameObject WinText;
    public GameObject player;

    void Start()
    {
        anim = GetComponent<Animator>();
        transform.position = new Vector3(-10.0f, -2.32f, 0);
        count = 0;
        countText.text = "Coins: " + count.ToString();
        NECText.gameObject.SetActive(false);
        WinText.gameObject.SetActive(false);
    }

    void Update()
    {
        Movement();
        Death();
        float horizontalInput = Input.GetAxis("Horizontal");
        if(horizontalInput > 0 && !facingRight)
        {
            Flip();
        }
        else if(horizontalInput < 0 && facingRight)
        {
            Flip();
        }
    }

    void Movement()
    {
        float horizontalInput = Input.GetAxis("Horizontal");

        transform.Translate(Vector3.right * horizontalInput * speed * Time.deltaTime);

        if(Input.GetKeyDown(KeyCode.Space)) //fix unlimited jump
        {
            GetComponent<Rigidbody2D>().AddForce(jumpHeight, ForceMode2D.Impulse);
        }

        if(transform.position.x < minX)
        {
            transform.position = new Vector3 (minX, transform.position.y, 0);
        }
        else if(transform.position.x > maxX)
        {
            transform.position = new Vector3(maxX, transform.position.y, 0);
        }
    }

    void Death()
    {
        if (transform.position.y <= -4.25f)
        {
            anim.SetBool("isHurt", true);
            Invoke("Respawn", 2f);
        }
    }

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

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.tag == "Enemy")
        {
            anim.SetBool("isHurt", true);
            Invoke("Respawn", 2f);
        }
        else if (collision.gameObject.tag == "Coin")
        {
            collision.gameObject.SetActive(false);
            count++;
            countText.text = "Coins: " + count.ToString();
        }
        else if(collision.gameObject.tag == "Chest" && count < 3)
        {
            NECText.gameObject.SetActive(true);
            Destroy(NECText, 5.0f);
        }
        else if(collision.gameObject.tag == "Chest" && count == 3)
        {
            WinText.gameObject.SetActive(true);
            Destroy(WinText, 5.0f);
            anim.SetBool("isWinning", true);
        }
    }

    void Respawn()
    {
        Destroy(player);
        Instantiate(player, new Vector3(-10.0f, -2.32f, 0), Quaternion.identity);
        anim.SetBool("isHurt", false);
    }
}

我知道这可能很混乱,但这是我第一次没有教程的游戏,所以很难。

【问题讨论】:

  • anim.SetBool("isHurt", false); 不工作?如果是这样,您确实需要修复动画或添加“空闲”动画。 Here 是涵盖该内容的官方动画师教程。
  • 提供更多关于你何时产卵的信息?其次,为什么您在实例化时破坏新的播放器对象?这是否意味着您的播放器只是同一个旧播放器而不是新播放器。也许先将Destory(player); 移动到Instantiate(player, new Vector3(-10.0f, -2.32f, 0), Quaternion.identity); 之前,看看它是否有效。我认为这应该是你的问题
  • @killer_mech 问题是当我把 Destroy(player) 放在首位或者我根本不包含它时,玩家会在起点死亡并重生,但会立即掉出关卡(穿过地面)。
  • @Deltox 你能包含所有必要的脚本吗?现在很难指出这个问题,因为脚本不完整
  • @killer_mech 添加了整个播放器脚本

标签: c# unity3d 2d


【解决方案1】:

根据上面 cmets 中的讨论,OP 遇到了与 Repsawn() 函数相关的问题。

您可以采取的另一种方法是更改​​ Respawn() 函数。 您可以重复使用相同的播放器预制件,而不是实例化播放器预制件 预制件并继续调整其值。在这种情况下,您 不需要创建单独的类来存储上述内容 价值观。你就这么说吧

void Respawn()
{
    anim.SetBool("isHurt", false);
    transform.position = new Vector3(-10.0f, -2.32f, 0);
    transform.rotation = Quaternion.identity;
    GetComponent<Rigidbody2D>().velocity = Vector2.zero;
    GetComponent<Rigidbody2D>().angularVelocity = 0; 
}

这应该可以解决 如果你修改你的重生代码,你的问题

通过更改重生代码以仅重用单个游戏对象,问题似乎得到了解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-25
    • 1970-01-01
    • 2015-09-19
    • 2015-12-09
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多