При соприкосновении двух одинаковых объектов удалить только один

Рейтинг: 1Ответов: 2Опубликовано: 29.05.2023

Делаю игру по типу Jelly Run 2048, У меня есть скрипт куба, в котором реализован метод onTriggerEnter, и при соприкосновении кубов уничтожаются оба куба.

как сделать, чтобы уничтожался только один куб?

public class Cube : MonoBehaviour
{
    public ECubePower Power;
    public Material[] Materials;

    private MeshRenderer _meshRenderer;

    private void Start()
    {
        _meshRenderer = GetComponent<MeshRenderer>();
        _meshRenderer.material = Materials[(int)Power];
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.TryGetComponent<Cube>(out Cube cube))
        {
            UpPower(cube.Power);
            Destroy(cube.gameObject);
        }
    }

    public void UpPower(ECubePower PowerLevel)
    {
        Power += (int)PowerLevel;
    }

    public void DownPower(ECubePower PowerLevel)
    {
        Power -= (int)PowerLevel;
    }
}
public enum ECubePower
{
    a,
    b,
    c,
    d,
    e,
}

Ответы

▲ 1Принят

Добавьте в перечисление нулевой элемент, назовем его например Zero

public enum ECubePower
{
    Zero,
    a,
    b,
    c,
    d,
    e,
}

Тогда можно сделать так, что если Power куба равнялся Zero, то он самоуничтожался.

public void DownPower(ECubePower PowerLevel)
{
    Power -= (int)PowerLevel;
    if (Power == ECubePower.Zero)
       Destroy(gameObject);
}

А триггер реализовать как-то так

private void OnTriggerEnter(Collider other)
{
    if (Power != ECubePower.Zero && other.TryGetComponent<Cube>(out Cube cube))
    {
        var power = cube.Power;
        UpPower(power);
        cube.DownPower(power);
    }
}
▲ 0

У тебя кубы одинаковые, а должны быть технически разными. На тех кубах, что двигаются делай OnTriggerEnter, где будет вся логика обработки столкновения; а на неподвижных просто оставляй триггер, т. к. на них не должно быть никакой логики обработки столкновения.