Controller di personaggi 2D in unità (cercando di riavere indietro i platform della vecchia scuola)


11

Oggi sto cercando di creare un controller di caratteri 2D con unità (usando la fisica). Sono abbastanza nuovo per i motori fisici ed è davvero difficile ottenere la sensazione di controllo che sto cercando. Sarei davvero felice se qualcuno potesse suggerire la soluzione di un problema che sto riscontrando:

Questo è il mio FixedUpdate in questo momento:

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);
}

Sto provando qui a spostare il corpo rigido applicando una gravità e una forza lineare per sinistra e destra. Ho installato un materiale fisico che non fa rimbalzare e 0 attriti durante lo spostamento e 1 attrito con fermo. Il problema principale è che ho collider con pendenze e la velocità cambia salendo (più lentamente), scendendo (più velocemente) e camminando su un collider dritto (normale). Come potrebbe essere risolto? Come vedi sto applicando sempre la stessa velocità per l'asse x.

Per il giocatore l'ho impostato con una sfera in posizione piedi che è il corpo rigido a cui sto applicando le forze.

Ogni altro suggerimento che potrebbe semplificarmi la vita è ben accetto :).

PD Mentre tornavo a casa ho notato che avrei potuto risolvere questo problema applicando una forza costante parallela alla superficie su cui cammina il giocatore, ma non so se sia il metodo migliore.


4
I platform della vecchia scuola usavano la "fisica dei cartoni animati" sintonizzata a mano per la meccanica del salto e il controllo diretto della velocità (cioè nessuna fisica) per i movimenti della deambulazione. Se riesci a riscrivere il controller del personaggio, fallo, perché sarà difficile colpire e stimolare una simulazione di fisica squishy nei movimenti nitidi che avevano i giochi della vecchia scuola.
Patrick Hughes,

Il problema di scriverne uno personalizzato è che il rilevamento delle collisioni viene perso. E non è facile ricostruirlo senza usare raycast (a seconda dell'ambiente, ecc ... potrebbe essere un mucchio di loro). Come gestite queste situazioni?
Notbad,

Puoi avere collider su cose che sono ancora personalizzate animate quando usi corpi rigidi cinematici. Garantirei che nella maggior parte dei casi non vuoi davvero la fisica / le forze del mondo reale ecc. Per questo tipo di applicazione. Se stai cercando un angolo più tecnico, forse cerca Human IK
Runonthespot il

1
Definisci la fisica in questa situazione.
Ray_Garner,

Risposte:


7

Se stai cercando di imitare i platform della vecchia scuola, il primo passo è abbandonare del tutto la fisica. Finirai per combattere il sistema fisico per ottenere il movimento decisamente non realistico di un platform della vecchia scuola. Dai un'occhiata a questa sostituzione CharacterController che elimina del tutto la fisica per avere una buona idea di un modo per implementarla.


3

Probabilmente saresti più felice di seguire ciò che mheona ha raccomandato. Ma se hai intenzione di usare la fisica di Unity, probabilmente vorrai usarla ForceMode.VelocityChange.

Esempio:

public void FixedUpdate()
{
    var v = Vector3.zero;
    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.AddForce(v, ForceMode.VelocityChange);

    Debug.Log("Velocity: "+_body.velocity);
}

Dovresti anche applicare la gravità globale nelle impostazioni di Fisica del tuo progetto e, per gli oggetti che vuoi cadere più velocemente, aggiungi un componente Forza Costante .

ForceMode.Impulseè simile ma è influenzato dalla massa del corpo rigido. Rende più difficile la sintonizzazione.


2

Anche se non ti piace il componente Character Controller integrato (come faccio io), dai un'occhiata al codice di esempio di Unity per il tutorial di gioco 2D .

Il codice implementa un gameplay 2D completo con piattaforme mobili, nemici e scatole con collisione, usando il Character Controller.

Ma se non vuoi nemmeno dare un'occhiata, ti consiglio di ridurre al minimo l'uso della fisica e provare a copiarne il comportamento con il tuo codice. A seconda del tipo di gioco 2D che stai pianificando, potrebbe funzionare abbastanza bene. Ad esempio, invece di applicare la forza per Rigidbody.velocityspostare il tuo personaggio, potresti confonderlo direttamente Transform.Translate(), il che sposta l'oggetto in Transform.positionbase al suo asse. Potresti determinare forwarde backcorrelare l'oggetto stesso o forse la piattaforma o il pavimento Transform.up, quindi saprai se è una rampa e in qualche modo conosci il suo angolo.

Inoltre, se crei una sorta di attributo di controllo della velocità (ad es. Per quanto tempo viene premuto il tasto) puoi applicarlo insieme alla tua direzione mentre traduci per impedire al tuo personaggio di camminare qualcosa di troppo inclinato senza una certa velocità, proprio come hanno fatto su Sonic the Hedgehog per Genesis / Mega Drive.

Se scegli di continuare a usare la fisica, non posso aiutarti affatto perché non sono così bravo a farlo, ma tieni presente che è un comportamento normale andare su una pendenza più lentamente poiché il corpo ha bisogno di più forza per tenere il passo , come la vita reale.


La prima cosa che ho letto quando sono entrato nell'unità è stato quel tutorial. Il problema è che la sensazione di controllo è piuttosto negativa. Ecco perché volevo trovare la mia soluzione. D'altra parte quando si inizia a usare Transform.Translate () non è così facile fare pendenze e altre cose. Devi lanciare ray cast più volte (2 o 3 per il pavimento, più per la direzione in cui ti stai muovendo a seconda delle dimensioni dell'eroe). Per i dispositivi mobili il raycast non è buono, e meno se devi fare 5..n per iterazione di rilevamento delle collisioni. Forse potrei sbagliarmi, ma non la penso così.
Notbad,

1

Quello che vuoi è il Character Controller integrato . Impostando la step offsetproprietà su questo componente puoi far sì che un giocatore si muova su e giù per le piste con facilità.


Scusate se non ho commentato, so che c'è un controller dei personaggi nell'unità e che l'ho usato più volte, ma non mi piace come si comporta. È più adatto solo per FPS, non un gioco platform in cui la meccanica del movimento è una delle cose più importanti.
Notbad,

Penso che una volta che giocherelli con le impostazioni sul Character Controller funzioni bene. Cosa hai trovato carente?
NoobsArePeople2

La prima cosa che non mi piace è che è lento rispetto ai soliti corpi rigidi con qualche raggio di lancio. Sapendo come raggiungerlo, penso di poter fare un controller più leggero. Un altro problema è quello di essere un comportamento strano capsula / sfera ai bordi della piattaforma (può essere risolto con alcuni altri cast ray). Questo è il motivo per cui voglio fare il mio.
Notbad,

0

inserisci qui la descrizione dell'immagineSuppongo sia perché la forza non è parallela alla piattaforma e il risultato finisce per essere più basso in salita e più alto in discesa.

Se si applica una forza relativa al sistema di coordinate

AddRelativeForce

Vuoi mantenere una velocità massima in "x" e confrontarla con uno scalare, ricorda che la velocità è un vettore e componi vx e vy, in terreno piatto vy è zero, ma necessariamente su pendenze è maggiore di zero.

La velocità cambia secondo la direzione del corpo e la sua vx relativa cambia rispetto alla sua vx complessiva

Questo può modificare la tua V in un modo che non vuoi troppo:

if (Mathf.Abs (v.x)> _ maxWalkSpeed) v.x = _maxWalkSpeed;

mantenere lo stesso Vx globale può sembrare strano alla vista. (Accelerazioni indesiderate)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.