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

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

10.12.2023, 17:49. Показов 2477. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Эксперимент с картинкой-обложкой на CodinGame
Adler 10.07.2026
Решил на днях провести эксперимент. У меня есть аккаунт на CodinGame, ТОП-3 по РФ среди 2200 участников (в разделе соревнования по программированию ИИ-ботов). Там есть обложка, куда можно влепить. . .
После бана на Пикабу не работает авторизация аккаунта с Яндекса.
Hrethgir 09.07.2026
В частности https:/ / auto. ru/ logbook/ zapret-na-vozhdenie-posle-65-let_1cf28789-07b4-4c75-a2f7-4cd4edf9deeb тут хотел оставить комментарий такой Зрите в корень - монополизация на разработку программ. . .
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru