Physics OverlapSphere 不检测碰撞
Physics OverlapSphere does not detect Collision
我想在我的玩家剑上创建一个碰撞器,如果他攻击他会检测到并通过动画事件转动 off/on 一个名为(Damage Point)的游戏对象,它是一个附加脚本,可以减去敌人的健康。
但是在某个地方它没有正确检测到。我尝试添加 OnDrawGizmos 函数来查看我的球体对撞机,但即使将其变大也无法检测到。
关于我的问题最奇怪的事情是我对我的怪物箱子和我的幻想玩家使用相同的代码,但是对于箱子它有效但对于玩家它没有。
我创建了一个名为 PlayerDamage 的 class,它附加在我剑尖上的一个空游戏对象上。
{
public class PlayerDamage : MonoBehaviour
public int damageAmount = 2;
public LayerMask enemyLayer;
void Update()
{
Collider[] hits = Physics.OverlapSphere(transform.position, 1.7f, enemyLayer);
if (hits.Length > 0)
{
if (hits[0].gameObject.tag == MyTags.ENEMY_TAG)
{
print("COLLIDED WITH ENEMY");
}
}
}
private void OnDrawGizmos()
{
Gizmos.DrawWireSphere(transform.position, 1.7f);
}
在另一个直接附加到播放器的名为 PlayerScript 的脚本中,我有一个名为 Attack 的函数:
void Attack()
{
if (Input.GetKeyDown(KeyCode.K))
{
if (!anim.GetCurrentAnimatorStateInfo(0).IsName(MyTags.ATTACK_ANIMATION) || !anim.GetCurrentAnimatorStateInfo(0).IsName(MyTags.RUN_ATTACK_ANIMATION))
{
anim.SetTrigger(MyTags.ATTACK_TRIGGER);
}
}
}
同样在 PlayerScript class 中有两个函数称为 ActivateDamagePoint 和 DeactivateDamagePoint,它们被分配给攻击动画的动画事件。
void ActivateDamagePoint()
{
damagePoint.SetActive(true);
}
void DeactivateDamagePoint()
{
damagePoint.SetActive(false);
}
我仔细检查了一切都在他的层上,标签没问题,但这并没有解决我的问题。
就像我之前对箱子所说的那样,我使用相同的代码并且它有效,但不幸的是它不适用于我的播放器。我也有 Activate 和 Deactivate DamagePoint 函数,这些函数也被我的胸部攻击动画的动画事件调用。
好的,经过 1 小时的调试,我终于找到了解决方案:
它在 MyTags class(所有字符串变量的助手 class)中,错误是:
public static string ENEMY_TAG = "Enemey";
而不是:
public static string ENEMY_TAG = "Enemy";
我想在我的玩家剑上创建一个碰撞器,如果他攻击他会检测到并通过动画事件转动 off/on 一个名为(Damage Point)的游戏对象,它是一个附加脚本,可以减去敌人的健康。 但是在某个地方它没有正确检测到。我尝试添加 OnDrawGizmos 函数来查看我的球体对撞机,但即使将其变大也无法检测到。
关于我的问题最奇怪的事情是我对我的怪物箱子和我的幻想玩家使用相同的代码,但是对于箱子它有效但对于玩家它没有。
我创建了一个名为 PlayerDamage 的 class,它附加在我剑尖上的一个空游戏对象上。
{
public class PlayerDamage : MonoBehaviour
public int damageAmount = 2;
public LayerMask enemyLayer;
void Update()
{
Collider[] hits = Physics.OverlapSphere(transform.position, 1.7f, enemyLayer);
if (hits.Length > 0)
{
if (hits[0].gameObject.tag == MyTags.ENEMY_TAG)
{
print("COLLIDED WITH ENEMY");
}
}
}
private void OnDrawGizmos()
{
Gizmos.DrawWireSphere(transform.position, 1.7f);
}
在另一个直接附加到播放器的名为 PlayerScript 的脚本中,我有一个名为 Attack 的函数:
void Attack()
{
if (Input.GetKeyDown(KeyCode.K))
{
if (!anim.GetCurrentAnimatorStateInfo(0).IsName(MyTags.ATTACK_ANIMATION) || !anim.GetCurrentAnimatorStateInfo(0).IsName(MyTags.RUN_ATTACK_ANIMATION))
{
anim.SetTrigger(MyTags.ATTACK_TRIGGER);
}
}
}
同样在 PlayerScript class 中有两个函数称为 ActivateDamagePoint 和 DeactivateDamagePoint,它们被分配给攻击动画的动画事件。
void ActivateDamagePoint()
{
damagePoint.SetActive(true);
}
void DeactivateDamagePoint()
{
damagePoint.SetActive(false);
}
我仔细检查了一切都在他的层上,标签没问题,但这并没有解决我的问题。
就像我之前对箱子所说的那样,我使用相同的代码并且它有效,但不幸的是它不适用于我的播放器。我也有 Activate 和 Deactivate DamagePoint 函数,这些函数也被我的胸部攻击动画的动画事件调用。
好的,经过 1 小时的调试,我终于找到了解决方案:
它在 MyTags class(所有字符串变量的助手 class)中,错误是:
public static string ENEMY_TAG = "Enemey";
而不是:
public static string ENEMY_TAG = "Enemy";