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

Klikanie obiektu (za pomocą myszki) Unity

Object Storage Arubacloud
0 głosów
1,047 wizyt
pytanie zadane 26 lutego 2020 w C# przez Sic Dyskutant (8,510 p.)
otwarte ponownie 1 marca 2020 przez Sic

Witam,
Zgodnie z jednym z przewodników zmodyfikowałem kod, aby działał na moim obiekcie, ale dzieje się to w 3D. Chcę zmienić kod do użycia w 2d. Ponadto chce dodać punkt po naciśnięciu obiektu.

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
     
    public class AddScore : MonoBehaviour
    {
        public Text scoreText;
        public int score;
        public GameObject Button;
     
        // Update is called once per frame
        void Update()
        {
            scoreText.text = "" + score;
            if(Input.GetMouseButtonDown(0))
            {
                Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                RaycastHit hit;
     
                if (Physics.Raycast(ray, out hit))
                {
                    Debug.Log(hit.transform.name);
                    if (hit.transform.name == "Button")
                    {
                        score++;
                    }
                }
            }
        }
    }

 

komentarz 26 lutego 2020 przez piotrsz109 Stary wyjadacz (13,730 p.)
Może użyj metody OnMouseDown?

1 odpowiedź

+1 głos
odpowiedź 26 lutego 2020 przez Zaglowiec Dyskutant (9,200 p.)
wybrane 1 marca 2020 przez Sic
 
Najlepsza
Witam

Zmiana kodu aby działał dla obiektów 2D, zamiast 3D powinna być prosta. Wystarczy pozamieniać odpowiednie zmienne dla modelu 2D np. Physics - > Physics2D

https://docs.unity3d.com/ScriptReference/Physics2D.Raycast.html

 

A co do punktu, co to ma być za punkt? Można zrobić obiekt 2D, będący kropką, która tworzy się po naciśnięciu obiektu. Zależy do czego ci będzie potem ten punkt potrzebny
komentarz 27 lutego 2020 przez Sic Dyskutant (8,510 p.)
Udało mi się kod powoduje dodawanie się punków dla gracza, jednak jest problem, którego jeszcze nie potrafię rozwiązać. Rozpoczne od tego, że jest to gra w dwóch graczy co oznacza, że punkty powinny zostać dodawane dla dwóch graczy osobno. Kod, który stworzyłem powoduje dodawania punktów u obu graczy, mimo tego że oddzieliłem obiekty.

Wiem w czym leży problem, jednak nie wiem jak może stworzyć, drugą zmienną "wynik", która będzie działać dla drugiego gracza.
komentarz 27 lutego 2020 przez Zaglowiec Dyskutant (9,200 p.)
Trochę nie rozumiem, gra jest dla dwóch graczy, ale punkt dodajesz po kliknięciu myszką, gra jest sieciowa? Czy np. masz system tur i raz wykonuje ruch jeden gracz a raz drugi?

Jeśli to system tur, to potrzebujesz rozróżnić, który gracz ma ruch (wystarczy zwykły bool), a następnie w zależności od tego tury gracz wykonywał akcje dodawać punkty do czego potrzebne są dwie zmienne score np. scorePlayer1 i scorePlayer2 i dodawać wynik do odpowiedniego
komentarz 28 lutego 2020 przez Sic Dyskutant (8,510 p.)
edycja 28 lutego 2020 przez Sic

Tak masz całkowitą racje, aby użyć dwóch zmiennych score. I w kodzie swobodnie mogę przypisać w jakim momencie ma, która ma się zwiększyć. Jednak w momencie użycia typu int nie wiem w jaki sposób mogę przypisać obiekt(Score) do tej zmiennej w programie Unity.

Oto przykład jak wygląda sytuacja:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AddScore : MonoBehaviour
{
    public Text scoreText;
    public Text scoreText2;
    public int score;
    public int score2;

    // Kliknięcie, któregoś z obiektów powoduje, że objawia się to dwukrotnie
    public void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            var ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit))
            {
                Debug.Log(hit.transform.name);
                if (hit.transform.name == ("Button_P1"))
                {
                    score++;
                    scoreText.text = "" + score;
                }

                else if (hit.transform.name == ("Button_P2"))
                {
                    score2++;
                    scoreText2.text = "" + score2;
                }

            }
        }
        
    }
}

