2014-07-11 4 views
2

Je fais cela en Unity 3D (en mode 2D) donc mes exemples de code seront en Unity/C# mais je pense que c'est plus un problème de physique général.Ajout de force au corps 2D et en même temps assurez-vous que la vitesse est toujours dans la direction du corps

je un vaisseau spatial en 2D qui volent autour et il rencontre parfois des astéroïdes (ou d'autres navires) et la façon dont j'ai mis en place cela est en convertissant une entrée utilisateur à un vecteur 2D comme ceci:

Vector2 movement = new Vector2(0, currentPlayerSpeed); 

Le "currentPlayerSpeed" est calculé par la vitesse maximale du vaisseau et ajouté dans une accélération dans le temps, et j'ajoute ensuite que Vector2D aux vaisseaux transforment dans la méthode Update comme ceci (le vaisseau vole toujours "up" par rapport à sa propre rotation):

transform.Translate(movement); 

Je fais tourner le navire basé sur l'entrée (et ajouté dans une certaine force de rotation max) et je fais tourner le navire directement et non via le corps de la physique (je l'ai mis par transform.Rotate (rotationVector)) et le navire volent toujours dans le sens de "haut" avec la vitesse actuelle signifie qu'il ne vole même pas le moins de côté jamais jamais. C'est comme ça que je veux que ça fonctionne, mais ... j'aimerais aussi que le vaisseau rebondisse sur tous les astéroïdes (ou autres vaisseaux) qu'il touche et je voudrais utiliser la construction en physique pour ça mais je ne sais pas comment appliquer correctement les forces pour maintenir la bonne vitesse/direction.

J'ai converti ma mise à jour à FixedUpdate et je fais maintenant ce pour déplacer le navire à la place:

rigidbody2D.AddForce (transform.up * currentPlayerSpeed); 
if(rigidbody2D.velocity.magnitude > maxShipSpeed) 
{ 
    rigidbody2D.velocity = rigidbody2D.velocity.normalized * maxShipSpeed; 
}

Donc, avec ce que je reçois le rebond hors effet que je veux, mais évidemment le navire voler maintenant de côté la plupart des le temps que la force n'est pas directement traduite à la vitesse des navires et la manipulation de la rigidbody2D.velocity me donne directement des résultats étranges, donc je n'ai aucune idée de comment faire cela. Voici une illustration de ce que je veux et pourquoi elle ne parvient pas à éclaircir les choses (les vecteurs ne sont pas dessinés correctement mais j'espère que cela a du sens de toute façon).

enter image description here

J'ai essayé avec le code suivant:

float magnitude = rigidbody2D.velocity.magnitude; 
rigidbody2D.velocity = transform.up * magnitude;

, ce qui rend le bateau mouche que je le veux, mais de toute évidence, il cansels également les forces de collision donc je suis de retour à carré zéro. Toute aide/idées sont les bienvenues car je suis assez coincé avec ça.

Merci
Søren

+0

La situation que vous décrivez est physiquement impossible. Chaque action a une réaction égale et opposée. Vous pourriez, je suppose, donner à votre vaisseau une masse énorme, donc l'effet apparent d'une collision sur lui est minimisé. –

+0

J'avais peur que cela soit physiquement impossible.Donner à mon vaisseau une masse énorme ne résoudra rien car je veux que les collisions aient un effet, je veux juste le combiner avec un mouvement non physique de mon vaisseau. Je suppose que je dois implémenter ma propre fausse physique si je veux que ça marche. – Neigaard

+0

Si les collisions ont un effet, plus la masse d'un objet est grande, plus l'impact est grand sur l'autre. Ce que vous auriez à faire est d'effectuer deux calculs. Un pour calculer l'effet sur la vitesse de rotation de votre navire, l'autre pour calculer l'impact sur l'astéroïde. Là où la physique tombe en panne, les lois du mouvement seraient différentes pour l'astéroïde et le vaisseau. Peut-être que ce vieux jeu pourrait déclencher une idée. https://www.youtube.com/watch?v=HlPgB9rEkBg :) –

Répondre

2

Il est facile comme bonjour pour y parvenir:

vous êtes vraiment juste essayer de « rebondir autour » (c'est-à-dire « à gauche et à droite » .. " en arrière et en avant ") car il continue à progresser vers le haut. La manière la plus simple dans Unity est de simplement faire en sorte que les collisionneurs se déclenchent, n'utilisez pas réellement les collisions PhysX. Lors de chaque collision, appliquez une force (la "force explosive" de Unity ira bien) dans la direction appropriée, à gauche ou à droite (avec peut-être une légère variation de haut en bas).

Profitez-en!

Questions connexes