C# OnTiggerstay2D性能/备选方案

C# OnTiggerstay2D性能/备选方案,c#,unity3d,C#,Unity3d,我在敌人身上得到了一个简单的“OnTouch”脚本,如果他们有接触,就会击退玩家。然后玩家在短时间内无敌。大概是这样的: void OnTriggerEnter2D(Collider2D collider) { if (collider.gameObject.CompareTag("Player")) { if (Time.time > isInvincible) { isInvincible = Time.time + invincibl

我在敌人身上得到了一个简单的“OnTouch”脚本,如果他们有接触,就会击退玩家。然后玩家在短时间内无敌。大概是这样的:

void OnTriggerEnter2D(Collider2D collider) {
    if (collider.gameObject.CompareTag("Player")) {

        if (Time.time > isInvincible) {
            isInvincible = Time.time + invincibleTimer;

            if (enemy.IsFacingRight) {
                player.SetVelocity(knockback * Vector2.right);
            } else {
                player.SetVelocity(knockback * Vector2.left);
            }
        }
    }
}
List<Collider2D> hitColliders = new List<Collider2D>();

void OnTriggerEnter2D(Collider2D collision) {
    if (hitColliders.Contains(collision)) { return; }
    hitColliders.Add(collision);
}
void OnTriggerExit2D(Collider2D collision) {
    hitColliders.Remove(collision);
}

// Perform operations to the colliders.
void Update() { 
    foreach (var col in hitColliders) { DoStuff(col); }
}
(SetVelocity只是我用来设置..速度的一种方法)

问题是当玩家在被推开后变得不可战胜。当无敌时,你可以在敌人的头顶上奔跑并停留在那里,即使在无敌计时器用完之后。我想这是有道理的,因为它只会在回车时触发

使用相同的代码,但在“OnTiggerStay2D”中,工作正常。你被推开,变得无敌,跑到敌人身上,无敌跑出来,然后你被从敌人身上推开


但是,如果有多个敌人带着OnTiggerStay到处乱跑,并与不同的对象发生碰撞,会让人感觉性能不好吗?有没有更有效的方法?或者TriggerStay就是这样吗?

我发现的方法是手动跟踪碰撞,如下所示:

void OnTriggerEnter2D(Collider2D collider) {
    if (collider.gameObject.CompareTag("Player")) {

        if (Time.time > isInvincible) {
            isInvincible = Time.time + invincibleTimer;

            if (enemy.IsFacingRight) {
                player.SetVelocity(knockback * Vector2.right);
            } else {
                player.SetVelocity(knockback * Vector2.left);
            }
        }
    }
}
List<Collider2D> hitColliders = new List<Collider2D>();

void OnTriggerEnter2D(Collider2D collision) {
    if (hitColliders.Contains(collision)) { return; }
    hitColliders.Add(collision);
}
void OnTriggerExit2D(Collider2D collision) {
    hitColliders.Remove(collision);
}

// Perform operations to the colliders.
void Update() { 
    foreach (var col in hitColliders) { DoStuff(col); }
}
List-hitColliders=new-List();
无效OnTiggerEnter2D(已碰撞R2D碰撞){
if(hitColliders.Contains(collision)){return;}
添加(碰撞);
}
无效OnTriggerExit2D(已碰撞R2D碰撞){
碰撞器。移除(碰撞);
}
//对碰撞器执行操作。
无效更新(){
foreach(hitcollers中的var col){DoStuff(col);}
}

我找到的方法是手动跟踪碰撞,如下所示:

void OnTriggerEnter2D(Collider2D collider) {
    if (collider.gameObject.CompareTag("Player")) {

        if (Time.time > isInvincible) {
            isInvincible = Time.time + invincibleTimer;

            if (enemy.IsFacingRight) {
                player.SetVelocity(knockback * Vector2.right);
            } else {
                player.SetVelocity(knockback * Vector2.left);
            }
        }
    }
}
List<Collider2D> hitColliders = new List<Collider2D>();

void OnTriggerEnter2D(Collider2D collision) {
    if (hitColliders.Contains(collision)) { return; }
    hitColliders.Add(collision);
}
void OnTriggerExit2D(Collider2D collision) {
    hitColliders.Remove(collision);
}

// Perform operations to the colliders.
void Update() { 
    foreach (var col in hitColliders) { DoStuff(col); }
}
List-hitColliders=new-List();
无效OnTiggerEnter2D(已碰撞R2D碰撞){
if(hitColliders.Contains(collision)){return;}
添加(碰撞);
}
无效OnTriggerExit2D(已碰撞R2D碰撞){
碰撞器。移除(碰撞);
}
//对碰撞器执行操作。
无效更新(){
foreach(hitcollers中的var col){DoStuff(col);}
}

尽管即使使用现在的解决方案,您也不会遇到性能问题,但如果以后使用,您可以尝试使用:

无敌定时器开始时
呼叫:
IgnoreLayerCollision(playerLayer,enemyLayer,true)

并且在计时器调用结束时:
忽略层集合(playerLayer、enemyLayer、false)

根据文件:

IgnoreLayerCollision将重置受影响对象的触发状态 碰撞器,因此您可能会收到OnTiggerExit和OnTiggerEnter 呼叫此的响应消息。


这意味着当您调用IgnoreLayerCollision(false)时,
OnTriggerCenter
将再次被调用,即使您已经在敌人的顶部。这正是您所追求的行为。

尽管即使使用现在的解决方案,您也可能不会遇到性能问题,但如果您以后这样做,您可以尝试使用:

无敌定时器开始时
呼叫:
IgnoreLayerCollision(playerLayer,enemyLayer,true)

并且在计时器调用结束时:
忽略层集合(playerLayer、enemyLayer、false)

根据文件:

IgnoreLayerCollision将重置受影响对象的触发状态 碰撞器,因此您可能会收到OnTiggerExit和OnTiggerEnter 呼叫此的响应消息。


这意味着当您调用IgnoreLayerCollision(false)时,
OnTriggerCenter
将再次被调用,即使您已经在敌人的顶部。这正是您所追求的行为。

您可以触发不可侵犯性,并在倒计时时使用调用或协同程序将其删除,然后允许在冷却后重新激活。您可以触发不可侵犯性,并在倒计时时使用调用或协同程序将其删除,这样在冷却后它就可以被重新激活了,我也得到了同样的结果。也许我遗漏了一些东西,但只要在foreach中记录“col”,我仍然会得到很多点击率。例如,updateOk上的每一帧都会触发与地面的碰撞,我想我现在明白了。。谢谢我也得到了同样的结果。也许我遗漏了一些东西,但只要在foreach中记录“col”,我仍然会得到很多点击率。例如,updateOk上的每一帧都会触发与地面的碰撞,我想我现在明白了。。谢谢