Страница 1 из 1

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

СообщениеДобавлено: 10 янв 2019, 15:49
Wmyx
Здравствуйте, хочу сделать лист для инвентаря, но я не пойму почему не работает, я уже посмотрел несколько видео где люди писали такой же скрипт, но он РАБОТАЛ!
Вот сам скрипт добавления в лист элемента.
Синтаксис:
Используется 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);
                }
            }

Я уже понял, что ошибка в том, что я сохраняю в лист именно ссылку на компонент и после удаляю объект с этим компонентом и поэтому пропадает и ссылка на компонент. Но как я писал в начале, у некоторых этот скрипт работал!!!
Также я уже понял самый легкий способ выхода из этой ситуации, это создать какой-нибудь пустой объект в котором будут хранится компоненты, но все же это не экономно, да и выглядит глупо и в будущем вызовет еще не мало проблем. Так что можете, что-нибудь посоветовать для решения этой проблемы?

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

СообщениеДобавлено: 10 янв 2019, 16:09
1max1
Смысл хранить в списке удаленные объекты?

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

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

Но при этом компонент после удаления объекта должен остаться. И вот я не могу понять, как мне сохранить именно компонент, а не ссылку на него

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

СообщениеДобавлено: 10 янв 2019, 16:19
Tolking
Если Item monobehaviour, то он не может существовать отдельно от объекта.

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

СообщениеДобавлено: 10 янв 2019, 16:23
Wmyx
А какой может?

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

СообщениеДобавлено: 10 янв 2019, 16:31
IDoNotExist
ScriptableObject к примеру.

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

СообщениеДобавлено: 10 янв 2019, 16:31
1max1
Простая структура или класс.

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

СообщениеДобавлено: 10 янв 2019, 16:50
Wmyx
Ну попробовал поменять классы и т.д. Ничего не получилось.

Может у кого-нибудь есть какой-то другой способ сохранения компонента в лист?

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

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

Но лучше ScriptableObject, потому что объекты будут автоматически сохранятся в ассетах.

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

СообщениеДобавлено: 10 янв 2019, 17:02
Tolking
Абсолютно у всех программистов на земле есть только один способ сохранять компаненты в лист...

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

СообщениеДобавлено: 10 янв 2019, 17:14
Jarico
IDoNotExist писал(а):ScriptableObject к примеру.


Плохой пример, ScriptableObject подойдёт для хранения информации о предмете (тип, описание, название и т.д.) которая используется 1 раз при появлении объекта к примеру... А для сохранения в List или в Dictionary рекомендуется использовать отдельные классы или структуры чтобы была структура инвентаря - короче временная инфа в классах или структурах, и постоянная в ScriptableObject

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

СообщениеДобавлено: 11 янв 2019, 08:27
Friend123
А нахрена хранить компонент? Если нужны данные из компонента, то может быть хранить их в листе?

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

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