Изменение цвета куба при попадании в тригер

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Изменение цвета куба при попадании в тригер

Сообщение e-x 20 сен 2022, 13:57

Добрый День!
Задача.
Куб полностью попадает в триггер и меняет цвет.
Код реализации.
Синтаксис:
Используется csharp
using UnityEngine;

namespace color
{

    public class Colorobjekts : MonoBehaviour
    {
        public GameObject Cube;
        private void OnTriggerStay(Collider other)
        {
            Cube.GetComponent<Renderer>().material.color = Color.black;
        }
        private void OnTriggerExit(Collider other)
        {
            Cube.GetComponent<Renderer>().material.color = Color.white;
        }
    }
}

Итого.
Не могу достичь желаемый результат, как только куб соприкасается с тригером то сразу окрашивается, а мне надо чтоб только тогда когда крайняя граница куба полностью войдет в тригер, тоесть весь куб в тригере. Как так сделать? Помогите плиз.Спасибо!
e-x
UNIт
 
Сообщения: 141
Зарегистрирован: 20 июн 2022, 16:47

Re: Изменение цвета куба при попадании в тригер

Сообщение 1max1 20 сен 2022, 18:34

По углам куба сделай маленькие триггерочки и меняй цвет, когда они все войдут в триггер))
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Изменение цвета куба при попадании в тригер

Сообщение Saltant 20 сен 2022, 18:41

а че незя просто взять центр куба и центр триггера и чекнуть расстояние, если центры сошлись то куб полностью в зоне.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2234
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Изменение цвета куба при попадании в тригер

Сообщение e-x 21 сен 2022, 15:47

1.Ну наверно не тригерочки а просто по углам моего элементы развесить любые элементы (кубы например) очень маленькие,некие маяки))...каждому дать тег и в условии прописать, что если все маяки в зоне тригера то меняем цвет.Мои маяки дочерние элементы.Как чекнуть тег у дочернего элемента?

if (other.CompareTag("Corner")) не работает так, покажите пример кода плиз для проверки тега дочернего элемента.

2.Да у меня не куб а сложный элемент из кубов, я куб так написал)...тут непонятно где тот центр.

Спасибо!
e-x
UNIт
 
Сообщения: 141
Зарегистрирован: 20 июн 2022, 16:47

Re: Изменение цвета куба при попадании в тригер

Сообщение e-x 21 сен 2022, 17:03

Или даже если тригерочки...например у меня тег у всех test ....как в коде записать ( если все 4 тест зашли то бла бла бла)....не лепить же на каждый маяк тег отдельный?
e-x
UNIт
 
Сообщения: 141
Зарегистрирован: 20 июн 2022, 16:47

Re: Изменение цвета куба при попадании в тригер

Сообщение Alkos26Rus 21 сен 2022, 20:47

Триггер не проверяет дочерние коллайдеры на столкновение, только тот на котором висит скрипт. Тебе нужно на каждый колайдер вешать скрипт, а затем уже из какого то главного скрипта с помощью цикла перебирать все ли колайдеры в зоне
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Изменение цвета куба при попадании в тригер

Сообщение e-x 22 сен 2022, 15:34

Итого, я создал тригерочки, получилось их 12 шт, развесил их по всем углам моего предмета, создал главный скрипт, повесил его на пустой предмет (по сути не важно куда его вешать). В главном скрипте создал 12 булевых переменных.Каждый тригер из 12 когда входит в основной тригер говорит что переменная в основном скрипте = true.В основном скрипте на апдейте стоит проверка....если все переменные = true то окрашиваем в черный, если хотя бы одна переменная = false то окрашиваем в белый.Все прекрасно заработало, даже идеально, но мне кажется все у меня по дебильному, нужен совет гуру.

На всех событиях поставил вывод в консоль информацию, чтоб понимать работает или нет.
Вижу такое ,запускаю игру и меня в консоли долбит ....белый =23456 раз, хотя еще ниче даже не сделал, просто нажал плей.Понято почему, так как в апдейте у меня в основном скрипте стоит если все false то цвет белый, когда окрашивает в черный то соответсвенно черный = 34889 Также на каждый тригерочек у меня отдельный скрипт, итого 12 скриптов на тригерочках и один главный.Правильно ли это?
Скрипты.
те 12 на тригерочках
Синтаксис:
Используется csharp
using UnityEngine;
namespace test
{

