Bonjour a tous,
Sa fait plus d'une semaine que je cherche sur internet si c'est possible d'appliquer une force au raycast sans trouvé de resultat, je m'explique, enfaite j'ai un véhicule, qui est contrôlé par le joueur, qui tire des genre de missiles, et sur ces missiles il y a un rigidbody et donc le missiles fait environs comme un obus il est envoyé en l'air puis il tombe quoi^^. et sur une longue distance c'est assez compliqué de visée alors j, ai fait des recherches pour faire en faite un genre de raycast visible par le joueur qui aurait la meme physique que le missile envoyé, ce qui permettrait de voir ou le missile tombera , mais je ne suis pas arrivé a trouvé une réponse donc si quelqu'un a une solution cela m'aiderait fortement!!! merci d'avance ;D
Appliquer une force au Raycast
Re: Appliquer une force au Raycast
Pourrais-tu être plus clair sur ce qui te bloque, stp :
- Comment appliquer une force ?
- Définir la direction de la force ?
- Dessiner un raycast ?
- Déterminer la trajectoire du missile ? (Est-ce que cette trajectoire est droite ou courbe ?)
- Comment appliquer une force ?
- Définir la direction de la force ?
- Dessiner un raycast ?
- Déterminer la trajectoire du missile ? (Est-ce que cette trajectoire est droite ou courbe ?)
- realitynauts
- Messages : 23
- Inscription : 15 Août 2012 09:42
- Contact :
Re: Appliquer une force au Raycast
Salut !
Je pense que tu peu utiliser ça :
Tu a juste à orienter l'axe Y dans la direction que tu veux avec un Objets vide par exemple, et ça propulsera l’objet dans cette direction, à toi d'appeler la fonction après~
Miaou~
Je pense que tu peu utiliser ça :
Code : Tout sélectionner
rigidbody.AddForce(new Vector3(0, ForceDeTonTire, 0));
Miaou~
Re: Appliquer une force au Raycast
En fait, tu veux afficher une courbe montrant la future trajectoire du prochain projectile tiré.
Tu ne peux pas courber un raycast et encore moins ajouter de la gravité à un raycast.
Il y a peut-être déjà un plug-in qui fait ce que tu cherches sur l'Asset Store. Sinon google les termes "unity" "ballistic" "curve"/"trajectory"... peut-être que quelqu'un a déjà posé la question et obtenue des bouts de codes.
En tout cas la solution propre pour ce problème n'est pas simple à coder. Il te faudra du calcul balistique si tu veux rester sur un système de physique réaliste et tracer une trajectoire juste.
Mais il y a des solutions de triche si le réalisme n'est pas ta priorité et que tu as des difficultés en code, comme:
- si le canon ne fait que tourner sur un axe, modéliser un mesh représentant une courbe de trajectoire et le placer à la sortie du canon (attention le point pivot du mesh doit être à son extrémité, la sortie de canon supposée), tout en lui changeant sa taille z en fonction de la puissance du projectile (là il te faut tester pour faire correspondre le point de chute du projectile avec le bout du mesh trajectoire).
- ton canon peut tirer des projectiles "test" invisibles et sans effet toutes les 0.X secondes pour te permettre d'en tirer certaines infos comme la distance du point de chute etc...
Tu ne peux pas courber un raycast et encore moins ajouter de la gravité à un raycast.
Il y a peut-être déjà un plug-in qui fait ce que tu cherches sur l'Asset Store. Sinon google les termes "unity" "ballistic" "curve"/"trajectory"... peut-être que quelqu'un a déjà posé la question et obtenue des bouts de codes.
En tout cas la solution propre pour ce problème n'est pas simple à coder. Il te faudra du calcul balistique si tu veux rester sur un système de physique réaliste et tracer une trajectoire juste.
Mais il y a des solutions de triche si le réalisme n'est pas ta priorité et que tu as des difficultés en code, comme:
- si le canon ne fait que tourner sur un axe, modéliser un mesh représentant une courbe de trajectoire et le placer à la sortie du canon (attention le point pivot du mesh doit être à son extrémité, la sortie de canon supposée), tout en lui changeant sa taille z en fonction de la puissance du projectile (là il te faut tester pour faire correspondre le point de chute du projectile avec le bout du mesh trajectoire).
- ton canon peut tirer des projectiles "test" invisibles et sans effet toutes les 0.X secondes pour te permettre d'en tirer certaines infos comme la distance du point de chute etc...
- artemisart
- Messages : 1893
- Inscription : 21 Juin 2011 19:51
- Localisation : Centre
- Contact :
Re: Appliquer une force au Raycast
Je ne ferais pas mieux que pated .
Quelques liens : un système assez avancé ici http://www.decarpentier.nl/ballistic-trajectories et quelques autres plus simples http://unitycoder.com/blog/2012/10/21/t ... est-scene/ http://forum.unity3d.com/threads/projec ... arc.12588/ http://forum.unity3d.com/threads/projec ... arc.12588/ http://answers.unity3d.com/questions/24 ... world.html etc (on trouve en effet beaucoup de choses avec ballistic trajectory).
Quelques liens : un système assez avancé ici http://www.decarpentier.nl/ballistic-trajectories et quelques autres plus simples http://unitycoder.com/blog/2012/10/21/t ... est-scene/ http://forum.unity3d.com/threads/projec ... arc.12588/ http://forum.unity3d.com/threads/projec ... arc.12588/ http://answers.unity3d.com/questions/24 ... world.html etc (on trouve en effet beaucoup de choses avec ballistic trajectory).
Re: Appliquer une force au Raycast
J'ai déjà fait ça sur un canon de bateau qui affichait la trajectoire du boulet de canon avant qu'il tire. Le canon tirait plus loin quand on laisser le bouton de la sourie enfoncé !
C'est basé sur un système de physique réaliste.
Je t'ai clean un peu le code. Je te mets un script que tu as juste à ajouter sur un GameObject. Le projectile partira en fonction de l'orientation de ce GameObject. Si tu as des questions n'hésite pas !
J'ai essayé de commenter un peu
Je sais pas si on peut mais ça serait bien de renommer le post parce que là, ça veut rien dire et c'est pas très représentatif des réponses.
C'est basé sur un système de physique réaliste.
Je t'ai clean un peu le code. Je te mets un script que tu as juste à ajouter sur un GameObject. Le projectile partira en fonction de l'orientation de ce GameObject. Si tu as des questions n'hésite pas !
J'ai essayé de commenter un peu
Code : Tout sélectionner
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(LineRenderer))]
public class BallisticProjectile : MonoBehaviour
{
// Projectile's prefab (Must have a Rigidbody)
public GameObject mTestProjectilePrefab = null;
// Projectile's initial speed
public float mPower = 10.0f;
public bool mShootProjectile = true;
Transform mTransform = null;
LineRenderer mlineRenderer = null;
// Use this for initialization
void Start ()
{
mTransform = GetComponent<Transform>();
mlineRenderer = GetComponent<LineRenderer>();
mlineRenderer.enabled = false;
}
// Show ballistic when left mouse bouton is down
void Update ()
{
if (Input.GetMouseButton(0))
{
ShowBallitstic();
}
else if (Input.GetMouseButtonUp(0))
{
mlineRenderer.enabled = false;
if (mTestProjectilePrefab != null && mShootProjectile)
{
GameObject projectile = Instantiate(mTestProjectilePrefab, mTransform.position, mTransform.rotation) as GameObject;
if (projectile.rigidbody != null)
{
projectile.rigidbody.AddForce(mTransform.forward * mPower, ForceMode.VelocityChange);
}
else
{
Debug.LogWarning("Projectile need a Rigidbody");
}
}
}
}
void ShowBallitstic()
{
// Set gravity force
float gravity = -Physics.gravity.y;
// Compute angle of local transform
Vector3 horizontalForward = mTransform.forward;
horizontalForward.y = 0;
horizontalForward.Normalize();
float angle = Vector3.Angle(horizontalForward, mTransform.forward);
angle *= Mathf.Deg2Rad;
// Compute speed according to power
Vector3 velocity = mTransform.forward * mPower;
float velocityZero = velocity.magnitude;
float yZero = mTransform.position.y;
// Compute distance according power and gravity
float distance = (velocityZero * Mathf.Cos(angle) / gravity) * ((velocityZero * Mathf.Sin(angle)) + Mathf.Sqrt((velocityZero * velocityZero * Mathf.Sin(angle) * Mathf.Sin(angle)) + (2 * gravity * yZero)));
// Count of line renderer edge
int nbStep = Mathf.CeilToInt(distance) + 1;
mlineRenderer.enabled = true;
mlineRenderer.SetVertexCount(nbStep);
// Compute position
for (int i = 0; i < nbStep; i++)
{
float x = i;
// Compute height accordding to distance
float y = (float)((-0.5f * gravity * ((x * x) / (velocityZero * velocityZero * Mathf.Cos(angle) * Mathf.Cos(angle)))) + (Mathf.Tan(angle) * x));
Vector3 nextPosition = mTransform.position + horizontalForward * x;
nextPosition.y = yZero + y;
// Set vertex line renderer position
mlineRenderer.SetPosition(i, nextPosition);
}
}
}