Appliquer une force au Raycast

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
jeux007
Messages : 45
Inscription : 20 Nov 2011 23:59
Localisation : Mont de Marsan
Contact :

Appliquer une force au Raycast

Message par jeux007 » 28 Juil 2014 17:59

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 :D

Pico57
Messages : 576
Inscription : 19 Fév 2013 16:30
Localisation : Cluny

Re: Appliquer une force au Raycast

Message par Pico57 » 28 Juil 2014 21:09

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 ?)

Avatar de l’utilisateur
realitynauts
Messages : 23
Inscription : 15 Août 2012 09:42
Contact :

Re: Appliquer une force au Raycast

Message par realitynauts » 28 Juil 2014 21:15

Salut !

Je pense que tu peu utiliser ça :

Code : Tout sélectionner

rigidbody.AddForce(new Vector3(0, ForceDeTonTire, 0));
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~

Avatar de l’utilisateur
pated
Messages : 146
Inscription : 25 Juil 2014 01:44
Contact :

Re: Appliquer une force au Raycast

Message par pated » 28 Juil 2014 23:05

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...


PsyKaw
Messages : 3
Inscription : 19 Déc 2013 01:52

Re: Appliquer une force au Raycast

Message par PsyKaw » 30 Juil 2014 22:46

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 :P

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

Répondre

Revenir vers « Scripting »