Задать вопрос
BRO_TIGER
@BRO_TIGER
Indie Developer (C#, JS)

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

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

Вот скрипт PreviewObject.cs:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class PreviewObject : MonoBehaviour
{
    public objectsorta sort;
    public Material green;
    public Material red;

    public bool IsBuildable;
    public bool IsDetail;

    public LayerMask Detail;

    public bool second;
    public bool OnTriggerBuildable;
    public bool OnTriggerDetail;

    public PreviewObject childCol;

    public Transform graphics;


    void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.layer == 9)
            OnTriggerBuildable = true;

        if (other.gameObject.layer == 10)
        {
            OnTriggerDetail = true;

            if (Input.GetMouseButtonDown(1))
            {
                Destroy(other);
                OnTriggerDetail = false;
            }

        }

    }

    void OnTriggerExit(Collider other)
    {
        if (other.gameObject.layer == 9)
            OnTriggerBuildable = false;

        if (other.gameObject.layer == 10)
        {
            OnTriggerDetail = false;
        }
    }


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

    public void changecolor()
    {
        if (sort == objectsorta.foundation)
        {
            if (!OnTriggerBuildable)
            {
                IsBuildable = true;
            }
            else
            {
                IsBuildable = false;
            }

            if (!OnTriggerDetail)
            {
                IsDetail = true;
            }
            else
            {
                IsDetail = false;
            }

            if (!OnTriggerBuildable && !OnTriggerDetail)
            {
                IsBuildable = true;
                IsDetail = true;
            }
            else
            {
                IsBuildable = false;
                IsDetail = 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 objectsorta
{
    normal,
    foundation,
    floor,
}

EDIT: Если что, этот скрипт на основе bool а не на основе списка массивов...
  • Вопрос задан
  • 651 просмотр
Подписаться 1 Оценить 1 комментарий
Решения вопроса 1
MrMureno
@MrMureno Куратор тега Unity
VR for all
И вправду много написали и понять не просто.
Но как мне показалось, вам нужно сделать определение..можно в это место ставить объект или нет.
и вы решили сделать это через слои и триггеры.
Суть проблемы если я правильно понял в том, что когда вы удаляете здание из какого-то другого скрипта, у вас не срабатывает
void OnTriggerExit(Collider other)
поэтому ни с булевскими переменными, ни со списком коллайдеров - варианты не работают.
Как вариант решения костылем, чтоб ничего не менять почти - можно попробовать почистить список (предположив что после удаления ничего не касается превью объект), а после вкл/выкл объект или еще как то..как будто заново проверить на касание с остальными коллайдерами.
к примеру запустить OnTriggerStay и проверить кого он касается сейчас, а не только на входе и выходе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы