Форум программистов, компьютерный форум, киберфорум
Unity, Unity3D
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116

Привязка объектов сцены в скрипт на префабе

10.12.2023, 17:49. Показов 2664. Ответов 33

Студворк — интернет-сервис помощи студентам
Всепривет!
Назрел такой вопрос, пока ответа не нашел, лучше спрошу.
На сцене лежит куб, на кубе скрипт- если в радиусе 3 есть объект Игрок (targetObject), можно по нажатии кнопки выполнить перемещение этого объекта в руку (Pickup). targetObject и Pickup я могу указать в инспекторе.
Скрипт тут:
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class BoxPickup3 : MonoBehaviour
{
    public Transform targetObject;
    public Transform Pickup;
    public float interactionRadius;
    public void ToggleOn()
    {
        float distance = Vector3.Distance(transform.position, targetObject.position);
        if (distance <= interactionRadius)
        {
            GetComponent<BoxCollider>().enabled = false;
            GetComponent<Rigidbody>().useGravity = false;
            transform.position = Pickup.position;
            transform.parent = GameObject.Find("Pickup").transform;
        }
    }
    public void ToggleOff()
    {
        transform.parent = null;
        GetComponent<Rigidbody>().useGravity = true;
        GetComponent<BoxCollider>().enabled = true;
    }
}


Суть проблемы в том, что куб находится на сцене и всё нормально работает, но в дальнейшем мне нужно будет сделать так, что бы такие-же новые кубы появлялись на сцене, а значит префаб куба должен уже быть с настроенным скриптом, где указан игрок- targetObject и рука- Pickup.
Т.е. на старте в private void start() указать, что targetObject = модель игрока, Pickup = рука игрока..

Пока вижу только такой вариант- прячу настроенный образцовый куб под карту и клонирую его куда надо.

Добавлено через 33 минуты
Но тогда скрипт работает именно на образцовом кубе.
Кнопка на канвасе в режиме toggle, я туда перетянул образцовый куб и функционал этого скрипта, как быть с клонами куба?
Объединить кубы в стэк и скрипт на стэк- так они все возьмутся
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.12.2023, 17:49
Ответы с готовыми решениями:

Не работает скрипт в префабе
Создал скрипт, повесил его на префаб и заметил, что не один из паблик переменных не отображается в инспекторе и сам скрипт не работает....

Фиксация объектов сцены
Как зафиксировать объекты сцены (У меня например TextField и Password field ,ну и кнопки) по середине. а то у меня они при расширении...

Удаление объектов со сцены
Привет! Есть сцена, на ней клонируются объекты. Нужно: при нажатию левой кнопки по объекту, удалить этот объект. Пробовал вот таким...

33
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
13.12.2023, 18:16  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ПСВ Посмотреть сообщение
Массив нельзя расширять, а список не принимает FindGameObjectsWithTag.
Может через триггер будет проще? У игрока спереди коллайдер, получается нужно обновлять поиск коробок не всех, а тех, которые возбудили коллайдер и цепляться к первой попавшейся..?
0
 Аватар для ПСВ
39 / 32 / 8
Регистрация: 29.03.2020
Сообщений: 184
13.12.2023, 18:21
Цеплять коробки надо только те, что в коллайдере, но у тебя это происходит в методе по нажатию UI кнопки, а как туда проверку на коллизии вставить, я не скажу. Возможно это можно найти в документации.
0
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
13.12.2023, 18:22  [ТС]
Возможно пригодится использовать при нажатии на кнопку- получать значение transform через OnTriggerEnter
0
 Аватар для ПСВ
39 / 32 / 8
Регистрация: 29.03.2020
Сообщений: 184
13.12.2023, 18:56
Возможно в OnTriggerEnter прописать, чтобы объекты добавлялись в список, а при нажатии на кнопку проходила проверка, на подобии той, что я написал (через цикл).

Добавлено через 29 минут
Сначала объявить список:
List<Transform> boxes;

Потом добавлять в список объекты в OnTriggerEnter:
C#
1
2
3
4
private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "Box") boxes.Add(other.transform);
}
А в ToggleOn проверять расстояния:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void ToggleOn()
{
    float minDistance = Vector3.Distance(transform.position, boxes[0].transform.position);
    int tmpI = 0;
    for (int i = 1; i < boxes.Count; i++)
    {
        if (boxes[i] != null)
        {
            if (Vector3.Distance(transform.position, boxes[i].transform.position) < minDistance) 
            {
                minDistance = Vector3.Distance(transform.position, boxes[i].transform.position);
                tmpI = i;
            }
            if (i == boxes.Count - 1) targetObject = boxes[tmpI].transform;
        }
    }
    boxes.Clear();
}
1
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
13.12.2023, 18:57  [ТС]
Добавил проверку триггера.

Сейчас я могу свою коробку таскать. Но когда я попробую взять другую- притянется моя "первая" коробка. Это происходит, если в коллайдере есть "любая коробка"

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    private void Start()
    {
        Pickup = GameObject.FindWithTag("Hands").transform; //Пикап- руки по тегу!!!
    }
    public void OnTriggerEnter(Collider Box)
    {
        boxtrigged = true;
        targetObject = GameObject.FindWithTag("Box").transform; //Таргет назначена коробка по тегу и если стриггерена!!!
        Debug.Log("Коробка близко");
    }
    public void OnTriggerExit(Collider Box)
    {
        boxtrigged = false;
        targetObject = GameObject.FindWithTag("Box").transform; //Таргет назначена коробка по тегу и если стриггерена!!!
        Debug.Log("Коробка далеко");
    }
    public void ToggleOn()
    {
        float distance = Vector3.Distance(transform.position, targetObject.position);
        if (distance <= interactionRadius || boxtrigged == true)
        {
            GameObject.FindGameObjectWithTag("Box").GetComponent<BoxCollider>().enabled = false;
            GameObject.FindGameObjectWithTag("Box").GetComponent<Rigidbody>().useGravity = false;
            targetObject.position = transform.position;
            targetObject.transform.parent = Pickup.transform;
            Debug.Log("Чето происходит, триггнут коллайдер руки ящиком, ящик приклеен к руке");
        }
        
    }
0
 Аватар для ПСВ
39 / 32 / 8
Регистрация: 29.03.2020
Сообщений: 184
13.12.2023, 19:11
Попробуй, как я написал. В моём коде в результате в переменную targetObject должен присваиваться ближайший ящик. Тебе надо всего лишь припарентить его и скинуть локальные координаты в 0.
targetObject.transform.parent = transform;
targetObject.transform.localPosition = Vector3.zero;

И руку не надо искать.
И в 14й строке правильнее вот так: if (i == boxes.Count - 1) targetObject = boxes[tmpI];
0
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
13.12.2023, 19:13  [ТС]
Цитата Сообщение от ПСВ Посмотреть сообщение
if (other.gameObject.tag == "Box") boxes.Add(other.transform);
Правильно ли указывать "other"? На эту строку ругается "NullReferenceException: Object reference not set to an instance of an object"
0
 Аватар для ПСВ
39 / 32 / 8
Регистрация: 29.03.2020
Сообщений: 184
13.12.2023, 19:20
Там как в параметрах написать, так должно быть и в теле, просто совпадать должно.
Я даже не знаю, от чего ошибка.

Добавлено через 1 минуту
Вот так попробуй:
if (other.gameObject.tag == "Box" && other != null) boxes.Add(other.transform);
1
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
13.12.2023, 19:23  [ТС]
Цитата Сообщение от ПСВ Посмотреть сообщение
if (other.gameObject.tag == "Box" && other != null) boxes.Add(other.transform);
Не дает заполнить список.. Это есть 19я строка..
NullReferenceException: Object reference not set to an instance of an object
BoxPickup3.OnTriggerEnter (UnityEngine.Collider other) (at Assets/Dynamic First Person Mobile/Scripts/BoxPickup3.cs:19)
0
 Аватар для ПСВ
39 / 32 / 8
Регистрация: 29.03.2020
Сообщений: 184
13.12.2023, 19:27
А что, если так:
if (other.tag == "Box" && other != null) boxes.Add(other.transform);
0
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
13.12.2023, 19:28  [ТС]
Чуть поправил- Public List<Transform> boxes;
Список пополняется, но не очищается, ошибки нет. Только когда до 10 доходит- "превышен лимит"
0
 Аватар для ПСВ
