Jump to content
Unity Insider Forum

Ohne On Click Event


Ich

Recommended Posts

Hey, wenn ich auf einen Button klicke wo der Script drinnen ist, wird der Button kleiner und wenn ich loslasse wird er größer, aber auch wenn ich nicht auf den Button klicke sondern wo anderst, wird es aufgeführt und das möchte ich nicht. Ich möchte dass es nur ausgeführt wird wenn ich auf den Button klicke, wie im OnClick Event nur möchte ich das Scripten. Die frage nur wie? :D

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

public class NewBehaviourScript : MonoBehaviour {

	public Vector2 newPos;
	public Vector2 Normal = new Vector2 (1, 1);
	public Vector2 Pressed = new Vector2 (0.95f, 0.95f);


	void Start(){
		newPos = Normal;
	}


	public void Update() {
		if (Input.GetMouseButtonDown (0)){
			newPos = Pressed;
		}
		transform.localScale = Vector2.Lerp (transform.localScale, newPos, Time.deltaTime * 10f);

		if (Input.GetMouseButtonUp (0)){
			newPos = Normal;
		}
		transform.localScale = Vector2.Lerp (transform.localScale, newPos, Time.deltaTime * 10f);

	}
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Sascha:

Nimm den Teil raus:


if (Input.GetMouseButtonDown (0)){
			WasAuchImmer();
		}

und baue eine neue Funktion


public void Blub()
{
  WasAuchImmer();
}

Und dann rufe Blub im OnClick-Event des Buttons auf.

Wie gesagt ich möchte das nicht mit dem OnClick-Event machen sondern Scripten :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;

public class ButtonScale : MonoBehaviour, IPointerDownHandler, IPointerUpHandler // Die Handler sind nötig, damit ihre Functionen aufgerufen werden
{
    public void OnPointerDown(PointerEventData eventData)
    {
        StopAllCoroutines();
        StartCoroutine(Scale(new Vector3(0.95f, 0.95f, 0.95f)));
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        StopAllCoroutines();
        StartCoroutine(Scale(Vector3.one));
    }

    IEnumerator Scale(Vector3 scale) //Diese Funktion wird jeden Frame aufgerufen, bis der Button die gewünste größe hat
    {
        while (transform.localScale != scale)
        {
            transform.localScale = Vector3.Lerp(transform.localScale, scale, Time.deltaTime * 10f);
            yield return new WaitForEndOfFrame();
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 48 Minuten schrieb FileStriker:

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;

public class ButtonScale : MonoBehaviour, IPointerDownHandler, IPointerUpHandler // Die Handler sind nötig, damit ihre Functionen aufgerufen werden
{
    public void OnPointerDown(PointerEventData eventData)
    {
        StopAllCoroutines();
        StartCoroutine(Scale(new Vector3(0.95f, 0.95f, 0.95f)));
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        StopAllCoroutines();
        StartCoroutine(Scale(Vector3.one));
    }

    IEnumerator Scale(Vector3 scale) //Diese Funktion wird jeden Frame aufgerufen, bis der Button die gewünste größe hat
    {
        while (transform.localScale != scale)
        {
            transform.localScale = Vector3.Lerp(transform.localScale, scale, Time.deltaTime * 10f);
            yield return new WaitForEndOfFrame();
        }
    }
}

 

Ok danke und wie geht das noch mit den Positionen anstatt Scale?

Link zu diesem Kommentar
Auf anderen Seiten teilen

einfach Scale durch Position austauschen, oder wenn du beides gleichzeitig ändern möchtest kannst du der Funktion noch ein weitern Vector3 mit der Position als Argument hinzufügen also z.B:

IEnumerator Change(Vector3 scale, Vector3 position) //Diese Funktion wird jeden Frame aufgerufen, bis der Button die gewünste größe hat
    {
        while (transform.localScale != scale && transform.localPosition = position)
        {
            transform.localScale = Vector3.Lerp(transform.localScale, scale, Time.deltaTime * 10f);
			transform.localPosition = Vector3.Lerp(transform.localPosition, position, Time.deltaTime * 10f);
            yield return new WaitForEndOfFrame();
        }
    }

Dann würde ich aber auch den Namen der Funktion ändern o.O

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Ich:

Wie gesagt ich möchte das nicht mit dem OnClick-Event machen sondern Scripten

Das OnClick-Event ist auch nur Code. Wenn du über Code etwas zum Event hinzufügen willst, dann mach das.

button.onClick.AddListener(Zeug);

Gänzlich zu sagen "ich will das onClick-Event nicht benutzen", obwohl es genau dafür da ist, ist wie zu fragen, wie man Suppe ohne Löffel essen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 24 Minuten schrieb Sascha:

Das OnClick-Event ist auch nur Code. Wenn du über Code etwas zum Event hinzufügen willst, dann mach das.


button.onClick.AddListener(Zeug);

Gänzlich zu sagen "ich will das onClick-Event nicht benutzen", obwohl es genau dafür da ist, ist wie zu fragen, wie man Suppe ohne Löffel essen kann.

Aber es wird doch nur erkannt wenn ich loslasse oder? :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

using System.Collections;
using UnityEngine;
using UnityEngine.EventSystems;

public class ButtonScale : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler, IPointerEnterHandler
{
    public bool isClick = false;

    public void OnPointerDown(PointerEventData eventData)
    {
        isClick = true;
        StopAllCoroutines();
        StartCoroutine(Scale(new Vector3(0.95f, 0.95f, 0.95f)));
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
        if (isClick)
        {
            StopAllCoroutines();
            StartCoroutine(Scale(new Vector3(0.95f, 0.95f, 0.95f)));
        }
    }

    public void OnPointerExit(PointerEventData eventData)
    {
        if (isClick)
        {
            StopAllCoroutines();
            StartCoroutine(Scale(Vector3.one));
        }
    }

    public void OnPointerUp(PointerEventData eventData)
    {
        isClick = false;
        StopAllCoroutines();
        StartCoroutine(Scale(Vector3.one));
    }

    IEnumerator Scale(Vector3 scale)
    {
        while (transform.localScale != scale)
        {
            transform.localScale = Vector3.Lerp(transform.localScale, scale, Time.deltaTime * 10f);
            yield return new WaitForEndOfFrame();
        }
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok wenn ich an den Rand klicke und gedrückte halte wird es kleiner doch dann aber wieder größer da ich nicht mehr auf dem Button bin da er ja kleiner wird und das immer wieder... :(

Ich benutze als Bild die Image (Script) komponente falls das hilft :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann würde ich das So lösen:

Du hast ein Parent Object mit der Größe vom Butto und weist das Script zu. Nun änderst du aber nicht die Größe von dem Object, das das Scrip  trägt, sondern verweist auf den Button bzw. das Image (das Child Object), da du die Unity Button Komponente ja im Prinzip nicht mehr brauchst (das regelt ja das Script).

Edit:
Das Parent Object benötigt noch eine Image Komponente, da es sonst nicht funktioniert.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...