C# 站在陷阱上不可侵犯后被击中

C# 站在陷阱上不可侵犯后被击中,c#,unity5,C#,Unity5,我正在制作一个简单的2D平板游戏,在这个游戏中我制作了一个击退效果。当玩家被障碍物击中时,目前只是一个扣球,他有一个击退和暂时的不可侵犯性,所以当在不可侵犯性期间站在扣球上时,他不会被击中。然而,一旦不可侵犯性结束,我想让玩家被钉子击中,如下图所示 玩家被击中是因为不可侵犯性消失了,它正站在钉子上。我的问题是,如果不可侵犯性结束,玩家仍然站在钉子上,它不会被击中,在离开钉子之前不会受到伤害。你能建议我如何解决这个问题吗?这是我打球员的代码 using System.Collections; u

我正在制作一个简单的2D平板游戏,在这个游戏中我制作了一个击退效果。当玩家被障碍物击中时,目前只是一个扣球,他有一个击退和暂时的不可侵犯性,所以当在不可侵犯性期间站在扣球上时,他不会被击中。然而,一旦不可侵犯性结束,我想让玩家被钉子击中,如下图所示

玩家被击中是因为不可侵犯性消失了,它正站在钉子上。我的问题是,如果不可侵犯性结束,玩家仍然站在钉子上,它不会被击中,在离开钉子之前不会受到伤害。你能建议我如何解决这个问题吗?这是我打球员的代码

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;                                                                      
    }
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
公共类HitThePlayer:MonoBehavior
{
公共财产损害;
游戏对象玩家;
播放控制器播放控制器;
PlayerMovement PlayerMovement;
无效开始()
{
player=GameObject.FindGameObjectWithTag(“player”);
playerController=GameObject.FindGameObjectWithTag(“GameController”).GetComponent();
playerMovement=player.GetComponent();
}
无效OnTiggerEnter2D(碰撞的R2D其他)
{
如果(!playerController.isInvicible)
{
if(other.gameObject.CompareTag(“玩家”))
{
playerController.AddPlayerHealth(-damage);
playerMovement.isKnockedBacked=true;
if(其他.transform.position.x
另外,这是另一个脚本中的不可侵犯性IEnumerator

public IEnumerator Invicibility (float duration)
{
    isInvicible = true;
    yield return new WaitForSeconds (duration);
    isInvicible = false;
    player.GetComponent<Animator> ().SetTrigger ("GoIdle");                                         
}
public IEnumerator不可侵犯性(浮动持续时间)
{
isInvicible=真;
产生返回新的WaitForSeconds(持续时间);
不可见=错误;
player.GetComponent().SetTrigger(“GoIdle”);
}

HitThePlayer脚本引用了其他脚本,因此如果您需要我也调出这些脚本,请让我知道。

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

问题是,在输入扣球触发后,玩家受到损坏,当无敌消失时,玩家已经输入扣球触发,因此不会再次调用此方法。解决这一问题的一种方法是,不要让OnTiggerEnter直接损坏玩家,而应该使用OnTiggerEnter和OnTiggerExit设置玩家是否会被损坏的布尔值。例如:

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
}

凉的在这种情况下,请将其标记为最佳答案,以便其他人知道正确答案。很抱歉。我不熟悉堆栈溢出,所以我忘了那些东西。