39 / 32 / 8
Регистрация: 29.03.2020
Сообщений: 184
13.12.2023, 19:32
Не знаю, не знаю... Должен очищаться при нажатии на кнопку. Ну ты понял boxes.Clear();
0
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
13.12.2023, 21:09  [ТС]
Цитата Сообщение от ПСВ Посмотреть сообщение
boxes.Clear();
Согласен, в ToggleOff тоже добавил. Не хотит) Добьем..
Сейчас прикручу перемещение ящика в руки и паррент

Добавлено через 8 минут
Цитата Сообщение от ПСВ Посмотреть сообщение
Не знаю, не знаю... Должен очищаться при нажатии на кнопку. Ну ты понял boxes.Clear();
Конечно я признаю, желтая справка у меня есть, но я её съел...
Кнопка отвязана была

Добавлено через 12 минут
Основа рабочая!
Сейчас попробую разобрать момент- взял ящик, перенес- поставил.
Отошел далеко, нажал кнопку, перенесенный ящик прилетел в руки.

Добавлено через 1 час 14 минут
Вроде как всё хорошо. Таймер для очистки списка не подошел, но инструмент полезный, оставляем в комментариях).
Очистка списка по выходу из коллизии лучший вариант, так нельзя притянуть к себе издалека коробку, до которой дотронулся, пока пробегал мимо.
Если останавливать объект при взятии, то он почему то берется черт знает где, в Transform просто рандомные 3хзначные числа.
targetObject.transform.localPosition = Vector3.zero;
заменил на
targetObject.position = transform.position;
0
4 / 3 / 2
Регистрация: 03.12.2023
Сообщений: 116
14.12.2023, 14:34  [ТС]
Цитата Сообщение от ПСВ Посмотреть сообщение
А что, если так:
Я правильно раскомментировал? Сейчас у меня одна и та-же коробка прилетает в руки..
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void ToggleOn()
    {
        float minDistance = Vector3.Distance(transform.position, boxes[0].transform.position); //задаем расстояние до ближайшего объекта
        int tmpI = 0; //создаем переменную с 0 для подсчета объектов в листе
        for (int i = 1; i < boxes.Count; i++) //счет по 1; количество меньше содержимого списка; увеличить на +1
        {
            if (boxes[i] != null) //если количество в списке не 0
            {
                if (Vector3.Distance(transform.position, boxes[i].transform.position) < minDistance) //если от руки до первого объекта списка меньше расстояние, чем до ближайшего объекта 
                {
                    minDistance = Vector3.Distance(transform.position, boxes[i].transform.position); //назначаем новую дистанцию до ближайшего
                    tmpI = i; //тут не понял, новая переменная, которой присваивается значение счетчика объектов в листе?
                }
                if (i == boxes.Count - 1) targetObject = boxes[tmpI].transform; //если количество объектов равно первому объекту в списке, назначаем целевым объектом boxes[с последним числом]
            }
        }
        GameObject.FindGameObjectWithTag("Box").GetComponent<BoxCollider>().enabled = false;
        GameObject.FindGameObjectWithTag("Box").GetComponent<Rigidbody>().useGravity = false;
        targetObject.position = transform.position;
        targetObject.transform.parent = Hands.transform;
        Debug.Log("Чето происходит, триггнут коллайдер руки ящиком, ящик приклеен к руке");
    }


Добавлено через 34 минуты
Вроде доработал, понял, где ошибка была. 17-18 строки работали именно на первый попавшийся (и запомненный) ящик
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.12.2023, 14:34

Auto resize объектов сцены
Здравствуйте форумчане. Пишу 2D игру для андроид и ios и столкнулся с такой проблемой, элементы управления UI нормально растягиваются под...

Выбор объектов сцены мышью
Есть сцена с шарами. Нужно реализовать возможность выбора шара мышью. Находил примеры, но они используют библиотеку glut. Как сделать...

Видимость объектов сцены и их потомков классами
добрый день, очень надеюсь на вашу помощь. Ситуация следующая: есть два класса Unit и Floor. каждый объект класса Floor добавляется...

Собрать со сцены упорядоченный массив объектов
На сцене есть 14 точек (см. скрин), как их упорядочить в массиве от _targetPoint до _targetPoint(13)? Считываю массив таким образом ...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru