• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

nie wiem jak wyszukać tag

Object Storage Arubacloud
+1 głos
107 wizyt
pytanie zadane 29 sierpnia 2022 w C# przez IsaacVV Początkujący (350 p.)
Stworzyłem skrypt do skrzyni, jednak by działał poprawnie każda skrzynia musi mieć jakby inną kopie skryptu co zmienia nazwę przypisanej skrzyni do ekwipunku.

skrzynia = GameObject.FindGameObjectWithTag("Skrzynia").GetComponent<Skrzynia>();

znajduje mi jedną losową skrzynię, a muszę zrobić tak by znajdowało mi skrzynie najbliżej mnie.
szukałem na necie czy jestem w stanie wykorzystać FindGameObjects... ale nie wiem jak się tym obsłużyć.

2 odpowiedzi

+1 głos
odpowiedź 29 sierpnia 2022 przez Apled Dyskutant (9,520 p.)

znajduje mi jedną losową skrzynię

Najprawdopodobniej zwraca Ci nie losową skrzynię, tylko pierwszy obiekt tej klasy.

a muszę zrobić tak by znajdowało mi skrzynie najbliżej mnie.

Jeżeli masz więcej niż jedną skrzynię w swoim zasięgu, to musisz dodać sprawdzanie odległości od gracza do skrzyni, że zwracać ten obiekt, który ma najmniejszy dystans.

A ogólnie to będziesz musiał spróbować w jakiś sposób iterować po obiektach, bo inaczej zawsze będzie Ci zwracało pierwszą wartość.

https://docs.unity3d.com/ScriptReference/GameObject.FindGameObjectsWithTag.html

komentarz 29 sierpnia 2022 przez IsaacVV Początkujący (350 p.)