    public class Lighthouse_1 : MonoBehaviour
    {

        private void OnTriggerEnter(Collider other)
        {
            if (other.gameObject.CompareTag("Colour"))
            {
                Colormaster.lighthouse1 = true;                
            }
        }
        private void OnTriggerExit(Collider other)

        {
            if (other.gameObject.CompareTag("Colour"))
            {
                Colormaster.lighthouse1 = false;
            }
        }
    }
}

 


и вот основной

Синтаксис:
Используется csharp
using UnityEngine;

namespace test
{

    public class Colormaster : MonoBehaviour
    {

        public GameObject Cube1;
        public GameObject Cube2;
        public GameObject Cube3;
        public GameObject Cube4;

        public static bool lighthouse1 = false;
        public static bool lighthouse2 = false;
        public static bool lighthouse3 = false;
        public static bool lighthouse4 = false;
        public static bool lighthouse5 = false;
        public static bool lighthouse6 = false;
        public static bool lighthouse7 = false;
        public static bool lighthouse8 = false;
        public static bool lighthouse9 = false;
        public static bool lighthouse10 = false;
        public static bool lighthouse11 = false;
        public static bool lighthouse12 = false;

        public void Update()
        {
            if (lighthouse1 == true && lighthouse2 == true && lighthouse3 == true && lighthouse4 == true && lighthouse5 == true && lighthouse6 == true && lighthouse7 == true && lighthouse8 == true && lighthouse9 == true && lighthouse10 == true && lighthouse11 == true && lighthouse12 == true)
            {
                Cube1.GetComponent<Renderer>().material.color = Color.black;
                Cube2.GetComponent<Renderer>().material.color = Color.black;
                Cube3.GetComponent<Renderer>().material.color = Color.black;
                Cube4.GetComponent<Renderer>().material.color = Color.black;
                Debug.Log("55");
            }
            if (lighthouse1 == false || lighthouse2 == false || lighthouse3 == false || lighthouse4 == false || lighthouse5 == false || lighthouse6 == false || lighthouse7 == false || lighthouse8 == false || lighthouse9 == false || lighthouse10 == false || lighthouse11 == false || lighthouse12 == false)
            {
                Cube1.GetComponent<Renderer>().material.color = Color.white;
                Cube2.GetComponent<Renderer>().material.color = Color.white;
                Cube3.GetComponent<Renderer>().material.color = Color.white;
                Cube4.GetComponent<Renderer>().material.color = Color.white;
                Debug.Log("54");
            }
        }
    }
}

 
e-x
UNIт
 
Сообщения: 141
Зарегистрирован: 20 июн 2022, 16:47

Re: Изменение цвета куба при попадании в тригер

Сообщение breNnor- 23 сен 2022, 18:08

Как я понял, так и сделал. Вот тут все работает как надо.
Совет: старайся как можно меньше использовать Update.

Этот скрипт как управляющий, вешать его можно хоть куда. (Я вешал на камеру)
Синтаксис:
Используется csharp
using UnityEngine;

public class ColorMaster : MonoBehaviour
{
    [SerializeField] Renderer[]                   Cubes       = new Renderer[4];
    [SerializeField] TriggerBoxCollider[]         LightHouses = new TriggerBoxCollider[16];

    public void Check_LightHouses()
    {
        foreach (TriggerBoxCollider check in LightHouses)
        {
            if (check.GetInTriggerState() == false)
            {
                Change_Color(false);
                return;
            }

            Change_Color(true);
        }
    }

    private void Change_Color (bool white)
    {
        foreach (Renderer rend in Cubes)
        {
            if (white == true)  rend.material.color = Color.white;
            else                rend.material.color = Color.black;
        }
    }
}

 


Этот скрипт ты вешаешь на дочерние объекты внутри куба
Синтаксис:
Используется csharp
using UnityEngine;

