Skrypt teleportacji z zapisanych koordynatów


#1

Hej, mam problem bez którego nie mogę skończyć mapy. Znalazłem w necie proste skrypty na teleport z funkcji ontriggerenter i ontriggerstay, ale nie chcą działać u mnie oprócz OTE. Muszę go zmodyfikować ale nie wiem jak - domyślnie koordynaty biorę z pustych gameobject.transform.position, ale nie wiem czy nie lepiej będzie zapisać koordynaty 2d x,y zapisać bezpośrednio w skrypcie. Tylko nie wiem od czego zacząć, ktoś robił już plik z teleportami? I czy nie lepiej jest wrzucić teleporty w plik poruszania się postaci gracza?


#2
  1. Zapisać w skrypcie - nie, gdyż ponieważ co w sytuacji jak będziesz chciał przenieść się w inne koordynaty? Będziesz tworzył osobny skrypt dla każdego możliwego teleportu? Lepiej też podać pusty obiekt jako cel, ponieważ łatwiej to wtedy ustawić w edytorze. Wpisywanie koordynatów z ręki jest niepotrzebnie męczące i nieintuicyjne, a już wpisanie ich na stałe w kod jest w zasadzie błędem projektowym.

  2. Z tego co rozumiem masz skrypt inicjacji teleportu ( uruchamiany zdarzeniem OnTriggerEnter ), gdzie najpewniej ma miejsce zmiana pozycji postaci gracza na pozycje pobraną od innego obiektu. Zgaduje, że gracz przenosi się w miejsce innego teleportu i żeby nie wpaść w pętle zostało zaimplementowane jakieś zabezpieczenie w OnTriggerStay. Chyba.

Jeżeli chodzi o przeniesienie postaci w inną lokację to

public Transform target;

void OnTriggerEnter( Collider other ){
// if ( other.tag == “Player” )
other.transform.position = target.postion
// + ewentualnie kwestia kamery jeżeli nie śledzi gracza z automatu.
}

  1. Nie, lepiej nie wrzucać czegoś co nie jest poruszaniem gracza w plik poruszania gracza.

#3

Wszystko fajnie, ale to ma działać na przycisk funkcji i przycisk dotykowy, a ontriggerenter działa tylko kiedy pierwszy raz dotykasz triggera.
Nie mniej, dziękuję, jeszcze tylko rozwiązać drugi problem i po sprawie =).


#4

Znalazłem skrypt ale wywala mi error bez erroru. Dziwne.
Tu macie dwa skrypty jakby komuś miało się przydać - działają w obie strony, tylko może ktoś pomóc naprawić ten błąd?
error1

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

public class TeleportKey : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Player")
        {
            Teleportation.StartTeleport = 1;
        }
    }
}

i ten drugi:

 using System.Collections;
 using UnityEngine;

public class Teleportation : MonoBehaviour
{
    public GameObject Portal, Player;
    public static int StartTeleport = 0;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Player" && Teleportation.StartTeleport == 1)
        {
            Teleportation.StartTeleport = 0;
            StartCoroutine(Teleport());
        }
    }

    IEnumerator Teleport()
    {
        yield return new WaitForSeconds(1);
        Player.transform.position = new Vector2(Portal.transform.position.x, Portal.transform.position.y);
    }
}

Ma ktoś jakiś pomysł?

Dobra, przekomplowało się - miałem inne nazwy klasy. Możecie pobierać! =)


#5

Dodaj w opisie silnik, widzę ze Unity 3d

Teleportacja to zmiana pozycji. Skryptu wystarczy 1 linijka:
“player.transfrom.position = goalObject.transform.position;”

Bardzo polecam jakiś marker widoczny tylko w edytorze jako cel teleportacji, bo inaczej ciężko to utrzymywać jak zmienisz geometrie levelu i zaczniesz teleportować rzeczy w losowe miejsca.

Do tego do zarządzania teleportacją będzie potrzebna masa kodu wokoło procesu.
Nie opisałeś w jaki sposób ta teleportacja ma działać w grze. Co ją wywołuje itd.
Na triggerze moze wystarczyc on enter.
Ogólnie dobrą prektyką jest żeby skrypt gracza mógł jednak zadecydować sam czy może się teleportować czy nie.
w takiej sytuacji np trigger może wysłać message

void OnTriggerEnter( Collider other ){
other.gameObject.SendMessage(“PleaseTeleportTo”, TargetObject);
}

i wtedy skrypt gracza:
public void PleaseTeleportTo(GameObject target){
transfrom.position = target.transform.position
}

ale w praktyce dojdzie tam zawsze więcej warunków itd.