pomożesz zrobić coś z tym? mam już animacje dźwięki i wszystko inne, tylko ten odczyt muszę jeszcze wykombinować. podam skrypt ekwipunku i skrzyni poniżej.
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;

    public class Skrzynia : MonoBehaviour
    {
        public List<Przedmiot> listaPrzedmiotowSkrzyni = new List<Przedmiot>();
        public bool czyWyswietlicSkrzynie;
        public bool czyPrzeciagamPrzedmiot;
        bool czyTrzymamPrzedmiot;
        bool czyDziele;
        static public bool czyMyszkaWSkrzyni;
        public Przedmiot przeciaganyPrzedmiot;
        public Budowanie budowanie;
        public GUISkin skin;
        public Transform pozycjaReki;
        public GameObject FPSCont;
        public GameObject reka;
        public GameObject trzymanyPrzedmiot;
        public Camera fpsCamera;
        public Rect polozenieSlotowSkrzyni;
        public GameObject skrzynka;
        int iloscSlotowX;
        int iloscSlotowY;
        int poprzedniSlot;
        int iloscSlotowPaskaNarzedzi;
        float ilePrzedmiotowSieZmiesci;
        float timer;
        public string wyswietlanaInformacja;
        GameObject obj;
        public Ekwipunek ekwipunek;
        Ray ray;
        RaycastHit hit;
        int idPrzedmiotu;
        public FirstPersonController fps;
        public Animation anim;
        public AudioSource dzwiek;

        void Start()
        {
            pozycjaReki = GameObject.FindGameObjectWithTag("Reka").GetComponent<Transform>();
            FPSCont = GameObject.FindGameObjectWithTag("Fpsc").GetComponent<GameObject>();
            reka = GameObject.FindGameObjectWithTag("Reka").GetComponent<GameObject>();
            fpsCamera = GameObject.FindGameObjectWithTag("MainCamera").GetComponent<Camera>();
            ekwipunek = GameObject.FindGameObjectWithTag("Fpsc").GetComponent<Ekwipunek>();
            fps = GameObject.FindGameObjectWithTag("Fpsc").GetComponent<FirstPersonController>();
            iloscSlotowX = 5;
            iloscSlotowY = 4;
            czyDziele = false;
            wyswietlanaInformacja = null;
            czyWyswietlicSkrzynie = false;
        }

        private void FixedUpdate()
        {
            ray = fpsCamera.ScreenPointToRay(Input.mousePosition);
        }

        void Update()
        {
            czyMyszkaWSkrzyni = false;
            if (Physics.Raycast(ray, out hit, 2.5f) && Budowanie.czyBudujemy == false)
            {
                if (skrzynka == hit.collider.gameObject)
                {
                    if (Input.GetMouseButtonDown(1))
                    {
                        czyWyswietlicSkrzynie = !czyWyswietlicSkrzynie;
                    }
                    if(Input.GetMouseButtonDown(1) && czyWyswietlicSkrzynie == false)
                    {
                        ekwipunek.czyWyswietlicEkwipunek = false;
                        anim.Play("Zamykanie Skrzyni");
                    }
                    if(Input.GetMouseButtonDown(1) && czyWyswietlicSkrzynie == true)
                    {
                        ekwipunek.czyWyswietlicEkwipunek = true;
                        anim.Play("Otwieranie Skrzyni");
                    }
                }
            }
            if (ekwipunek.czyPrzeciagamPrzedmiot == true)
            {
                przeciaganyPrzedmiot = ekwipunek.przeciaganyPrzedmiot;
            }
        }
        void OnGUI()
        {
        if (czyWyswietlicSkrzynie == true)
        {
            WyswietlSkrzynie();
        }
        if (czyPrzeciagamPrzedmiot == true)
            {
                GUI.DrawTexture(new Rect(Event.current.mousePosition.x, Event.current.mousePosition.y, 100, 100), przeciaganyPrzedmiot.ikonaPrzedmiotu);
            }
            if (wyswietlanaInformacja != null)
            {
                GUI.Box(new Rect(Event.current.mousePosition.x, Event.current.mousePosition.y, 150, 50), wyswietlanaInformacja, skin.GetStyle("WyswietlanieInfo"));
            }
        }
        public void WyswietlSkrzynie()
        {
            int i = 0;
            for (int x = 0; x < iloscSlotowX; x++)
            {
                for (int y = 0; y < iloscSlotowY; y++)
                {
                    Rect polozenieSlotowSkrzyni = new Rect((Screen.width * 0.375f) + (x * Screen.width * 0.040f), Screen.height * 0.11f + (y * Screen.height * 0.085f), Screen.width * 0.038f, Screen.height * 0.08f);
                    GUI.Box(polozenieSlotowSkrzyni, "", skin.GetStyle("SlotEkwipunku"));
                    if (polozenieSlotowSkrzyni.Contains(Event.current.mousePosition))
                    {
                        czyMyszkaWSkrzyni = true;
                    }
                    if (czyMyszkaWSkrzyni == false && ekwipunek.czyMyszkaWEkwipunku == false && Input.GetMouseButtonUp(0) && czyPrzeciagamPrzedmiot == true)
                    {
                        WyrzucPrzedmiot(przeciaganyPrzedmiot.id, przeciaganyPrzedmiot.iloscWstacku);
                        czyPrzeciagamPrzedmiot = false;
                    }
                    if (listaPrzedmiotowSkrzyni[i].id != 0)
                    {
                        GUI.DrawTexture(polozenieSlotowSkrzyni, listaPrzedmiotowSkrzyni[i].ikonaPrzedmiotu);
                        GUI.Box(polozenieSlotowSkrzyni, listaPrzedmiotowSkrzyni[i].iloscWstacku.ToString(), skin.GetStyle("iloscwstacku"));
                    }
                    if (czyMyszkaWSkrzyni == false && ekwipunek.czyMyszkaWEkwipunku == true && Input.GetMouseButtonUp(0) && czyPrzeciagamPrzedmiot == true)
                    {
                        czyPrzeciagamPrzedmiot = false;
                    }
                    //DZIELENIE STACKÓW
                    if (Input.GetKey(KeyCode.LeftShift) && polozenieSlotowSkrzyni.Contains(Event.current.mousePosition) && listaPrzedmiotowSkrzyni[i].iloscWstacku > 1 && Event.current.type == EventType.MouseDrag && czyPrzeciagamPrzedmiot == false)
                    {
                        czyPrzeciagamPrzedmiot = true;
                        czyDziele = true;
                        if (listaPrzedmiotowSkrzyni[i].iloscWstacku % 2 != 0)
                        {
                            listaPrzedmiotowSkrzyni[i].iloscWstacku = Mathf.Round(listaPrzedmiotowSkrzyni[i].iloscWstacku / 2 + 0.25f);
                            przeciaganyPrzedmiot = new Przedmiot(listaPrzedmiotowSkrzyni[i].id, listaPrzedmiotowSkrzyni[i].nazwa, listaPrzedmiotowSkrzyni[i].opis, listaPrzedmiotowSkrzyni[i].czyToBron, listaPrzedmiotowSkrzyni[i].iloscWstacku);
                            przeciaganyPrzedmiot.iloscWstacku = listaPrzedmiotowSkrzyni[i].iloscWstacku - 1;
                        }
                        else
                        if (listaPrzedmiotowSkrzyni[i].iloscWstacku % 2 == 0)
                        {
                            listaPrzedmiotowSkrzyni[i].iloscWstacku = listaPrzedmiotowSkrzyni[i].iloscWstacku / 2;
                            przeciaganyPrzedmiot = listaPrzedmiotowSkrzyni[i];
                            przeciaganyPrzedmiot.iloscWstacku = listaPrzedmiotowSkrzyni[i].iloscWstacku;
                        }
                    }
                    //ŁĄCZENIE STACKÓW
                    if (przeciaganyPrzedmiot != null && przeciaganyPrzedmiot.id == listaPrzedmiotowSkrzyni[i].id && czyPrzeciagamPrzedmiot == true && polozenieSlotowSkrzyni.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseUp)
                    {
                        if (listaPrzedmiotowSkrzyni[i].iloscWstacku + przeciaganyPrzedmiot.iloscWstacku <= MyszPodnoszenie.maxStack)
                        {
                            listaPrzedmiotowSkrzyni[i] = new Przedmiot(przeciaganyPrzedmiot.id, przeciaganyPrzedmiot.nazwa, przeciaganyPrzedmiot.opis, przeciaganyPrzedmiot.czyToBron, listaPrzedmiotowSkrzyni[i].iloscWstacku + przeciaganyPrzedmiot.iloscWstacku);
                            czyPrzeciagamPrzedmiot = false;
                        }
                        else
                        {
                            ilePrzedmiotowSieZmiesci = MyszPodnoszenie.maxStack - listaPrzedmiotowSkrzyni[i].iloscWstacku;
                            listaPrzedmiotowSkrzyni[i] = new Przedmiot(przeciaganyPrzedmiot.id, przeciaganyPrzedmiot.nazwa, przeciaganyPrzedmiot.opis, przeciaganyPrzedmiot.czyToBron, listaPrzedmiotowSkrzyni[i].iloscWstacku + ilePrzedmiotowSieZmiesci);
                            przeciaganyPrzedmiot.iloscWstacku = przeciaganyPrzedmiot.iloscWstacku - ilePrzedmiotowSieZmiesci;
                        }
                    }
                //PRZENOSZENIE PRZEDMIOTOW
                    if (polozenieSlotowSkrzyni.Contains(Event.current.mousePosition))
                    {
                    czyMyszkaWSkrzyni = true;
                    }
                    if (listaPrzedmiotowSkrzyni[i].id != 0)
                    {
                    GUI.DrawTexture(polozenieSlotowSkrzyni, listaPrzedmiotowSkrzyni[i].ikonaPrzedmiotu);
                    GUI.Box(polozenieSlotowSkrzyni, listaPrzedmiotowSkrzyni[i].iloscWstacku.ToString(), skin.GetStyle("iloscwstacku"));
                    }
                    if (polozenieSlotowSkrzyni.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseUp && listaPrzedmiotowSkrzyni[i].id == 0 && czyPrzeciagamPrzedmiot == true)
                    {
                        listaPrzedmiotowSkrzyni[i] = new Przedmiot(przeciaganyPrzedmiot.id, przeciaganyPrzedmiot.nazwa, przeciaganyPrzedmiot.opis, przeciaganyPrzedmiot.czyToBron, przeciaganyPrzedmiot.iloscWstacku);
                        czyPrzeciagamPrzedmiot = false;
                        czyDziele = false;
                        przeciaganyPrzedmiot = null;
                    }
                    if (ekwipunek.czyWyswietlicEkwipunek == true && polozenieSlotowSkrzyni.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseDrag && czyPrzeciagamPrzedmiot == false)
                    {
                        przeciaganyPrzedmiot = listaPrzedmiotowSkrzyni[i];
                        listaPrzedmiotowSkrzyni[i] = new Przedmiot();
                        czyPrzeciagamPrzedmiot = true;
                    }
                    if (polozenieSlotowSkrzyni.Contains(Event.current.mousePosition) && Event.current.type == EventType.MouseUp && listaPrzedmiotowSkrzyni[i].id == 0 && czyPrzeciagamPrzedmiot == true)
                    {
                        listaPrzedmiotowSkrzyni[i] = new Przedmiot(przeciaganyPrzedmiot.id, przeciaganyPrzedmiot.nazwa, przeciaganyPrzedmiot.opis, przeciaganyPrzedmiot.czyToBron, przeciaganyPrzedmiot.iloscWstacku);
                        czyPrzeciagamPrzedmiot = false;
                        czyDziele = false;
                        przeciaganyPrzedmiot = null;
                    }
                i++;
                }
            }
        }
        void WyrzucPrzedmiot(int id, float iloscStacku)
        {
            int i = 0;
            if (iloscStacku == 1)
            {
                obj = Instantiate(przeciaganyPrzedmiot.prefabPrzedmiotu, pozycjaReki.position, Quaternion.identity) as GameObject;
                obj.GetComponent<Rigidbody>().useGravity = true;
                obj.GetComponent<Rigidbody>().isKinematic = false;
            }
            if (iloscStacku > 1)
            {
                for (int x = 0; x < iloscStacku; x++)
                {
                    Vector3 polozenie = new Vector3(pozycjaReki.position.x, pozycjaReki.position.y + i, pozycjaReki.position.z + 3);
                    obj = Instantiate(przeciaganyPrzedmiot.prefabPrzedmiotu, polozenie, Quaternion.identity) as GameObject;
                    obj.GetComponent<Rigidbody>().useGravity = true;
                    obj.GetComponent<Rigidbody>().isKinematic = false;
                    i++;
                }
            }
            przeciaganyPrzedmiot = null;
        }
    }

 

