[Resolu][DB-AL] Tir réaliste

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Kizilom
Messages : 17
Inscription : 20 Avr 2017 22:10

[Resolu][DB-AL] Tir réaliste

Message par Kizilom » 20 Avr 2017 22:56

Bonsoir, je viens vous demandez de l'aide par rapport à un obstacle qui est venu se poser juste devant moi et que je n'arrive pas à franchir.
Pour vous mettre un peu dans le contexte, je travail sur un FPS, en bref rien de passionnant pour vous.
On va pas se mentir les tutoriels qui parlent de FPS ce n'est pas ce qu'il manque et pourtant... :/ je n'ai toujours pas trouvé ma réponse.

En gros j'aimerai donné un départ et une trajectoire plus ou moins réaliste à ma balle, ayant commencé par la modélisation d'un glock 17 je voudrai donc que celle ci partent à plus de 300m/s mais soit très vite freiner par un force externe qui me permettrai de la faire tomber à une cinquantaine, centaine de mètres selon mon choix, en espérant que cela soit réalisable.
J'ai chercher pas mal de tutos mais j'en ai trouvé aucun qui parlent de ça, j'ai pensé au rigidbody AddForce suis-je sur la bonne voie ?
En tout cas si vous en avez pour moi sa serait super, n’étant pas bilingue si vous pouviez m’éviter les vidéos en anglais je ne les comprendraient pas merci :) pour les sites par contre il n'y a pas de soucis mon samsung le parle très bien.

Merci pour vos réponses et celles que vous apportez aux autres !

Mon script actuel :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletTir : MonoBehaviour
{
    //DeclarationVariables

    public Rigidbody Eject;
    public AudioClip SonDuTir;
    public AudioClip SonDeRechargement;
    public int Chargeur = 30;
    public int Reserve = 30;
    public int MinReserve = 0;
    public int ChargeurMax = 30;
    public int Force = 50;
    public float VitesseDeTir = 0.5F;

    private float Cooldown = 0.0F;
    private bool FullAuto = false;

    //DeclarationMethodes

    void PiocheReserve()
    {
        Reserve -= ChargeurMax - Chargeur;
    }

    void Update()
    {

        //Tirer

        if (Input.GetButton("Fire1") & Time.time > Cooldown)
            if (Chargeur >= 1)
            {

                GetComponent<AudioSource>().PlayOneShot(SonDuTir);
                Cooldown = Time.time + VitesseDeTir;
                Rigidbody Bullet;
                Bullet = Instantiate(Eject, transform.position, transform.rotation);
                Chargeur -= 1;
                Bullet.velocity = transform.TransformDirection(Vector3.left * Force);
            }

        //Recharger

        if (Input.GetKeyDown(KeyCode.R) & Chargeur < ChargeurMax & Reserve >0)
        {
            PiocheReserve();
            Chargeur += ChargeurMax - Chargeur;
            GetComponent<AudioSource>().PlayOneShot(SonDeRechargement);
        }

        if (Chargeur > ChargeurMax)
        {
            Chargeur = ChargeurMax;
        }

        if (Reserve <= 0)
        {
            Reserve = 0;
        }

        //FullAutomatique

        if (Input.GetKeyDown(KeyCode.V))
        {
            FullAuto = !FullAuto;
        }

        if (FullAuto == true)
        {
            VitesseDeTir = 0.10F;
        }
        else
        {
            VitesseDeTir = 0.5F;
        }
    }

    //AfficheMoiCa

    void OnGUI()
    {
        GUI.Box(new Rect(10, 10, 130, 25), Chargeur+ "/" +Reserve);
    }
}
Edit: Pour + de clareté

Code : Tout sélectionner

