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

Funkcja onPress zamiast onClick - unity

Object Storage Arubacloud
0 głosów
389 wizyt
pytanie zadane 14 października 2020 w OpenGL, Unity przez Igorek Mądrala (6,290 p.)

Tworze sobie prostą grę 2D w unity na androida.

Aktualnie tworze poruszanie się graczem, jako że jest to gra na telefon chcę zrobić to za pomocą przycisków i zrobiłem tylko że poruszanie działa na funkcje OnClick (zaznaczone w Unity Editor)

zdjecie

 

tylko jako że jest to OnClick, żeby poruszać się graczem trzeba cały czas klikać ten przycisk (no logiczne XD)  ale ja bym chciał że można trzymać ten przycisk OnPress --- jak zrobić coś takiego?

1 odpowiedź

0 głosów
odpowiedź 14 października 2020 przez senpai desu Mądrala (5,720 p.)
wybrane 14 października 2020 przez Igorek
 
Najlepsza

Jeden ze sposobów:

utwórz nowy skrypt dla tego buttona taki jak w przykładzie w linku poniżej aby odbierać zdarzenia/callbacki  OnPointerDown

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
 
public class MyButton : MonoBehaviour, IPointerDownHandler, IPointerUpHandler {
 
    public void OnPointerDown(PointerEventData pointerEventData)
    {
        //Output the name of the GameObject that is being clicked
        Debug.Log(name + "Game Object Click in Progress");
    }
   
    public void OnPointerUp(PointerEventData pointerEventData)
    {
        Debug.Log(name + "No longer being clicked");
    }
}

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/EventSystems.IPointerDownHandler.html

będziesz musiał utworzyć referencje do tego obiektu PlayerMovement i wtedy wywołać z tego obiektu odpowiednią metodę

komentarz 14 października 2020 przez Igorek Mądrala (6,290 p.)

Dzięki! Napisałem mój kod od nowa i działa! Nie rozumiem po co pisz sie:

public class Example : MonoBehaviour, IPointerDownHandler, IPointerUpHandler

a nie 

public class Example : MonoBehaviour

ogólnie o co z tym chodzi?

komentarz 14 października 2020 przez Igorek Mądrala (6,290 p.)

i jakie dane mogę "wyciągnąć" z zmiennej 

pointerEventData

(jako argument)

komentarz 14 października 2020 przez senpai desu Mądrala (5,720 p.)
jeśli definiujesz obiekt w ten sposób to będziesz otrzymywał powiadomienia o zdarzeniach ze wskaźnika myszy/ekranu dotyczące tylko tego obiektu w tym przypadku buttona
komentarz 14 października 2020 przez senpai desu Mądrala (5,720 p.)
w tym obiekcie jest sporo informacji na temat zdarzenia /czasu / obiektu

https://docs.unity3d.com/2018.3/Documentation/ScriptReference/EventSystems.PointerEventData.html

w przypadku obiektów które nie są umieszczone na canvas jest inny sposób, ten jest dobry dla dla elementów UI, są też zdarzenia przeciągania które mogą być przydatne
komentarz 14 października 2020 przez Igorek Mądrala (6,290 p.)

:D, czym więcej rozumiem, tym czuje się lepiej

I jakby ktoś mógł zobaczyć, coś doradzić to tu jest skrypt który dopisuje do każdego buttona:

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.EventSystems;

public class PlayerMovement : MonoBehaviour, IPointerDownHandler, IPointerUpHandler
{
    public float whereGoing = 1;
    private bool going = false;
    public GameObject Player;
    private Rigidbody2D PlayerRig;
    private float speed = 1.3f;

    private void Start()
    {
        PlayerRig = Player.GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        if (going)
        {
            PlayerRig.velocity = new Vector2(whereGoing * speed,0);
        }
    }
    public void OnPointerDown(PointerEventData p) {
        going = true;
    }

    public void OnPointerUp(PointerEventData p)
    {
        going = false;
    }
}

mówię o radach bo sam skrypt działa jakbym chciał

komentarz 14 października 2020 przez senpai desu Mądrala (5,720 p.)
Generalnie w porządku ale jeśli przez dopisuje rozumiesz dodawanie tego skryptu do każdego obiektu buttona to nie szedł bym w tym kierunku. Tylko zostawił ten skrypt PlayerMovement przyczepiony do obiektu który się porusza(tylko jedna instancja) i przygotował skrypt tylko dla przycisków, które wywołują odpowiednie metody z obiektu PlayerMovement np metoda GoLeft()  i  GoRight() . Przy małym projekcie to praktycznie bez znaczenia, ale większych już tak. Jeśli miałbyś kilka ruchomych obiektów to każdy powinien mieć swój własny skrypt, który będzie sterował jego ruchami, i np podczas exportu obiektu jako prefab będzie on kompletny i gotowy do uruchomienia np w innej grze
komentarz 14 października 2020 przez Igorek Mądrala (6,290 p.)
ale to jak wtedy wywoływać te funkcje z przycisków?
komentarz 14 października 2020 przez senpai desu Mądrala (5,720 p.)

w skrypcie który utworzysz dla przycisków tam gdzie dałbyś obsługę tych zdarzeń

tworzysz pole dla PlayerMovement

public PlayerMovement playermovement;

i pole aby określić kierunek ruchu, które wypełnisz w inspektorze

public float direction;// wartość 1/-1

i w inspektorze wrzucasz ten obiekt (player) ze skryptem PlayerMovement w to pole,  w skrypcie dla buttona coś w tym kierunku , możesz też użyć jednej metody 

public PlayerMovement playermovement;
public float direction;// wartość whereGoing 1/-1

public void OnPointerDown(PointerEventData p) {
 if(direction>0)
  playermovement.GoLeft(direction);
 else
  playermovement.GoRight(direction);
}

lub

public void OnPointerDown(PointerEventData p) {
  playermovement.Go(direction);
}

wtedy w klasie  PlayerMovement dodaj 

public void Go(float direction){
 PlayerRig.velocity = new Vector2(direction* speed,0);
}

 

komentarz 14 października 2020 przez Igorek Mądrala (6,290 p.)
Dziękuje bardzo za pomoc!

Podobne pytania

0 głosów
1 odpowiedź 373 wizyt
pytanie zadane 7 grudnia 2018 w OpenGL, Unity przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 214 wizyt
pytanie zadane 11 sierpnia 2018 w OpenGL, Unity przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 926 wizyt
pytanie zadane 3 maja 2018 w Inne języki przez matmati2003 Użytkownik (620 p.)

92,551 zapytań

141,397 odpowiedzi

319,528 komentarzy

61,936 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!

...