проблемы с инвентарем -_-

Программирование на Юнити.

проблемы с инвентарем -_-

Сообщение Fox_game 20 июл 2017, 16:28

Есть проблема! У меня есть скрипт на инвентарь. Я сделал чтоб предмет можно было двигать выбрасывать и т.д. но есть проблема... После того как я переместил предмет в другой слот и я перезахожу в инвентарь а объект раздваивается!
вот скрипт на инвентарь:

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


public class oooiuuo : MonoBehaviour {
       
        int j;
        public GameObject contaner;
        public int ColE4 = 0;
        public GameObject invt;
        List<Item> list;

        void Start () {
                Screen.lockCursor = true;
                Cursor.visible = false;
                list = new List<Item>();
        }
        void Update () {
                if (Input.GetKeyUp (KeyCode.E) & ColE4 < 12) {
                        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                        RaycastHit hit;
                        if (Physics.Raycast (ray, out hit, 3)) {
                                Item item = hit.collider.GetComponent<Item> ();
                                if (item != null) {
                                        list.Add (item);
                                        Destroy (hit.collider.gameObject);
                                        ColE4 += 1;
                                }
                        }
                }
                if (Input.GetKeyUp (KeyCode.Tab)) {
                        Cursor.visible = false;
                        Screen.lockCursor = true;
                        if (ColE4 < 0)
                                ColE4 = 0;
                        if (invt.activeSelf) {
                                invt.SetActive (false);
                                for (j = 0; j < invt.transform.childCount; j += 1) {
                                        if (invt.transform.GetChild (j).transform.GetChild (0).gameObject) {
                                                Destroy (invt.transform.GetChild (j).transform.GetChild (0).gameObject);
                                        }
                                }
                        }
                        else if (!invt.activeSelf) {
                                Cursor.visible = true;
                                Screen.lockCursor = false;
                                invt.SetActive (true);
                                int count = list.Count;
                                for (int i = 0; i < count; i++) {
                                        Item it = list [i];
                                        if (invt.transform.childCount >= i & i <= ColE4) {
                                                GameObject img = Instantiate (contaner);
                                                img.transform.SetParent (invt.transform.GetChild (i).transform);
                                                img.GetComponent<Image> ().sprite = Resources.Load<Sprite> (it.Sprite);
                                                img.GetComponent<Button>().onClick.AddListener(() => remove(it,img));
                                        }
                                        else break;
                                }
                        }
                }
        }
        void remove (Item it,GameObject Obj)
        {
                GameObject newo = Instantiate<GameObject>(Resources.Load<GameObject>(it.Prefab));
                newo.transform.position = transform.position + transform.forward + transform.up;
                Destroy (Obj);
                list.Remove (it);
                ColE4 -= 1;
                invt.SetActive (false);
                Cursor.visible = false;
                Screen.lockCursor = true;
                for (j = 0; j < invt.transform.childCount; j += 1) {
                        if (invt.transform.GetChild (j).transform.GetChild (0).gameObject) {
                                Destroy (invt.transform.GetChild (j).transform.GetChild (0).gameObject);
                        }
                }
        }
}


вот скрипт на перетягивание объекта:

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class Drag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler {
        public Transform canvas;
        public Transform old;

        // Use this for initialization
        void Start () {
                canvas = GameObject.Find ("Canvas").transform;

        }

        void Update()
        {
                if (!transform.gameObject.activeSelf)
                        Destroy (gameObject);
        }

        public void OnBeginDrag (PointerEventData eventData)
        {
                old = transform.parent;
                        transform.SetParent (canvas);
        }
        public void OnDrag (PointerEventData eventData)
        {
                        transform.position = Input.mousePosition;
                        canvas = transform.parent;
                GetComponent<CanvasGroup> ().blocksRaycasts = false;
        }
        public void OnEndDrag (PointerEventData eventData)
        {
                GetComponent<CanvasGroup> ().blocksRaycasts = true;
                if(transform.parent.childCount > 1){
                        transform.SetParent (old);
                }
                if (transform.parent == canvas) {
                        transform.SetParent (old);
                }
        }              
}


Но вот в чем проблема объект который я перетащил после запуска раздваивается. Я выяснил в чем проблема. После перемещения объекта инвентарь запоминает место где объект был раньше. И после перезапуска он создает новый на том месте где он появился в первый раз!

ПОДСКАЖИТЕ КАК ВСТАВИТЬ ВИДЕО, ТОГДА Я СМОГУ ВАМ ВСЕ НАГЛЯДНО ПОКАЗАТЬ!
Fox_game
UNIт
 
Сообщения: 117
Зарегистрирован: 08 июл 2017, 19:33

Re: проблемы с инвентарем -_-

Сообщение samana 20 июл 2017, 16:40

Fox_game писал(а):ПОДСКАЖИТЕ КАК ВСТАВИТЬ ВИДЕО, ТОГДА Я СМОГУ ВАМ ВСЕ НАГЛЯДНО ПОКАЗАТЬ!

Загружаете видео на YouTube и делитесь ссылкой.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: проблемы с инвентарем -_-