void Update()
    {

        //Tirer

        if (Input.GetButton("Fire1") & Time.time > Cooldown)
            if (Chargeur >= 1)
            {

                GetComponent<AudioSource>().PlayOneShot(SonDuTir);
                Cooldown = Time.time + VitesseDeTir;
                Rigidbody Bullet;
                Bullet = Instantiate(Eject, transform.position, transform.rotation);
                Chargeur -= 1;
                Bullet.velocity = transform.TransformDirection(Vector3.left * Force);
            }
Dernière édition par Kizilom le 27 Avr 2017 16:55, édité 1 fois.

Kizilom
Messages : 17
Inscription : 20 Avr 2017 22:10

Re: [DB-AL] Tir réaliste

Message par Kizilom » 23 Avr 2017 20:59

Bonsoir,
Nayant pas eu de reponse je reviens vers vous en espérant avoir un peu plus cette fois ci.
C'est vrai que après pas mal de test je n'est toujours pas réussi à faire ce que j'aurai voulu.
Que vous ayez la réponse ou pas j'aimerai bien avoir des retours, savoir si ce que je demande est réalisable, Peu être que j'en demande trop, que je suis parti un peu trop loin, que ce code demande + de connaissance que je ne l'aurai penser.
Au depart pour moi cela ne devait être qu un petit code en ajoutant un addforce mais cela est peu être plus complexe ?

Merci pour vos reponses et celles que vous apportez aux autres.

Désolé si cela est un peu brouillon j'écris sur telephone presque à l'aveugle, je ne vois pas bien ce que jécris et la relecture est un peu compliqué.

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [DB-AL] Tir réaliste

Message par simonj » 23 Avr 2017 23:40

Salut,

Sur le composant Rigidbody, il y a une propriété "Drag" qui permet de définir une valeur de ralentissement de l'objet. Sur le site de Unity, c'est marqué que plus la valeur est élevée, plus l'objet va ralentir.

A tester mais si c'est un ralentissement trop net tu peux utiliser une Couroutine qui va continuellement augmenter la valeur du drag jusqu’à arriver à un point où le ralentissement seras tellement fort que la balle va se stopper.

PS : Tu peux aussi trouver des articles sur Wikipedia concernant ce phénomène si tu veux entrer dans des calculs un peu plus techniques. Mais je te le déconseille si tu n'es pas bon en math et/ou débrouillard car ça deviens vite prise de tête.

PS2 : Les infos viennent de Google en tapant "rigidbody resistance" et en prenant le 3eme lien qui se trouve ici.

Kizilom
Messages : 17
Inscription : 20 Avr 2017 22:10

Re: [DB-AL] Tir réaliste

Message par Kizilom » 25 Avr 2017 14:35

Bonjour merci pour ta reponse, je me souviens avoir déjà esseyer le drag mais il me semble qu'il me modifiait aussi la gravité ce qui me donnait quelque chose dhyper pas réaliste x) mais je vais voir, cela ce modifie peu être par un script.
Je vais me renseigner sur la coroutine voir ce qu'elle fait, j'ai vus aussi le raycast qui a l'air de réduire la vitesse d'un objet mais je ne sais pas si il modifié aussi la gravité de celui ci.
Merci encore pour ta réponse, en tout cas j'ai dus boulot je pense avoir peut être viser un peu trop haut pour un débutant lol
Devoir ce documenter sur des sites étranger ce trouve vachement demotivant en plus, quand on ne maitrise pas la langue.

Avatar de l’utilisateur
simonj
Messages : 293
Inscription : 29 Nov 2015 20:47
Localisation : Lyon

Re: [DB-AL] Tir réaliste

Message par simonj » 25 Avr 2017 22:05

Salut,

Je ne suis pas un expert pour tout ce qui est de la physic de Unity. Mais il ne me semble vraiment pas que le "Drag" change la gravité. C'est juste le frottement de l'air sur l'objet. Je peux me tromper mais j'ai quand même de sérieux doute.

De plus, il me semble très étrange que tu parles de Raycast pour faire ralentir la vitesse... D'où tiens-tu cette information ? Soit j'ai vraiment mal compris ce que tu cherches à faire, soit tu pars sur une mauvaise piste ;)

Concernant ton niveau et la difficulté de la chose, si tu trouves ça difficile alors oui tu t'es peut être trompé de niveau. Mais sache que c'est quand même la base de devoir fouiller et se renseigner pour pouvoir faire des choses sur Unity. Il y a énormément de ressources mais si tu ne possède pas la capacité ou que tu ne veux pas aller chercher sur le net, alors Unity n'est peut être pas fait pour toi...

C'est une logique à prendre et tu verras (Je ne sais pas quel âge tu as et quelles études tu fais) que c'est une bonne habitude à prendre de recherche et d'avoir la curiosité de se renseigner sur divers site.

Si vraiment Unity te semble hors de porté, tu peux tenter des moteurs plus simples d'utilisation comme Construct 2.

Kizilom
Messages : 17
Inscription : 20 Avr 2017 22:10

Re: [DB-AL] Tir réaliste

Message par Kizilom » 25 Avr 2017 23:14

Salut,
Je dois avouer que moi non plus je n'en suis pas sur à 100% j'ai un petit doute, mais il me semble que le drag change la gravité, et je suis sur de l'avoir déjà bidouillé donc si il ne modifiait que la vitesse je n'aurait jamais posé mon problême ici.

Pour le raycast je ne suis sur de rien, j'ai juste regardé une vidéo sur le site unity dont je n'est rien compris à la langue mais ou l'on pouvait remarqué un parachute amortissant la chute d'une caisse.
Apreste j'essaye de m'informer pendant mon temps libre donc des fois c'est fait un peu à l'arrache lol

Oui les recherches sont un peu compliqué pour ma part, pas que je n'aime pas donner de mon temps, quand je tombe sur de bonne vidéo expliquété en français c'est un plaisir d'apprendre sur unity et le c# et encore plus quand je vois que j'arrive à sortir du code par moi même.
Mais que lorsque je souhaite rentrer dans des trucs plus avancé c'est que de l'anglais, c'est un vrai frein pour moi, du coup je suis rendu à apprendre le c#(apres j'ai acquéri les grosses bases donc en ce moment je met en pause) unity et l'anglais lol.

Merci encore ;)

Ps j'en est 24 et je suis interimaire, bien entendu j'ai la curiosité d'apprendre comme j'ai dis c'est surtout là barrière de la langue qui me bloque sur pas mal de chose apres sinon je regarde énormement de vidéo fr et même étrangère, de langlais au chinois même si je ne comprend pas des fois j pique juste leur code.

Je me rappel plus des moteurs que tu m'a cité mais j'avaiq déjà fait le tour et unity est celui quI me convient le mieu au niveau de la recherche, les français y sont nettement plus présent.

Désolé davoir plus racontée ma vie que autre chose, a+ et merci


Avatar de l’utilisateur
Axel74
Messages : 100
Inscription : 23 Mai 2014 16:47
Localisation : Thonon - Lyon

Re: [DB-AL] Tir réaliste

Message par Axel74 » 26 Avr 2017 03:24

Hello !

Je n'ai pas lu tes script au détail mais voilà ce que tu devrais faire :

Avant d’instancier ta balle tu lances un rayon, à la position de ta caméra dans la direction transform.forward.
Maintenant si tu veux bosser avec un objet il va falloir lancer ta balle dans la direction du "hit" entre rayon / collider.
En premier c'est important que tu lances un rayon pour bosser en FPS car tu as ton arme qui est juste un dessous de ta caméra donc la position n'a rien à voir. Ensuite tu dois certainement avoir un "viseur" sur la caméra qui permet de tirer là où tu vises (centre de la caméra). Si tu ne fais pas ça, ta balle va partir de ton pistolet mais la balle n'ira jamais réellement taper dans la direction que tu visais.

En fonction de la distance également, la balle percutera un obstacle soit en dessous, soit à droite ou à gauche. Hors tu veux tirer là où tu vises avec ton écran, c'est de là que viendra le rayon. Donc lorsque ce rayon touche un obstacle, ta balle partira dans cette direction et non devant le canon.

Personnellement je ne modifierai pas le drag.
Pour faire au plus simple tu utilises Use gravity = true , essayes même de te renseigner sur la masse réelle du calibre. Le reste se fera tout seul mais dépendra de la puissance de tir de ton arme.

Si tu veux taper dans le réalisme après je pense que juste ajouter la bonne valeur de drag, la vitesse réelle, la masse réelle et tu seras proche de la réalité plus ou moins sans prendre en compte le recul de ton arme.
Aussi, n'applique pas une force continu sur ta balle mais une impulsion.

Je n'ai pas essayé le code mais voici une bonne approche :

Code : Tout sélectionner


// Script sur ta caméra qui permet de tirer

// Configure le layerLask sur 'everything' et tu décoches 'Ignore Raycast'
public Layermask layer;

// Pense à change le layer de ton joueur en 'Ignore Raycast', à moins que tu développes un multijoueur tu ne veux pas que le rayon touche ton joueur.

// Position de ta camera
Vector3 pos = transform.position;
// Dans la direction où ta balle partira en fonction de là où tu vises
Vector3 direction = Vector3.zero;

Raycast hit;
// On lance un rayon au centre de la caméra, devant la caméra
if (Physics.Raycast (pos, transform.forward, out hit, layer))
{
	// Si on touche un collider
	if (hit.collider)
	{
		// on récupère la position du 'hit' entre le rayon et le collider
		direction = hit.point - transform.position;
	}
}

...
// Reste de tes conditions pour tirer mais avec cette modification :

// Si le rayon touche un collider
if (direction != Vector.zero)
{
	// Instancier ta balle et la tirer dans la direction de 'direction'
} 
// Si le rayon ne touche pas de collider
else
{
	// Tirer la balle devant le canon dans la direction 'transform.forward'
}


Dernière édition par Axel74 le 26 Avr 2017 11:18, édité 2 fois.
Douille ou l'ail que pote étaux ? Yes I like.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: [DB-AL] Tir réaliste

Message par boubouk50 » 26 Avr 2017 09:34

Le drag ne change pas la gravité mais la résistance. C'est écrit dans la documentation:
Drag: How much air resistance affects the object when moving from forces. 0 means no air resistance, and infinity makes the object stop moving immediately.
Donc, ta balle prend plus de résistance à l'air et semble tomber plus vite car freinée. Un peu comme si tu tirais dans l'eau plutôt que dans l'air.
C'est pourtant pas compliqué d'aller chercher l'info plutôt que de faire des assomptions simplistes...
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Kizilom
Messages : 17
Inscription : 20 Avr 2017 22:10

Re: [DB-AL] Tir réaliste

Message par Kizilom » 26 Avr 2017 12:54

Bonjour et merci à tous, surtout à toi Axel74 tu m'as bien aidé, j'ai plus ou moin réussi ce que je voulais faire :)

A été dit : "C'est pourtant pas compliqué d'aller chercher l'info plutôt que de faire des assomptions simplistes..."
Désolé mais c'est en moi.

Répondre

Revenir vers « (C#) CSharp »