Skrypt odpalający animacje pod trigger


#1

Mam małą prośbę; czy mógłby mi ktoś napisać skrypt który, będzie włączał animacje po wejściu przedmiotu w trigger.
Oto moja nieudolna próba:

public Animation anim;

public GameObject obj;


void OnTriggerEnter(Collider collision)
{

	if (collision.gameObject = obj) 
	{

		anim = GetComponent<Animation> ();


		Animation.Play(obj);



	}


}

}

Z góry dziękuje za pomoc.


#2

W animator controller masz variables. np ustawiasz trigger. i w OnTriggerEnter -> animator controller.setTrigger(“name”);
w animator controlerze dajesz animacje i blend pomiedzy nimi.

W twoim skypcie jest blad bo przypisujesz komponent animation do zmiennej anim. a pozniej robisz Animation.Play(obj) i przesylasz do jakby statycznej klasy gameobject ktory aktywowal trigger.

Teraz tez jest wazne na czym jest ta animacja -> czy na obiekcie trigger czy np na czyms co tego triggera ustawia. Domyslam sie ze to drugie (bardziej prawdopodobne). wiec
powinno byc bardziej cos w stylu:
anim = obj.getComponent();
anim.Play();

Ale na twoim miejscu poczytal bym o animator controller i jak to powinno wygladac.
oficjalny tutorial unity


#3

Przepraszam że z innego konta ale zmieniłem urządzenie.

Mi bardziej chodzi o to że wchodzę w trigger (pusty gameobject z colliderem) i włącza się jakaś animacja wybranego objektu. Np. Idę wchodzę w trigger i uderzają we mnie kolce.

Z tąd te “public”. Po prostu script ma być uniwersalny a ja jestem na poziomie podstawowym z C# w unity.


#4

Jak na moje powinienes to zrobic funkcja OnTriggerEnter2D, zdeklarowac animator i potem ustawic trigger. Cos w stylu:

Animator Animator;

void Start ()
    {
        Animator = GetComponent<Animator>();
    }

private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.gameObject.tag == "twoj_tag")
        {
            Animator.SetTrigger("twoj_trigger");
        }

Pozdrawiam cieplutko :wink:


#5

Powinines przejsc podstawy c# skryptow na stronie Unity bo masz duzo bledow.
Bo np. przypisyjesz obj do gameobject ktory aktywowal trigger.

Czyli chesz zrobic tak ze jak jakis obiekt (dajmy na to player) aktywuje trigger to cos co jest podlaczone do ttrigera akytuwje sie (animacja itp) ?


#8

@RoboCat Wszystko jasne, usunmy po swojej ostatniej wypowiedzi zeby mi nie zaspamic :stuck_out_tongue:


#9

Hej, Dorzucę tylko malutką uwagę.
OnTriggerEnter2D - do gier 2D
OnTriggerEnter - do gier 3D
Łatwo się pomylić a działać nie będzie jak użyjesz nie tego co trzeba. Pozdrawiam


#10

Tak jak bylo wyzej napisane - musisz wybrac odpowiednia funkcje trigger ( ja dla przykladu dalem 2d)
Tutaj masz basic - gotowca, musisz poczytac i samemu poprobowac i rozwinac dalej. (powinno dzialac ale na 100% pewien nie jestem bo nie testowalem i pisze z glowy)

Najpierw potrzebujesz interface (tutaj najbardziej podstawowy i mozesz go pozniej roziwnac)
ITriggable: dalem transform ale mozna tez dac game object, to bedzie obiekt ktory wszedl do triggera i go aktywowal -> przesylasz go pozniej do funkcji jako target. przyda sie jezeli cos bedzie potrzebowalo celu.

public interface ITriggable {
    void Act(Transform target);
}

Teraz do wszystkiego co ma mozliwosc “zadzialac” w przypadku wejscia w triggery musisz dodac ten interface np:

public class ObjectWithAction : MonoBehaviour, ITriggable {

    public void Act(Transform target)
    {
        //Make Animation and action on object, co tylko chcesz
        Debug.Log("acting");
    }  
}

I teraz robisz pusty obiekt z triggerem i dodajesz taki skrypt:

public class ObjectWithTrigger : MonoBehaviour {
    List<ITriggable> actObjects;
    private void OnTriggerEnter2D(Collider2D collision)
    {
        foreach (ITriggable it in actObjects)
            it.Act(collision.gameObject.transform);
    }
}

Ustawiasz taki obiekt w scenie i do listy actObjects dodajesz obiekty ze skryptem ktory ma zaimplementowany ten interface ITriggable.
I teraz kiedy np player wejdzie w taki trigger -> to zostanie uruchomiona funkcja Act() na wysztkich obiektach dodanych do listy actObjects. Przydaten jak masz np jedna kratke korytarza i np kolce z 3ch stron. albo kolce, spadajace kamienie i zapalajace sie swiatelko albo i nawet otwierane drzwi na drugim koncu planszy.

Dzieki temu masz obiekt z triggerem ktorego wielkosc , ksztalt itp mozesz ustawiac dowolnie + dodac co tylko chcesz zeby bylo aktywowane przy wejsciu na ten trigger.

Mam nadzieje ze pomoglem :]


#11

Dzięki za wszystko. Się jutro po próbuje. :smirk:


#12

Niestety tym sposobem nie udało mi się zrobić ale znalazłem inny sposób.

Oto skrypt jakby ktoś chciał:
public GameObject trap;

void OnTriggerEnter(Collider collider) {
	if (collider.gameObject.name == "Player") 
	{
		trap.GetComponent<Animation> ().Play ();
	}
}    

}

Ale i tak dzięki za pomoc.


#13

Nie udalo sie, bo dawalismy sposob na trigger, czyli musiales w animatorze sobie najpierw taka funkcje stworzyc i ja dobrze opisac :smiley: Chociaz tak tez mozna, pozdrawiam :smiley:


#14

Nie dzialalo bo gosciu nie zna nawet podstaw. Dlatego nie widzi nawet ze to co mu dziala to to samo co mu podalem tylko w najgorszej mozliwej wersji podczepiania wszystkiego na sztywno i zadnej kontroli… i nie zdziwilbym sie ze nawet nie rozumie tego co mu “dziala” :smiley: ehhh


#15

Kolejne inne konto.

Sory ale ja przed egzaminami myślę łopatologicznie. A skrypt działa tak że: jeżeli przedmiot/postać o nazwie [w środowisku unity] “player” wejdzie w collider z triggerem włącza się animacja z “Animation” dodanego przedmiotu. Ps zapomniałem wkleić “public” nad skryptem. Więc troche już ogarniam. Jeszcze raz dzięki za wszystko. Gra w Beta testach.:grinning:


#16

Pokaż co tam masz za gierkę :wink:
PS. Lepiej by było gdybyś w void Start pobierał komponent a nie w samym koliderze i lepiej szukać po tagu niż po nazwie ale co my tam wiemy :smiley: