Ruch kamery w grze 2D Unity


#1

Potrzebuje pomocy. Robie 2D gre i jestem przy kontroli kamery.
Śledzenie gracza wiadomo proste, załatwiłem to kodem:
transform.position = new Vector3(gracz.position.x, gracz.position.y, gracz.position.z - kameraOffset);

Ale mam problem z tym, żeby kamera nie wychodziła za mape. Jak postać jest w lewym dolnym rogu to widać:

A chciałbym, żeby to wyglądało tak:

Chciałbym zblokować ruch kamery jakos wtedy gdy ma wyjsc juz za mape, ale pomysły, które miałem zawaliły. Może ktoś zna rozwiązanie ?


#2

A i owszem :slight_smile:

https://youtu.be/rnbX-eUalVQ


#3

Dzieki, ale co jezeli mapa jest nieregularna (prostokąt jak na filmiku)


#4
transform.position = new Vector3(gracz.position.x, gracz.position.y, gracz.position.z - kameraOffset);

if (transform.position.x < 0) transform.position.x = 0;

(za 0 podstaw skrajną pozycję x kamery)


#5

Chyba nie rozumiem. Masz do podania cztery pozycje tj. początkowy X Y oraz końcowy X Y. Tym sposobem dasz radę spokojnie to zrobić. Tym bardziej ze prostokąt jest figurą regularną.


#6

Okej a co jesli mam nieregularne kształty mapy ? Mam na mysli np piramide ?


#7

A mi chodzi własnie o mape nieregularną. Narazie użyłem tego sposobu z filmiku, żeby nie stać w miejscu ale chciałbym poznać sposób i go użyć u siebie jak zrobić np. mapę w kształcie weza.


#8

Skoro kumasz jak zatrzymać kamerę na krawędziach planszy kiedy plansza ma kształt prostokąta. Ale nie wiesz jak tę kamerę zatrzymywać kiedy plansza ma bardziej skomplikowany kształt. To rozbij ten skomplikowany kształt planszy na prostokąty.


#9

Możesz wyifować sobie gdy gracz będzie w danym x to wtedy nadać początkowym i końcowym x,y dane wartości. Chociaż nie wiem czy jest to efektowny sposób.


#10

Tak i nie, zależy jak rozbudowana jest gra. Sposób dobry moze na chwile ale nie na dłużej


#11

Ale tak zrobie xD Nie mam narazie innego wyjscia


#12

Zamiast if’ów można użyć funkcji Clamp (działa jak if’y ale krócej w kodzie):
https://docs.unity3d.com/ScriptReference/Mathf.Clamp.html
(funkcja zwróci minimalną lub maksymalną wartość, kiedy zmienna wyjdzie poza zakres):
Mathf.Clamp(float value, float min, float max);

np:
transform.position.x = Mathf.Clamp(transform.position.x, -5f, 4f);
(w powyższym przykładzie transform.position.x nigdy nie będzie mniejsze od -5 i nigdy większe od 4)