Как удалить GameObject и при этом удалить Missing Collider?

Программирование на Юнити.

Как удалить GameObject и при этом удалить Missing Collider?

Сообщение RUS_DEVELOPER 28 июн 2017, 16:51

Доброго времени суток! На своём проекте я сделал скрипты BuildingSystem.cs (Систему строительства) и PreviewObject.cs (Предварительный просмотр объекта), проблема заключается с PreviewObject.cs... Существовал список коллайдеров игровых объектов, когда Объект с превязанным скриптом заходил на Trigger, к примеру Коллайдер Воды, то он менял "Материал" Объекта на текстуру красного цвета и построить объект нельзя было потому что он выключал bool isBuildable который в скрипте BuildingSystem.cs проверяется оператором if, а если на Коллайдер Суши направить Объект, то он менял текстуру на зеленый цвет и объект можно было построить... Коллайдер Воды имеет слой 9. Buildable а в скрипте PreviewObject.cs указанно что при заходе на этот слой он добавлял Коллайдер данного Объекта (Воды) в свой список а при выходе из этого Коллайдера он его удалял... Если коллайдеров в списке 0 то bool IsBuildable был включен. Здесь всё нормально, но дело в том, что мне надо было добавить ещё один слой Buildings т.е. если я построил и опять на постройку направил Объект, то он горел бы красным и построить объект нельзя было ведь его Коллайдер в списке, но в скрипте есть ещё функция удаления с помощью правой кнопки мыши... И когда я наводил на объект и удалял его Коллайдер в списке оставался (Missing) и построить ничего нельзя... Пытался заменить системой Bool но тоже самое... Я пытался вместе с этим действием Remove из списка но не помогло... Мда... Я дофигу написал но надеюсь разберётесь, но если короче суть проблемы если я правильно понял в том, что когда я удаляю здание из какого-то другого скрипта, у меня не срабатывает
void OnTriggerExit(Collider other)... Заранее Спасибо!

Вот Скрипт:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PreviewObject : MonoBehaviour
{
    public List<Collider> col = new List<Collider>();
    public objectsorts sort;
    public Material green;
    public Material red;
    public bool IsBuildable;
    public bool IsDetail;

    public bool second;

    public PreviewObject childcol;

    public Transform graphics;

    public void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.layer == 9)
            col.Add(other);

        if (other.gameObject.layer == 10)
            col.Add(other);
    }

    public void OnTriggerExit(Collider other)
    {
        if (other.gameObject.layer == 9)
            col.Remove(other);

        if (other.gameObject.layer == 10)
            col.Remove(other);
    }

    void Update()
    {
        if (!second)
            changecolor();
    }


    public void changecolor()
    {

        if (sort == objectsorts.foundation)
        {
            if (col.Count == 0)
            {
                IsDetail = true;
                IsBuildable = true;
            }
            else
            {
                IsDetail = false;
                IsBuildable = false;
            }
        }
        else
        {
            if (col.Count == 0 && childcol.col.Count > 0)
            {
                IsDetail = true;
                IsBuildable = true;
            }
            else
            {
                IsDetail = false;
                IsBuildable = false;
            }
        }

        if (IsBuildable)
        {
            foreach (Transform child in graphics)
            {
                child.GetComponent<Renderer>().material = green;
            }
        }
        else
        {
            foreach (Transform child in graphics)
            {
                child.GetComponent<Renderer>().material = red;
            }
        }

        if (IsDetail)
        {
            foreach (Transform child in graphics)
            {
                child.GetComponent<Renderer>().material = green;
            }
        }
        else
        {
            foreach (Transform child in graphics)
            {
                child.GetComponent<Renderer>().material = red;
            }
        }
    }
}


public enum objectsorts
{
    normal,
    foundation,
    floor
}
 
RUS_DEVELOPER
UNец
 
Сообщения: 22
Зарегистрирован: 05 фев 2017, 07:13

Re: Как удалить GameObject и при этом удалить Missing Collider?

Сообщение samana 28 июн 2017, 19:31

RUS_DEVELOPER писал(а):, но если короче суть проблемы если я правильно понял в том, что когда я удаляю здание из какого-то другого скрипта, у меня не срабатывает
void OnTriggerExit(Collider other)

Если проблема действительно в этом (надо бы продебажить, просто я не разбирался самостоятельно), то перед удалением здания вызовите метод OnTriggerExit этого скрипта самостоятельно, через ссылку на данный скрипт.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Как удалить GameObject и при этом удалить Missing Collider?

Сообщение RUS_DEVELOPER 29 июн 2017, 13:02

Мда... Всё было проще чем я думал...
Я просто в PreviewObject.cs создал метод [Destroy()]
Вот такой:

Синтаксис:
Используется csharp
 
   public void Destroy()
    {
        if (Physics.Raycast(cam.transform.position, cam.transform.forward, out hit, 20, detailLayer))
        {
            Destroy(hit.transform.gameObject);
        }
    }
 


А дальше в Методе Обновления с помощью Оператора вызывал этот метод а после него просто ставил [IsBuildable = true;]
Вот так:

Синтаксис:
Используется csharp
    void Update ()
    {

        if (Input.GetMouseButtonDown(1))
        {
            Destroy();
            IsBuildable = true;
        }
    }
 


Тема закрыта...
RUS_DEVELOPER
UNец
 
Сообщения: 22
Зарегистрирован: 05 фев 2017, 07:13


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6