Как скопировать Компонент, а не ссылку на него?

Общие вопросы о Unity3D

Как скопировать Компонент, а не ссылку на него?

Сообщение Wmyx 10 янв 2019, 15:49

Здравствуйте, хочу сделать лист для инвентаря, но я не пойму почему не работает, я уже посмотрел несколько видео где люди писали такой же скрипт, но он РАБОТАЛ!
Вот сам скрипт добавления в лист элемента.
Синтаксис:
Используется csharp
RaycastHit hit;
            if(Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit,1))
            {
                if(hit.collider.GetComponent<Item>() != null)
                {
                    items.Add(hit.collider.GetComponent<Item>());
                    Destroy(hit.collider.gameObject);
                }
            }

Я уже понял, что ошибка в том, что я сохраняю в лист именно ссылку на компонент и после удаляю объект с этим компонентом и поэтому пропадает и ссылка на компонент. Но как я писал в начале, у некоторых этот скрипт работал!!!
Также я уже понял самый легкий способ выхода из этой ситуации, это создать какой-нибудь пустой объект в котором будут хранится компоненты, но все же это не экономно, да и выглядит глупо и в будущем вызовет еще не мало проблем. Так что можете, что-нибудь посоветовать для решения этой проблемы?
Wmyx
UNец
 
Сообщения: 9
Зарегистрирован: 23 июн 2018, 16:07

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение 1max1 10 янв 2019, 16:09

Смысл хранить в списке удаленные объекты?
Аватара пользователя
1max1
Адепт
 
Сообщения: 1817
Зарегистрирован: 28 июн 2017, 10:51

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение Wmyx 10 янв 2019, 16:13

Я не удаленный объект хочу хранить, а компонент Item.
Вот что я хочу сделать:
1. Сохранить компонент Item из объекта в Лист.
2. Удалить сам объект

Но при этом компонент после удаления объекта должен остаться. И вот я не могу понять, как мне сохранить именно компонент, а не ссылку на него
Wmyx
UNец
 
Сообщения: 9
Зарегистрирован: 23 июн 2018, 16:07

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение Tolking 10 янв 2019, 16:19

Если Item monobehaviour, то он не может существовать отдельно от объекта.
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2158
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение Wmyx 10 янв 2019, 16:23

А какой может?
Wmyx
UNец
 
Сообщения: 9
Зарегистрирован: 23 июн 2018, 16:07

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение IDoNotExist 10 янв 2019, 16:31

ScriptableObject к примеру.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1255
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение 1max1 10 янв 2019, 16:31

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

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение Wmyx 10 янв 2019, 16:50

Ну попробовал поменять классы и т.д. Ничего не получилось.

Может у кого-нибудь есть какой-то другой способ сохранения компонента в лист?
Wmyx
UNец
 
Сообщения: 9
Зарегистрирован: 23 июн 2018, 16:07

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение 1max1 10 янв 2019, 16:59

Тебе же сказали, монобех зависит от объекта, нет объекта - нет компонента. Сохраняй либо ScriptableObject, либо обычной структурой.
Синтаксис:
Используется csharp
struct Item
{
    // Поля, методы...
}

Но лучше ScriptableObject, потому что объекты будут автоматически сохранятся в ассетах.
Аватара пользователя
1max1
Адепт
 
Сообщения: 1817
Зарегистрирован: 28 июн 2017, 10:51

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение Tolking 10 янв 2019, 17:02

Абсолютно у всех программистов на земле есть только один способ сохранять компаненты в лист...
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2158
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение Jarico 10 янв 2019, 17:14

IDoNotExist писал(а):ScriptableObject к примеру.


Плохой пример, ScriptableObject подойдёт для хранения информации о предмете (тип, описание, название и т.д.) которая используется 1 раз при появлении объекта к примеру... А для сохранения в List или в Dictionary рекомендуется использовать отдельные классы или структуры чтобы была структура инвентаря - короче временная инфа в классах или структурах, и постоянная в ScriptableObject
Jarico
UNец
 
Сообщения: 11
Зарегистрирован: 06 янв 2019, 17:37

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение Friend123 11 янв 2019, 08:27

А нахрена хранить компонент? Если нужны данные из компонента, то может быть хранить их в листе?
Аватара пользователя
Friend123
UNIверсал
 
Сообщения: 427
Зарегистрирован: 26 фев 2012, 22:12
Откуда: Тверь
  • ICQ

Re: Как скопировать Компонент, а не ссылку на него?

Сообщение getAlex 12 янв 2019, 18:26

У вас должен быть класс(или структура) Item, который не наследуется от monobehaviour, и класс ItemHolder, который наследуется от monobehaviour и содержит поле Item.
Другими словами, у вас должен быть "игровой предмет", содержащий какие-то данные вроде иконки, модельки, коннектора для руки, методов для каких-то операций. И просто класс Item, который содержит только данные предмета и его методы(если нужны). К примеру, у вас ещё может быть InventoryItem или ShopItem, которые так же будут содержать поле Item. А ещё вам может не хватить голого Item, если вы захотите добавить стак предметов или методы вроде удаления предмета, и вы можете захотеть сделать ItemGroup. А сам Item может быть композицией из не юнитивских компонентов, например для создания редактора предметов или для создания предмета со случайными аффиксами, суффиксами и свойствами.
Это всё входит в раздел архитектуры и паттернов. Вам копать в этом направлении.
getAlex
Адепт
 
Сообщения: 1716
Зарегистрирован: 10 авг 2013, 18:30


Вернуться в Общие вопросы

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

Сейчас этот форум просматривают: BFZ и гости: 17