Obecnie próbuję stworzyć kontroler postaci 2D z jednością (za pomocą fizyki). Jestem dość nowy w silnikach fizycznych i naprawdę trudno jest uzyskać kontrolę, której szukam. Byłbym bardzo szczęśliwy, gdyby ktoś mógł zaproponować rozwiązanie problemu, który znajduję:
To jest teraz moja FixedUpdate:
public void FixedUpdate()
{
Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
_body.AddForce(v);
v.y=0;
if(state(MovementState.Left))
{
v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
}
else if(state(MovementState.Right))
{
v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
}
_body.velocity=v;
Debug.Log("Velocity: "+_body.velocity);
}
Próbuję tu po prostu przesunąć sztywne ciało przy użyciu siły grawitacji i siły liniowej dla lewej i prawej. Mam ustawiony materiał fizyczny, który nie powoduje podskakiwania i 0 tarcia podczas ruchu i 1 tarcie przy bezruchu. Głównym problemem jest to, że mam zderzaki ze zboczami, a prędkość zmienia się od wchodzenia w górę (wolniej), schodzenia w dół zbocza (szybciej) i chodzenia po prostym zderzaku (normalny). Jak można to naprawić? Jak widać, zawsze stosuję tę samą prędkość dla osi x.
Dla gracza mam to ustawienie z kulą w pozycji stóp, która jest sztywnym ciałem, do którego przykładam siły.
Wszelkie inne wskazówki, które mogłyby ułatwić mi życie, są mile widziane :).
PD Wracając do domu zauważyłem, że mogę rozwiązać ten problem, stosując stałą siłę równoległą do powierzchni, po której idzie gracz, ale nie wiem, czy to najlepsza metoda.
źródło
Odpowiedzi:
Jeśli chcesz naśladować oldskulowe platformówki, pierwszym krokiem jest porzucenie fizyki. Skończysz walkę z systemem fizyki, aby uzyskać zdecydowanie nierealistyczny ruch starej szkolnej platformówki. Spójrz na tę zamiennik CharacterController, która całkowicie porzuca fizykę, aby uzyskać dobry pomysł na jeden ze sposobów jej wdrożenia.
źródło
Prawdopodobnie byłbyś szczęśliwszy, postępując zgodnie z zaleceniami mheona. Ale jeśli zamierzasz użyć fizyki Unity, prawdopodobnie prawdopodobnie chcesz to wykorzystać
ForceMode.VelocityChange
.Przykład:
Powinieneś również zastosować globalną grawitację w ustawieniach Fizyki swojego projektu, a do obiektów, które chcesz upaść szybciej, dodaj komponent Constant Force .
ForceMode.Impulse
jest podobny, ale wpływa na niego masa ciała sztywnego. Utrudnia dostrojenie.źródło
Nawet jeśli nie podoba ci się wbudowany kontroler postaci (tak jak ja), spójrz na przykładowy kod Unity dla samouczka rozgrywki 2D .
Kod implementuje pełną rozgrywkę 2D z ruchomymi platformami, wrogami i skrzynkami z kolizją, za pomocą kontrolera postaci.
Ale jeśli nawet nie chcesz rzucić okiem, sugeruję, aby zminimalizować użycie fizyki i spróbować skopiować jej zachowanie za pomocą własnego kodu. W zależności od rodzaju planowanej gry 2D może ona działać całkiem dobrze. Na przykład, zamiast przykładać siłę, aby
Rigidbody.velocity
poruszać postacią, możesz zadzierać bezpośrednioTransform.Translate()
, która porusza obiekt wTransform.position
oparciu o jego oś. Możesz określićforward
iback
związany z samym obiektem, a może platformą lub podłogąTransform.up
, dzięki czemu będziesz wiedział, czy jest to rampa i jakoś znasz jego kąt.Również jeśli stworzysz coś w rodzaju atrybutu kontroli prędkości (np. Jak długo wciśnięty jest klawisz), możesz zastosować go razem z twoim kierunkiem podczas tłumaczenia, aby zapobiec twojemu bohaterowi chodzenia po czymś zbyt pochylonym bez pewnej prędkości, podobnie jak robili to Sonic the Hedgehog dla Genesis / Mega Drive.
Jeśli zdecydujesz się nadal używać fizyki, nie mogę ci w ogóle pomóc, ponieważ nie jestem w tym tak dobry, ale pamiętaj, że normalnym zachowaniem jest chodzenie wolniej, ponieważ ciało potrzebuje więcej siły, aby nadążyć , jak prawdziwe życie.
źródło
Co chcesz to wbudowany kontroler postaci . Ustawiając
step offset
właściwość dla tego komponentu, możesz sprawić, że gracz będzie mógł łatwo poruszać się po zboczach.źródło
Przypuszczam, że dzieje się tak, ponieważ siła nie jest równoległa do platformy, a wynik kończy się niższym wzrostem i większym spadkiem.
Jeśli zastosujesz siłę względną do układu współrzędnych
Chcesz zachować maksymalną prędkość w „x” i porównać ją ze skalarem, pamiętaj, że prędkość jest wektorem i składa się z vx i vy, w płaskim terenie vy wynosi zero, ale koniecznie na zboczach jest większe niż zero.
Prędkość zmienia się zgodnie z kierunkiem ciała, a jej względne vx zmienia się w stosunku do ogólnego vx
Może to zmodyfikować twój V w sposób, którego nie chcesz:
utrzymywanie tego samego globalnego Vx może wydawać się dziwne dla oka. (Niepożądane przyspieszenia)
źródło