如何让玩家在代码中忽略与另一个游戏对象的碰撞?



我目前正试图为我的游戏编写一个生命值系统,我希望我的玩家GameObject忽略与生命值药水GameObject的碰撞,如果玩家有最大的生命值。我的问题是我不能简单地关闭玩家层和生命药水层之间的碰撞,因为我只想在玩家拥有最大生命值时忽略碰撞。我试着自己做,但没有用。下面是我的代码:

public class ExampleCodeUA : MonoBehaviour{
public int PlayerMaxHealth = 100, PlayerCurrentHealth;
public HealthBar healthBar;
private void Start()
{
PlayerCurrentHealth = PlayerMaxHealth;
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("HealthPotion"))
{
if (PlayerCurrentHealth == PlayerMaxHealth)
{
Physics2D.IgnoreLayerCollision(6, 7);
}
else if (PlayerCurrentHealth > 50)
{
GetHealth(PlayerMaxHealth - PlayerCurrentHealth);
}
else if (PlayerCurrentHealth <= 50)
{
GetHealth(50);
}
}
}
void GetHealth(int healing)
{
PlayerCurrentHealth += healing;
healthBar.SetHealth(PlayerCurrentHealth);
}

}

你不想在运行时修改你的物理配置。你能做些什么来避免碰撞?就是让它变得不可能,因为没有东西可以碰撞。你的两个对象都有一个碰撞器。你可以做的是通过修改代码来禁用所有现有的HealthPotion碰撞器。可以这样实现:

using System.Collections.Generics;
using UnityEngine;
public class HealthPotion : MonoBehaviour
{
private static List<HealthPotion> _existingPotions = new List<HealthPotion>();
public static void EnablePotionsCollider(bool value)
{
foreach (var potion in _existingPotions)
{
potion._collider.enabled = value;
}
}
private Collider _collider;
void Awake()
{
_collider = GetComponent<Collider>();
}
void OnEnable()
{
_existingPotions.Add(this);
}
void OnDisable()
{
_existingPotions.Remove(this);
}
}

当你想通过

启用/禁用时,你只需要调用这个方法
HealthPotion.EnablePotionsCollider(value you want);

相关内容

最新更新