站在陷阱上无敌后被击中
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
}
我正在开发一款简单的 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
}