Error "tipDisplayMessage has no receiver" w Unity3d

0

Witam. Tworzę swoją pierwszą grę i chciałem zrobić wyświetlanie podpowiedzi, ale pojawia mi się błąd, gdy takowy ma się wyświetlić. Pojawia się coś takiego:

"SendMessage tipDisplayMessage has no receiver!
UnityEngine.Component:SendMessage(String, Object)
TipCollider:OnTriggerEnter(Collider) (at Assets/TipCollider.cs:8)"

Chciałem zrobić, żeby skrypt z jednego obiektu korzystał z innego skryptu drugiego obiektu. Poniżej są oba skrypty:

//TipDisplayer

using UnityEngine;
using System.Collections;

public class TipDisplayer : MonoBehaviour {

    private bool showTip = false;
    private float timer = 0;
    public float tipTime = 5;
    public GUIText tipGUI;


    void Update ()
    {
        if(showTip)
        {
            if(timer<tipTime)
            {
                timer += Time.deltaTime;
            } else{
                tipGUI.enabled = false;
                showTip = false;
                timer = 0;

            }
        }
	}

    void displayTipMessage(string tipText)
    {
        tipGUI.text = tipText;
        tipGUI.enabled = true;
        this.showTip = true;
    }
}

//TipCollider

using UnityEngine;
using System.Collections;

public class TipCollider : TipDisplayer {

    
    void OnTriggerEnter(Collider other)
    {
        other.SendMessage("tipDisplayMessage", "Your Tip!");
    }
	
}

0

W SendMessage podajesz tipDisplayMessage.
A w klasie TipDisplayer masz metodę o innej nazwie: displayTipMessage.

0
Spine napisał(a):

W SendMessage podajesz tipDisplayMessage.
A w klasie TipDisplayer masz metodę o innej nazwie: displayTipMessage.

O my god, nie zauważyłem :/ Poprawiłem, ale teraz jest problem, bo mi się nie wyświetla ta podpowiedź (nie ma żadnego błędu ani nic)

0

Ścieżka dziedziczenia jest bez sensu. Skoro TipCollider dziedziczy po po TipDisplayer, to wystarczy, że collider wywoła metodę bezpośrednio (nie przez SendMessage).

Do czasowych eventów tego typu używaj Coroutine, a nie Update itp. Zamiast timera wystarczy wtedy yield return new WaitForSeconds(tipTime);.

Używasz przestarzałego komponentu GUI. Użyj normalnego Canvasa i komponentów Text, Image itp. Do tego najlepiej korzystać ze zdarzeń wysyłanych do komponentów UI. W przystępny sposób wykryujesz kiedy myszka znalazła się nad obiektem i kiedy z niego zeszła. Nie ma potrzeby odmierzania czasu.

SendMessage jest bardzo nieoptymalny, przelatuje przez wszystkie obiekty. Lepiej do tipów zrób sobie singleton, do którego będziesz odwoływał się bezpośrednio, przez statyczną referencję lub statyczną metodę.

0

Dzięki za pomoc, spróbuję zrobić tak jak piszesz. :) A co do dziedziczenia, to nie wiem jak mi weszło, że dziedziczyło od TipDisplayer'a xD. Ale cóż, pewnie dlatego użyłem SendMessage.

1 użytkowników online, w tym zalogowanych: 0, gości: 1