我目前正在尝试为我的游戏编写一个健康系统,我希望我的玩家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);
}}
发布于 2021-08-21 11:51:43
你不想在运行时修改你的物理配置。你能做些什么来避免碰撞...就是让它变得不可能,因为没有东西可以碰撞。你的两个物体都有一个碰撞器。您可以做的是通过修改代码禁用所有现有的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);https://stackoverflow.com/questions/68872058
复制相似问题