Oto zdjęcie z programu Unity ( Debug.Log).

https://ibb.co/ByzbqWS

komentarz 28 lutego 2020 przez Zaglowiec Dyskutant (9,200 p.)
Wybacz, ale nadal nie rozumiem...Nie widzę w kodzie żadnych odwołań do obiektów Score.

Chcesz przechowywać wynik w innym obiekcie, lub osobnym skrypcie? Teraz jeśli klikniesz obiekt o odpowiedniej nazwie dodajesz punkt do jeden z dwóch zmiennych.

Jak chcesz robić odwołanie do innego obiektu/skryptu to potrzebujesz go najpierw znaleźć, czy to samemu przypisując zmienną czy ją znajdując za pomocą funkcji Find.
komentarz 29 lutego 2020 przez Sic Dyskutant (8,510 p.)
edycja 29 lutego 2020 przez Sic
Ma to wygladać tak:

- 2 zmienne score

- 2 zmienne Text (score), aby zmieniać tekst wyniku

- Text musi być przypisane do zmiennych score(osobno)

- w momencie klikniecia na obiekt 1 dodaje punkty do score 1 i text 1 się zmienia

- w momencie klikniecia na obiekt 2 dodaje punkty do score 2 i text 2 się zmienia

Obecnie:

- 2 zmienne score

- 2 zmienne Text (score), aby zmieniać tekst wyniku

- w momencie klikniecia na obiekt 1 dodaje punkty do score 1 , jednak zmieniają się oba teksty. Przykład : wciskamy (3 razy co daje 3 pkt.) obiekt 1 dodaje punkt do Text (1 i 2), po czym wciskamy (1 raz co daje 1 pkt.) obiekt 2 dodaje punkt do Text (1 i 2) tylko ze zmiennej score 2 co powoduje cofnięcie wyniku Text co 1 punktu.

Użycie Find(), dobrze a z jakieś konkretnej klasy. Raczej nie z GameObject(), bo to nie obiekt a zmienna int.

Wszystko to należy umieścić w jednym skrypcie (w razie braku możliwości w dwóch).
1
komentarz 29 lutego 2020 przez Zaglowiec Dyskutant (9,200 p.)
Ok, łapie. Tylko nie wiem co dokładnie poradzić, według kodu powinno działać jak mówisz, choć jakoś dziwnie wyglądają mi te if'y (ale może dlatego, ze nie używałem hit.transform.name, tylko z reguły hit.collider.gameObject.name lub hit.collider.tag, ale to wszystko zależy od tego co potrzebujesz, więc nie ingeruje). Nie wiem jak wygląda twoja scena i przypisane skrypty, przez co ciężko jest mi ci pomóc i doradzić

Do obiektu Text dodajesz za każdym razem nowy text, którym jest wynik i powinien aktualizować się tylko przy jednym z warunków. Najlepiej jak dodasz Debug.Log do if'ów i sprawdzisz kiedy się wykonują, bo może coś jest nie tak z logiką
komentarz 1 marca 2020 przez Sic Dyskutant (8,510 p.)
Spróbuję wykorzystać inne możliwości w moim kodzie. Mimo to dziękuję za twoje zainteresowanie.
komentarz 1 marca 2020 przez Sic Dyskutant (8,510 p.)
Rozwiązaniem okazało się podzielenie kodu na dla osobne skrypty.
1
komentarz 1 marca 2020 przez Zaglowiec Dyskutant (9,200 p.)
Czasami takie sposoby też pomagają
Powodzenia w dalszej pracy

Podobne pytania

0 głosów
1 odpowiedź 1,339 wizyt
pytanie zadane 27 kwietnia 2019 w C# przez Pytam_PL Użytkownik (520 p.)
0 głosów
1 odpowiedź 1,017 wizyt
0 głosów
1 odpowiedź 1,618 wizyt
pytanie zadane 3 sierpnia 2017 w OpenGL, Unity przez Stami Gaduła (3,790 p.)

92,681 zapytań

141,583 odpowiedzi

320,070 komentarzy

62,041 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

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!

...