Сообщение Fox_game 20 июл 2017, 17:50

samana писал(а):
Fox_game писал(а):ПОДСКАЖИТЕ КАК ВСТАВИТЬ ВИДЕО, ТОГДА Я СМОГУ ВАМ ВСЕ НАГЛЯДНО ПОКАЗАТЬ!

Загружаете видео на YouTube и делитесь ссылкой.

Спасибо! Вот видео! Пожалуйста помогите. На вас последняя надежда столько времени стоплюсь на этой проблеме просто жуть!
Если вы не знаете может есть Консультант который мог бы мне помочь за не большую цену.
Fox_game
UNIт
 
Сообщения: 117
Зарегистрирован: 08 июл 2017, 19:33

Re: проблемы с инвентарем -_-

Сообщение samana 20 июл 2017, 21:04

В основном вам код понятен, но визуально выявить причину такой проблемы я не в силах.
Единственное что меня смутило, это
Синтаксис:
Используется csharp
if (Input.GetKeyUp (KeyCode.E) & ColE4 < 12)

Синтаксис:
Используется csharp
if (invt.transform.childCount >= i & i <= ColE4) {

почему &, а не && ? У вас ведь логическое сравнение, а не побитовое.
Да и не увидел особого смысла постоянно пересоздавать Item-ы в инвентаре при его открытии, ведь достаточно сделать инвентарь неактивным и всё его содержимое тоже станет неактивным.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: проблемы с инвентарем -_-

Сообщение Fox_game 20 июл 2017, 21:35

samana писал(а):В основном вам код понятен, но визуально выявить причину такой проблемы я не в силах.
Да и не увидел особого смысла постоянно пересоздавать Item-ы в инвентаре при его открытии, ведь достаточно сделать инвентарь неактивным и всё его содержимое тоже станет неактивным.


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

ВОТ:

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


public class oooiuuo : MonoBehaviour {
       
        int j;
        public GameObject contaner;
        public int ColE4 = 0;


        public GameObject invt;

        List<Item> list;

        // Use this for initialization
        void Start () {
                Screen.lockCursor = true;
                Cursor.visible = false;
                list = new List<Item>();

        }

        // Update is called once per frame
        void Update () {
                if (Input.GetKeyUp (KeyCode.E) & ColE4 < 12) {
                        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                        RaycastHit hit;
                        if (Physics.Raycast (ray, out hit, 3)) {
                                Item item = hit.collider.GetComponent<Item> ();
                                if (item != null) {
                                        list.Add (item);
                                        Destroy (hit.collider.gameObject);
                                        ColE4 += 1;
                               
                        int count = list.Count;
                        for (int i = 0; i < count; i++) {
                                Item it = list [i];

                                if (invt.transform.childCount >= i & i <= ColE4) {
                                        GameObject img = Instantiate (contaner);
                                        img.transform.SetParent (invt.transform.GetChild (i).transform);
                                        img.GetComponent<Image> ().sprite = Resources.Load<Sprite> (it.Sprite);
                                        img.GetComponent<Button>().onClick.AddListener(() => remove(it,img));
                                }
                                else break;
                                        }
                                }
                        }
                }
                if (Input.GetKeyUp (KeyCode.Tab)) {
                        Cursor.visible = false;
                        Screen.lockCursor = true;
                        if (ColE4 < 0)
                                ColE4 = 0;


                        if (invt.activeSelf) {
                                invt.SetActive (false);

                        }



                        else if (!invt.activeSelf) {
                                Cursor.visible = true;
                                Screen.lockCursor = false;
                                invt.SetActive (true);

                        }
                }

        }
        void remove (Item it,GameObject Obj)
        {
                GameObject newo = Instantiate<GameObject>(Resources.Load<GameObject>(it.Prefab));
                newo.transform.position = transform.position + transform.forward + transform.up;
                Destroy (Obj);
                list.Remove (it);
                ColE4 -= 1;
                invt.SetActive (false);
                Cursor.visible = false;
                Screen.lockCursor = true;
                for (j = 0; j < invt.transform.childCount; j += 1) {
                        if (invt.transform.GetChild (j).transform.GetChild (0).gameObject) {
                                Destroy (invt.transform.GetChild (j).transform.GetChild (0).gameObject);
                        }
                }
        }
}


в данном случае все как бы нормально нет такого бага как в пред. версии но вот, что появляется:
[youtube]https://youtu.be/FRazQsB3-2g[/youtube]
это вообще какой-то бред. Может вы знаете, ЧТО Я ДЕЛАЮ НЕ ТАК??
Fox_game
UNIт
 
Сообщения: 117
Зарегистрирован: 08 июл 2017, 19:33

Re: проблемы с инвентарем -_-

Сообщение samana 20 июл 2017, 22:11

Если я правильно скомпилировал ваш код в голове, то возможно ошибка здесь
Синтаксис:
Используется csharp
if (Input.GetKeyUp (KeyCode.E) & ColE4 < 12) {
                        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                        RaycastHit hit;
                        if (Physics.Raycast (ray, out hit, 3)) {
                                Item item = hit.collider.GetComponent<Item> ();
                                if (item != null) {
                                        list.Add (item);
                                        Destroy (hit.collider.gameObject);
                                        ColE4 += 1;
                               
                        int count = list.Count;
                        for (int i = 0; i < count; i++) {
                                Item it = list [i];

                                if (invt.transform.childCount >= i & i <= ColE4) {
                                        GameObject img = Instantiate (contaner);
                                        img.transform.SetParent (invt.transform.GetChild (i).transform);
                                        img.GetComponent<Image> ().sprite = Resources.Load<Sprite> (it.Sprite);
                                        img.GetComponent<Button>().onClick.AddListener(() => remove(it,img));
                                }
                                else break;
                                        }
                                }
                        }
                }

При поднятии предмета, происходят какие-то странные манипуляции, точнее цикл и условия. По идее, вам достаточно так, попробуйте заменить кусок кода выше, этим:
Синтаксис:
Используется csharp
if (Input.GetKeyUp(KeyCode.E) && ColE4 < 12) // <<------------ надо &&
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, 3))
    {
        Item item = hit.collider.GetComponent<Item>();
        if (item != null)
        {
            GameObject img = Instantiate(contaner);
            img.transform.SetParent(invt.transform.GetChild(list.Count).transform);// <<------------
            img.GetComponent<Image>().sprite = Resources.Load<Sprite>(item.Sprite); // <<------------
            img.GetComponent<Button>().onClick.AddListener(() => remove(item, img)); // <<------------

            list.Add(item);
            Destroy(hit.collider.gameObject);
            ColE4 += 1;
        }
    }
}
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: проблемы с инвентарем -_-

