Ho scritto il codice bullet per PlanetSide. Avevamo alcuni proiettili "hitcan", ma per lo più simulavamo i proiettili nel miglior modo possibile, tenendo conto dei vincoli della CPU e dell'enorme numero di proiettili in gioco in qualsiasi momento.
Nel caso di hitscan, l'impatto è determinato nello stesso frame dell'input ricevuto, spesso usando un singolo raycast. Questo è appropriato per armi come laser o altri proiettili estremamente veloci. Abbiamo fatto hitcan semplicemente accendendo la velocità iniziale sul proiettile così in alto da attraversare il tabellone in un solo tick.
I proiettili non hitcan sono spuntati, sia sul tempo del frame grafico che su un timestep fisso, con calcoli per accelerazione (pensa ai razzi), gravità, attrito dell'aria, guida (pensa ai proiettili in cerca di calore) ecc. L'obiettivo è generare la posizione terminale del proiettile per il timestep. Una volta stabiliti i punti di inizio e fine, è possibile lanciare uno o più raggi per approssimare la traiettoria di volo e rilevare eventuali collisioni che si sarebbero verificate durante il volo.
In entrambi i proiettili hitcan e non hitcan, ciò che accade in caso di collisione dipende dalle proprietà del tuo proiettile e dalla superficie che impatti. Ad esempio, potresti colpire una superficie dura, nel qual caso potresti controllare il conteggio del rimbalzo e regolare la posizione e la velocità per un riflesso, oppure far esplodere il proiettile se hai raggiunto il conteggio del rimbalzo massimo. In questo sistema, un razzo ha solo un conteggio di rimbalzo massimo di 0. Potresti colpire una superficie morbida e quindi controllare il tuo potere penetrante per determinare se il proiettile dovrebbe continuare attraverso il materiale, ecc.
È stato divertente scrivere codice. Inoltre, è super utile scrivere una buona visualizzazione di debug di ciò che sta succedendo in modo da poter ispezionare visivamente percorsi di volo, eventi, ecc.