C# OnTiggerstay2D性能/备选方案
我在敌人身上得到了一个简单的“OnTouch”脚本,如果他们有接触,就会击退玩家。然后玩家在短时间内无敌。大概是这样的:C# OnTiggerstay2D性能/备选方案,c#,unity3d,C#,Unity3d,我在敌人身上得到了一个简单的“OnTouch”脚本,如果他们有接触,就会击退玩家。然后玩家在短时间内无敌。大概是这样的: void OnTriggerEnter2D(Collider2D collider) { if (collider.gameObject.CompareTag("Player")) { if (Time.time > isInvincible) { isInvincible = Time.time + invincibl
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上的每一帧都会触发与地面的碰撞,我想我现在明白了。。谢谢