0 głosów
odpowiedź 30 sierpnia 2022 przez IsaacVV Początkujący (350 p.)

Stworzyłem zasięg, jednak nadal odczytuje mi pierwszą wartość choćby nie wiem co, i nie mam pojęcia jak to obejść, gdy podejdę do skrzyni to wyłapuje mi pierwszą ze stworzonych skrzyń, prosiłbym o sposób iterowania, ponieważ sam nie mogę tego rozszyfrować, może wystarczy tylko podmienić te funkcje w jakiś lepszy sposób.

            if (Physics.Raycast(ray, out hit, 2.5f) && hit.collider.tag == "Skrzynia")
            {
                ekwipunek.skrzynia =     GameObject.FindGameObjectWithTag("Skrzynia").GetComponent<Skrzynia>();
            }
            else ekwipunek.skrzynia = null;

nie jestem pewny czy void update to odpowiednie miejsce. Ta funkcja działa lecz odczytuje tylko jedną skrzynie, próboałem podmieniać GameObject i skończyły mi się pomysły.

Podobne pytania

0 głosów
1 odpowiedź 260 wizyt
pytanie zadane 15 stycznia 2023 w C i C++ przez aleksandra033 Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 306 wizyt
0 głosów
0 odpowiedzi 109 wizyt

92,537 zapytań

141,377 odpowiedzi

319,456 komentarzy

61,922 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...