Сообщение Fox_game 21 июл 2017, 16:43

samana писал(а):Если я правильно скомпилировал ваш код в голове, то возможно ошибка здесь
Синтаксис:
Используется csharp
if (Input.GetKeyUp (KeyCode.E) & ColE4 < 12) {
                        Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
                        RaycastHit hit;
                        if (Physics.Raycast (ray, out hit, 3)) {
                                Item item = hit.collider.GetComponent<Item> ();
                                if (item != null) {
                                        list.Add (item);
                                        Destroy (hit.collider.gameObject);
                                        ColE4 += 1;
                               
                        int count = list.Count;
                        for (int i = 0; i < count; i++) {
                                Item it = list [i];

                                if (invt.transform.childCount >= i & i <= ColE4) {
                                        GameObject img = Instantiate (contaner);
                                        img.transform.SetParent (invt.transform.GetChild (i).transform);
                                        img.GetComponent<Image> ().sprite = Resources.Load<Sprite> (it.Sprite);
                                        img.GetComponent<Button>().onClick.AddListener(() => remove(it,img));
                                }
                                else break;
                                        }
                                }
                        }
                }

При поднятии предмета, происходят какие-то странные манипуляции, точнее цикл и условия. По идее, вам достаточно так, попробуйте заменить кусок кода выше, этим:
Синтаксис:
Используется csharp
if (Input.GetKeyUp(KeyCode.E) && ColE4 < 12) // <<------------ надо &&
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, 3))
    {
        Item item = hit.collider.GetComponent<Item>();
        if (item != null)
        {
            GameObject img = Instantiate(contaner);
            img.transform.SetParent(invt.transform.GetChild(list.Count).transform);// <<------------
            img.GetComponent<Image>().sprite = Resources.Load<Sprite>(item.Sprite); // <<------------
            img.GetComponent<Button>().onClick.AddListener(() => remove(item, img)); // <<------------

            list.Add(item);
            Destroy(hit.collider.gameObject);
            ColE4 += 1;
        }
    }
}


Ну... Прошлая проблема ушла ноо... Теперь когда я перетаскиваю предмет когда я беру новый он как-бы не замечает этот слот и получается, что слот остается пустой. И если я перетащу предмет в ту ячейку где был прошлый и выкину его они вдвоем удалятся .. Это сложно объяснить
но вот у меня видео:
[youtube]https://youtu.be/lkXEPOMq-Gw[/youtube]
если вам сложно так работать я могу дать файл с моим проектом !
Fox_game
UNIт
 
Сообщения: 117
Зарегистрирован: 08 июл 2017, 19:33

Re: проблемы с инвентарем -_-

Сообщение samana 21 июл 2017, 21:48

Хорошо, давайте проект, вдруг получится разобраться.
Если проект большой и там много лишнего, то можно как нибудь уставить только основные моменты и сбросить пакетом.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: проблемы с инвентарем -_-

Сообщение Fox_game 30 июл 2017, 13:18

samana писал(а):Хорошо, давайте проект, вдруг получится разобраться.
Если проект большой и там много лишнего, то можно как нибудь уставить только основные моменты и сбросить пакетом.

с\Спасибо тебе огромное но уже не надо я сам написал свой инвентарь более доработанный и без багов :) Но ты реально помог))
Fox_game
UNIт
 
Сообщения: 117
Зарегистрирован: 08 июл 2017, 19:33


Вернуться в Скрипты

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15