站在陷阱上无敌后被击中

Getting hit after invicibility when standing on trap

我正在开发一款简单的 2D 平台游戏,我在其中制作了击退效果。当玩家被障碍物击中时,目前只是尖刺,他有击退和暂时无敌,所以在无敌期间站在尖刺上时他不会被击中。然而,一旦无敌结束,我想让玩家像下面的 GIF 一样被尖刺击中。

https://media.giphy.com/media/26FeVTRop5PhBrJQs/giphy.gif

玩家被击中是因为无敌状态消失并且它站在尖刺上。我遇到的问题是,如果无敌结束并且玩家仍然站在尖刺上,它不会被击中并且在它离开尖刺之前不会受到伤害。你能建议我如何解决这个问题吗?这是我用来攻击玩家的代码。

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

public class HitThePlayer : MonoBehaviour 
{
    public int damage;

    GameObject player;
    PlayerController playerController;
    PlayerMovement playerMovement;

    void Start ()
    {
        player = GameObject.FindGameObjectWithTag ("Player");
        playerController = GameObject.FindGameObjectWithTag  ("GameController").GetComponent<PlayerController>();
        playerMovement = player.GetComponent<PlayerMovement> ();
    }

    void OnTriggerEnter2D (Collider2D other)
    {
        if (!playerController.isInvicible) 
        {
            if (other.gameObject.CompareTag ("Player")) 
            {
                playerController.AddPlayerHealth (-damage);
                playerMovement.isKnockedBacked = true;
                if (other.transform.position.x < transform.position.x) 
                {
                    playerMovement.knockFromRight = true;
                } 
                else 
                {
                    playerMovement.knockFromRight = false;
                }
                StartCoroutine ("KnockBackEffectsDuration");
            }
        }
    }

    IEnumerator KnockBackEffectsDuration ()
    {
        player.GetComponent<Animator> ().SetTrigger ("GotHurt");                                                                
        StartCoroutine (playerController.Invicibility (3.0f));                                                                  
        yield return new WaitForSeconds (0.2f);
        playerMovement.isKnockedBacked = false;
        playerMovement.enabled = false;                                                                     
        yield return new WaitForSeconds (0.2f);
        playerMovement.enabled = true;                                                                      
    }
}

此外,这是另一个脚本中的 Invicibility IEnumerator。

public IEnumerator Invicibility (float duration)
{
    isInvicible = true;
    yield return new WaitForSeconds (duration);
    isInvicible = false;
    player.GetComponent<Animator> ().SetTrigger ("GoIdle");                                         
}

HitThePlayer 脚本引用了其他脚本,因此如果您还需要我调出这些脚本,请告诉我。

看起来你可能没有在无敌结束时检查与尖刺的碰撞,尽管没有发布足够的代码来确定。确保在无敌结束时调用 OnTriggerEnter2D 函数。

问题是进入秒杀触发后玩家受到伤害,当无敌消失时,你的玩家已经进入秒杀触发,因此不会再次调用此方法。解决此问题的一种方法是不要让 OnTriggerEnter 直接损坏玩家,而应使用 OnTriggerEnter 和 OnTriggerExit 来设置一个布尔值来确定玩家是否 可以 被损坏。例如:

bool damageable;

void Update()
{
        if (!playerController.isInvicible && damageable) 
        {
             // damage, knockback, etc the player here;
        }
}

void OnTriggerEnter2D(Collider2D other)
{
    if (other.gameObject.CompareTag ("Player")) 
        damageable = true;
}

void OnTriggerExit2D(Collider2D other)
{
    if (other.gameObject.CompareTag ("Player")) 
        damageable = false; // player is still damageable unless he leaves spikes
}