c# - 在 Unity 中重生后停止死亡动画
问题描述
所以我有一个玩家会在他与敌人碰撞时开始“受伤”动画。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);
}
}
我知道这可能很混乱,但这是我第一次没有教程的游戏,所以很难。
解决方案
根据上述评论中的讨论,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;
}
如果您重新编写重生代码,这应该可以解决您的问题
通过更改重生代码以仅重用单个游戏对象,问题似乎得到了解决。
推荐阅读
- unicode - 如何使用 SASS 制作一个通用的 Font Awesome mixin
- android - 如何以编程方式修改 Android Pie 9.0 中的 AOSP SystemUI?
- c# - 'LIKE' 在代码中的 SQL 语句中不起作用,但在 SSMS 中
- matlab - 如何找到所有出现的名为 sfunction_name 的模型文件?
- database - 如何每个月对数据库表进行分区?
- javascript - PHP平台内置网页侧链接问题
- c - STM32 闪烁代码仅在进入调试模式时有效
- javascript - 在不同的图层中显示 div?
- google-maps - 如何在 Flutter 中使用 Google Map 在源和目的地之间绘制路线?
- javascript - 使用 Webpack 为浏览器导出 Node 模块时避免使用 `default` 对象