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

Funkcja onPress zamiast onClick - unity

VPS Starter Arubacloud
0 głosów
378 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ź 361 wizyt
pytanie zadane 7 grudnia 2018 w OpenGL, Unity przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 212 wizyt
pytanie zadane 11 sierpnia 2018 w OpenGL, Unity przez MsMaciek123 Pasjonat (24,760 p.)
0 głosów
1 odpowiedź 888 wizyt
pytanie zadane 3 maja 2018 w Inne języki przez matmati2003 Użytkownik (620 p.)

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...