C# 站在陷阱上不可侵犯后被击中
我正在制作一个简单的2D平板游戏,在这个游戏中我制作了一个击退效果。当玩家被障碍物击中时,目前只是一个扣球,他有一个击退和暂时的不可侵犯性,所以当在不可侵犯性期间站在扣球上时,他不会被击中。然而,一旦不可侵犯性结束,我想让玩家被钉子击中,如下图所示 玩家被击中是因为不可侵犯性消失了,它正站在钉子上。我的问题是,如果不可侵犯性结束,玩家仍然站在钉子上,它不会被击中,在离开钉子之前不会受到伤害。你能建议我如何解决这个问题吗?这是我打球员的代码C# 站在陷阱上不可侵犯后被击中,c#,unity5,C#,Unity5,我正在制作一个简单的2D平板游戏,在这个游戏中我制作了一个击退效果。当玩家被障碍物击中时,目前只是一个扣球,他有一个击退和暂时的不可侵犯性,所以当在不可侵犯性期间站在扣球上时,他不会被击中。然而,一旦不可侵犯性结束,我想让玩家被钉子击中,如下图所示 玩家被击中是因为不可侵犯性消失了,它正站在钉子上。我的问题是,如果不可侵犯性结束,玩家仍然站在钉子上,它不会被击中,在离开钉子之前不会受到伤害。你能建议我如何解决这个问题吗?这是我打球员的代码 using System.Collections; u
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
}
凉的在这种情况下,请将其标记为最佳答案,以便其他人知道正确答案。很抱歉。我不熟悉堆栈溢出,所以我忘了那些东西。