public class TriggerBoxCollider : MonoBehaviour
{
    [SerializeField] ColorMaster _colorMaster; // СЮДА ДОБАВИТЬ ОСНОВНОЙ СКРИПТ ЧЕРЕЗ ИНСПЕКТОР. (В моем случае камера)
    private bool _inTrigger = false;

    private void OnTriggerEnter(Collider other)
    {
        if (other.CompareTag("Colour"))
        {
            _inTrigger = true;
            _colorMaster.Check_LightHouses();

        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.CompareTag("Colour"))
        {
            _inTrigger = false;
            _colorMaster.Check_LightHouses();
        }
    }

    public bool GetInTriggerState ()
    {
        return _inTrigger == true;
    }
}

 


На объекте Trigger нужен Rigidbody, и тэг Colour (По нему идет проверка!)(Последний скриншот)

ИзображениеИзображениеИзображениеИзображениеИзображение
Последний раз редактировалось breNnor- 26 сен 2022, 15:48, всего редактировалось 2 раз(а).
•−−• •−• •• •−− • − −−••−−
Аватара пользователя
breNnor-
UNIт
 
Сообщения: 55
Зарегистрирован: 15 сен 2021, 17:20
Откуда: Тюмень
Skype: Null

Re: Изменение цвета куба при попадании в тригер

Сообщение e-x 23 сен 2022, 19:21

Про апдейты понял.Спасибо.

только тут цвет наоборот,я исправил
if (white == true) rend.material.color = Color.black;
else rend.material.color = Color.white;


не совсем понял как это работает

[SerializeField] Colormain _colorMaster;

я указал, в поле , объект на котором висит управляющий скрипт,верно же? но ведь если мы хотим обратиться к переменным из одного скрипта в другой то в одном создаем public static ....в другом пишем имякскрипта.переменная...а тут както бац и все в одном поле, дайте тут плиз коммент.
Конечно крутяк!
Вот пример двух решений, оба рабочие , один мой уродство, второй гениально.
Спасибо!
e-x
UNIт
 
Сообщения: 141
Зарегистрирован: 20 июн 2022, 16:47

Re: Изменение цвета куба при попадании в тригер

Сообщение breNnor- 23 сен 2022, 19:46

e-x писал(а):Про апдейты понял.Спасибо.

только тут цвет наоборот,я исправил
if (white == true) rend.material.color = Color.black;
else rend.material.color = Color.white;


не совсем понял как это работает

[SerializeField] Colormain _colorMaster;

я указал, в поле , объект на котором висит управляющий скрипт,верно же? но ведь если мы хотим обратиться к переменным из одного скрипта в другой то в одном создаем public static ....в другом пишем имякскрипта.переменная...а тут както бац и все в одном поле, дайте тут плиз коммент.
Конечно крутяк!
Вот пример двух решений, оба рабочие , один мой уродство, второй гениально.
Спасибо!


Эта строка означает что мы обращаемся к конкретному игровому объекту с этим скриптом(И все что в этом скрипте имеет модификатор доступа public, все это нам доступно).
И этих объектов может быть много(Поэтому удобно держать ссылку на конкретный объект, чем Static).

Я просто не использую статические модификаторы доступа.
Я создаю изначально закрытые переменные private, и по надобности открываю, либо добавляю Get; это делается чтобы не было возможности изменять данные из других скриптов.

Еще изменения:
Синтаксис:
Используется csharp
public Renderer[]                   Cubes       = new Renderer[4];
public TriggerBoxCollider[]         LightHouses = new TriggerBoxCollider[16];
 


на
Синтаксис:
Используется csharp
[SerializeField] Renderer[]                   Cubes       = new Renderer[4];
[SerializeField] TriggerBoxCollider[]         LightHouses = new TriggerBoxCollider[16];
 
•−−• •−• •• •−− • − −−••−−
Аватара пользователя
breNnor-
UNIт
 
Сообщения: 55
Зарегистрирован: 15 сен 2021, 17:20
Откуда: Тюмень
Skype: Null


Вернуться в Почемучка

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

Сейчас этот форум просматривают: Google [Bot] и гости: 21