CONNEXION
  • RetourJeux
    • Tests
    • Soluces
    • Previews
    • Sorties
    • Hit Parade
    • Les + attendus
    • Tous les Jeux
  • RetourActu
    • Culture Geek
    • Astuces
    • Réalité Virtuelle
    • Rétrogaming
    • Toutes les actus
  • RetourHigh-Tech
    • Actus JVTECH
    • Bons plans
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTECH
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch
    • Xbox Series
    • Overwatch 2
    • FUT 23
    • League of Legends
    • Genshin Impact
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • PS4
  • One
  • Switch
  • Wii U
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Etoile Abonnement RSS

Sujet : J'aide les gens dans Unity

DébutPage précedente
«1  ... 170171172173174175176177178179180
Page suivanteFin
BrandNewFIavor BrandNewFIavor
MP
Niveau 6
04 août 2023 à 10:32:03

C'est le 3D URP que tu cherches j'imagine ? Il est pas simplement plus bas dans la liste ? Faut le télécharger avant de pouvoir l'utiliser

LaTonnelle LaTonnelle
MP
Niveau 8
05 août 2023 à 08:15:59

Le 04 août 2023 à 10:32:03 :
C'est le 3D URP que tu cherches j'imagine ? Il est pas simplement plus bas dans la liste ? Faut le télécharger avant de pouvoir l'utiliser

Oh ok, tu as tout à fait raison : j'étais tellement obnubilé par le titre exact donné dans le tuto que j'ai même pas eu la curiosité de regarder :ouch:

Bon, je vous avais prévenu : c'était une question d'énorme noob mais trop content de voir que tout va bien finalement. Merci pour les réponses !!

BrandNewFIavor BrandNewFIavor
MP
Niveau 6
05 août 2023 à 15:19:46

Le 05 août 2023 à 08:15:59 :

Le 04 août 2023 à 10:32:03 :
C'est le 3D URP que tu cherches j'imagine ? Il est pas simplement plus bas dans la liste ? Faut le télécharger avant de pouvoir l'utiliser

Oh ok, tu as tout à fait raison : j'étais tellement obnubilé par le titre exact donné dans le tuto que j'ai même pas eu la curiosité de regarder :ouch:

Bon, je vous avais prévenu : c'était une question d'énorme noob mais trop content de voir que tout va bien finalement. Merci pour les réponses !!

Pas de problème

Si jamais tu peux aussi installer l'urp en passant par le package manager. Sur un projet 3D classique.

-Oscar97 -Oscar97
MP
Niveau 57
11 août 2023 à 15:58:58

Salut, j'ai commencé à utiliser Unity juste hier.
Je sais déjà coder, donc je devrais comprendre les aides. :hap:

J'ai décidé de faire leur leçon pour faire un jeu en utilisant du code pour apprendre à utiliser les méthodes de Unity. La première partie explique comment créer un truc extrêmement simple où on contrôle un véhicule qui peut avancer, reculer, tourner à gauche et à droite : https://learn.unity.com/project/unit-1-driving-simulation?uv=2021.3&courseId=5cf96c41edbc2a2ca6e8810f
Je voulais modifier un peu le code pour avoir quelque chose d'un peu plus réaliste. J'ai déjà changé le code pour que le véhicule fasse une rotation dans le sens inverse quand on tourne en reculant.
Maintenant je voudrais que le véhicule puisse tourner et accélérer uniquement quand une roue touche quelque-chose. Chaque roue est un objet enfant du véhicule, et elles ont toutes un collider.
J'ai donc créé un script dont le but est de déterminer si l'objet est en contact avec autre chose. Le script contient une seule variable booléenne privée qui vaut false par défaut et qui passe à true au début d'une collision et pendant la collision et repasse à false à la fin d'une collision.
Si je mets le script sur le véhicule, ça fonctionne sans problème. Mais ça permet aussi au véhicule de tourner et d'accélérer en étant sur le toit, ce qui est pas mon but.
Si je mets le script sur chaque roue, la variable reste toujours sur la valeur à laquelle elle est initialisée. C'est comme s'il n'y avait pas de check pour voir si les roues étaient en collision avec quelque-chose, pourtant elles ont bien un collider chacune.

Voilà ce que j'ai comme script pour contrôler le véhicule :
https://image.noelshack.com/fichiers/2023/32/5/1691762145-code1.jpg
Et pour vérifier qu'une roue touche quelque-chose :
https://image.noelshack.com/fichiers/2023/32/5/1691762248-capture-d-ecran-2023-08-11-155652.png

J'avais commencé à coder quelque-chose pour vérifier que les roues sont en contact avec autre chose que le reste du véhicule mais c'est même pas ça le problème visiblement. Par contre je sais pas comment obtenir l'autre objet via un ContactPoint, la variable otherCollider est privée et a visiblement pas de méthode get. :(
Et je sais, c'est possible d'accélérer même en touchant pas le sol, mais c'est pas ça le problème.
Si quelqu'un peut m'expliquer pourquoi les collisions des roues sont pas prises en compte ça serait sympa. :hap:

Message édité le 11 août 2023 à 16:01:30 par -Oscar97
Ibadez38 Ibadez38
MP
Niveau 46
11 août 2023 à 17:06:53

1- Il est possible qu’au moment du runtime, les roues soient déjà en collision et que la méthode OnCollisionEnter ne soit pas appelée. Astuce : si tu ne veux pas changer ton flag, tu peux surélever légèrement la voiture pour qu’elle tombe au moment du runtime et qu’elle entre en collision avec la route.

2- Je suppose que l’autre élément qui entre en collision avec les roues est la route. Vérifie qu’elle ait un BoxCollider et que soit les roues, soit la route ait un Rigidbody. https://www.noelshack.com/2023-32-5-1691765709-capture-d-ecran-2023-05-22-124944.png
Pour le ContactPoint, je ne l’ai jamais utilisé donc je ne pourrais pas te dire.

Par contre, je viens de voir que tu fais des calculs qui peuvent être coûteux, comme la boucle dans la méthode Update. Si je peux te conseiller, il vaudrait mieux utiliser des événements. C’est parfait pour ce que tu veux faire.

-Oscar97 -Oscar97
MP
Niveau 57
11 août 2023 à 17:36:42

Le 11 août 2023 à 17:06:53 :
1- Il est possible qu’au moment du runtime, les roues soient déjà en collision et que la méthode OnCollisionEnter ne soit pas appelée. Astuce : si tu ne veux pas changer ton flag, tu peux surélever légèrement la voiture pour qu’elle tombe au moment du runtime et qu’elle entre en collision avec la route.

2- Je suppose que l’autre élément qui entre en collision avec les roues est la route. Vérifie qu’elle ait un BoxCollider et que soit les roues, soit la route ait un Rigidbody. https://www.noelshack.com/2023-32-5-1691765709-capture-d-ecran-2023-05-22-124944.png
Pour le ContactPoint, je ne l’ai jamais utilisé donc je ne pourrais pas te dire.

Par contre, je viens de voir que tu fais des calculs qui peuvent être coûteux, comme la boucle dans la méthode Update. Si je peux te conseiller, il vaudrait mieux utiliser des événements. C’est parfait pour ce que tu veux faire.

En fait c'était vraiment extrêmement con, j'avais pas mis de Rigidbody aux roues, et la route avait seulement un collider.
Maintenant j'ai un autre problème, les roues sont plus attachées au véhicule et elles peuvent se séparer. Je vais chercher pour voir comment corriger ça.

Je me suis pas encore intéressé aux événements, c'est un genre d'interface entre tous les objets c'est ça ? Je pourrais broadcast les collisions des roues aux autres scripts, ce qui me permettrait de faire la même chose sans la boucle for pour vérifier chaque roue à chaque frame ?

Message édité le 11 août 2023 à 17:40:04 par -Oscar97
Ibadez38 Ibadez38
MP
Niveau 46
11 août 2023 à 23:47:29

En fait, tu crée un event dans la class WeelCollision
public event Action OnCollision;

Ensuite
Toujours dans la classe WeelCollision
void OnCollisionEnter(Collision collision) { OnCollision?.Invoke(); }

Dans la classe PlayerController
// Tu t'abonnes
void OnEnable() { collision.OnCollision += MethodQuiSexecuteLorsDeLaCollisionDuneRoue } // Tu te désabonne void OnDisable() { collision.OnCollision -= MethodQuiSexecuteLorsDeLaCollisionDuneRoue } MethodQuiSexecuteLorsDeLaCollisionDuneRoue() { // DoSomething }

Dès qu'une roue rentre entre en collision elle envoie un "message" (invoke) à tous ceux qui sont abonné via le +=. Dès qu'ils reçoivent le message ils font ce qu'il y a dans la méthode MethodQuiSexecuteLorsDeLaCollisionDuneRoue

Pas besoin de passer chaque frame à vérifier si elles touchent ou pas.
Tu peux bien sûre passer des paramètres dans l'event si nécessaire.
Désolé pour la mis en page, JVC est un peu à la ramasse.

Message édité le 11 août 2023 à 23:50:04 par Ibadez38
Ibadez38 Ibadez38
MP
Niveau 46
12 août 2023 à 00:00:02

https://www.noelshack.com/2023-32-5-1691791175-capture-d-ecran-2023-05-22-124944.png https://www.noelshack.com/2023-32-5-1691791163-capture-d-ecran-2023-08-11-235855.png

C'est peut être plus lisible comme ca.

-Oscar97 -Oscar97
MP
Niveau 57
12 août 2023 à 15:18:40

Je vois, ça a l'air beaucoup plus simple et efficace de faire comme ça, effectivement.
Et oui, la mise en page code de JVC prend pas en compte les retours à la ligne, c'est très bizarre. :hap:

-Oscar97 -Oscar97
MP
Niveau 57
16 août 2023 à 19:56:23

Le 12 août 2023 à 00:00:02 :
https://www.noelshack.com/2023-32-5-1691791175-capture-d-ecran-2023-05-22-124944.png https://www.noelshack.com/2023-32-5-1691791163-capture-d-ecran-2023-08-11-235855.png

C'est peut être plus lisible comme ca.

Je viens seulement de tester, et ça fonctionne bien. Merci pour l'aide.
Si quelqu'un d'autre passe par là avec la même question, je voudrais juste rajouter que si l'objet existe dès le lancement il faut l'inscrire au broadcast dans la méthode Start() et pas dans une méthode OnEnable() qui est jamais appelée vu que l'objet est jamais créé.

Message édité le 16 août 2023 à 19:58:26 par -Oscar97
OOoooOOooOOOh OOoooOOooOOOh
MP
Niveau 4
17 août 2023 à 14:13:15

Est ce que quelqu'un s'y connait en compute shaders ?

J'essaye de faire une simulation de fluide en suivant ce tuto :
https://www.youtube.com/watch?v=9M72KrGhYuE&ab_channel=AJTech

On utilise des compute shader pour faire appel aux threads du GPU pour optimiser le bouzin (1 thread par particule)

Mais quand j'appelle InterlockedMin (qui sert à set un minimum à la valeur d'un buffer en parallèle entre tout les threads), mon unity crash.

Message d'erreur :

Failed to present D3D11 swapchain due to device reset/removed.

This error can happen if you draw or dispatch very expensive workloads to the GPU, wich can cause Windows to detect a GPU timeout and reset the device.

Le code que j'utilise :

[numthreads(16, 1, 1)]
void CalculateCellOffsets(uint3 id: SV_DISPATCHTHREADID) 
{
    uint particleIndex = _particleIndices[id.x];
    uint cellIndex = _particleCellIndices[particleIndex];

    InterlockedMin(_cellOffsets[cellIndex], id.x);
    //InterlockedMin(_cellOffsets[cellIndex], _cellOffsets[cellIndex]);
} 

Mon compute shader :

https://pastebin.com/J5d2ZuJ3

Le code qui utilise mon compute shader :

https://pastebin.com/Q7KXssba

C'est le même code que dans le tuto.

J'ai essayé de mettre moins de particules mais ça crash toujours.

ulgrude ulgrude
MP
Niveau 18
18 août 2023 à 12:27:36

:salut: voici le contexte de mon problème.

J'ai un Sprite Renderer (une planète) avec un CircleCollider2D.
J'ai d'autres Sprite Renderer (des sorts), ayant un Collider2D, qui entrent en contact avec.
Lors de la collision, je supprime le sort en question et j'instancie un Sprite Mask circulaire pour cacher une partie de la planète (afin de simuler un impact).

Même si les Sprite Mask cachent des parties de la planètes, le collider de la planète lui n'a pas bougé, donc j'indique aux sorts de ne rien faire si ils sont en collision avec un Sprite Mask.

Et donc on arrive à mon problème, si un sort est partiellement en collision avec un Sprite Mask et qu'il touche un bout de la planète pas masqué, il va rien faire jusqu'à ne plus être en collision avec des Sprite Mask.

Les possibles solutions que j'ai pas réussi à mener à bien :

  • Faire une fonction qui dit si un collider est partiellement ou complètement dans un Sprite Mask
  • Changer le CircleCollider2D de la planète par un PolygonCollider2D et, à chaque impact, le modifier en fonction du Sprite Mask qui vient d'être créé

Le code :
using UnityEngine; public class ColliderChecker : MonoBehaviour { public Transform spells; public Transform masks; public GameObject maskPrefab; void Update() { foreach (Collider2D spellCollider in spells.GetComponentsInChildren<Collider2D>()) { // si le missile est déjà en train de se détruire, on passe au suivant if (!spellCollider.GetComponent<MissileMovement>().enabled) { continue; } if (CheckCollisionWithLayer(spellCollider, LayerMask.NameToLayer("Planet"))) { if (CheckCollisionWithLayer(spellCollider, LayerMask.NameToLayer("Masks"))) { continue; } else { // on stop la course du missile spellCollider.GetComponent<MissileMovement>().enabled = false; // on déclenche l'animation de destruction Animator animator = spellCollider.GetComponent<Animator>(); if (animator != null && HasParameter("anim", animator)) { animator.SetTrigger("anim"); } float damage = spellCollider.GetComponent<DamageSpell>().GetDamage(); // on crée un mask au même endroit que la collision GameObject mask = Instantiate(maskPrefab, spellCollider.transform.position, Quaternion.identity, masks); mask.transform.localScale = new Vector3(0.2f * damage, 0.2f * damage, 0.2f * damage); } } } } bool CheckCollisionWithLayer(Collider2D collider, int layer) { ContactFilter2D newFilter = new ContactFilter2D(); newFilter.SetLayerMask(LayerMask.GetMask(LayerMask.LayerToName(layer))); return collider.OverlapCollider(newFilter, new Collider2D[1]) > 0; } bool HasParameter(string paramName, Animator animator) { foreach (AnimatorControllerParameter param in animator.parameters) { if (param.name == paramName) { return true; } } Debug.Log("false"); return false; } }

Voilà ce que ça donne visuellement :
https://cdn.discordapp.com/attachments/1128312777304453151/1141700668646772736/ezgif-2-38be060caf.gif

Vous en pensez quoi ? :p)

ThetaTauTau ThetaTauTau
MP
Niveau 8
18 août 2023 à 13:48:09

Faire une fonction qui dit si un collider est partiellement ou complètement dans un Sprite Mask

Ca ne fonctionera pas. Si tu appelle ta fonction à chaque frame, à la frame n ça va te dire qu'il n'y a pas de collision, et à la frame n+1, le projectile sera déjà trop loin. C'est le problème qu'on voit dans ta vidéo (tu désactive les collisions pendant une frame, et c'est suffisant pour que le projectile aille trop loin).

Changer le CircleCollider2D de la planète par un PolygonCollider2D et, à chaque impact, le modifier en fonction du Sprite Mask qui vient d'être créé

C'est probablement la solution la plus propre, mais assez compliquée à implémenter si tu ne trouves pas de truc tout fait sur l'assetstore.

Sinon il y a peut être moyen de faire un quelque chose de potable à base de RayCast ou CircleCast. Je pense que le truc c'est de faire le cast à l'envers (depuis la position que le projectile aurait à la frame suivante vers sa position actuelle) et de regarder s'il y a un hit avec le layer des masques.
https://www.noelshack.com/2023-33-5-1692359280-jvc.png

ulgrude ulgrude
MP
Niveau 18
19 août 2023 à 07:35:42

Le 18 août 2023 à 13:48:09 :

Faire une fonction qui dit si un collider est partiellement ou complètement dans un Sprite Mask

Ca ne fonctionera pas. Si tu appelle ta fonction à chaque frame, à la frame n ça va te dire qu'il n'y a pas de collision, et à la frame n+1, le projectile sera déjà trop loin. C'est le problème qu'on voit dans ta vidéo (tu désactive les collisions pendant une frame, et c'est suffisant pour que le projectile aille trop loin).

Changer le CircleCollider2D de la planète par un PolygonCollider2D et, à chaque impact, le modifier en fonction du Sprite Mask qui vient d'être créé

C'est probablement la solution la plus propre, mais assez compliquée à implémenter si tu ne trouves pas de truc tout fait sur l'assetstore.

Sinon il y a peut être moyen de faire un quelque chose de potable à base de RayCast ou CircleCast. Je pense que le truc c'est de faire le cast à l'envers (depuis la position que le projectile aurait à la frame suivante vers sa position actuelle) et de regarder s'il y a un hit avec le layer des masques.
https://www.noelshack.com/2023-33-5-1692359280-jvc.png

:merci: j’avais jamais utilisé les RayCast, c’est plutôt simple et adapté à mon problème !

J’ai pas eu le temps de finaliser le script mais je suis sur la bonne voie je pense. :oui:

Et au pire des cas, j’aurai appris quelque chose !

-Oscar97 -Oscar97
MP
Niveau 57
31 août 2023 à 01:32:49

Salut, c'est encore moi. Je voulais savoir comment faire pour qu'un Raycast ignore une collision avec un objet en particulier.
J'ai un pavé avec un Rigidbody dont le but est de flotter un peu au dessus du sol. Pour faire ça j'ai quatre objets vides qui servent de point de départ pour quatre Raycasts vers le bas, à une certaine distance max. Lorsque le Raycast touche quelque-chose (en l'occurrence un plan en dessous), une force est appliquée à cet endroit là pour pousser le pavé vers le haut.

Mais en affichant le nom de l'objet touché par le Raycast dans les logs je me rends compte qu'il y a souvent une collision avec le pavé plutôt qu'avec le plan (en fait une frame sur deux tous les Raycasts touchent le pavé plutôt que le plan), ce que je trouve déjà bizarre parce-que les Raycasts partent tous d'une position en dehors du pavé et qu'ils vont vers le bas (relatif au pavé), donc a priori ils devraient jamais pouvoir le toucher. Du coup je voulais désactiver les collisions entre ces Raycasts et le pavé.
Je sais qu'il y a un layer Ignore Raycast mais je voudrais seulement que le pavé ignore ce Raycast là, pas forcément tous les Raycasts. :(
J'ai vu qu'il y a une fonction RaycastAll() qui renvoie un array de toutes les collisions et que je peux ensuite itérer sur cet array pour obtenir uniquement la collision qui m'intéresse, mais est-ce que c'est le plus efficace ?

Message édité le 31 août 2023 à 01:37:19 par -Oscar97
ThetaTauTau ThetaTauTau
MP
Niveau 8
31 août 2023 à 13:53:48

Tous les casts ont un argument "layerMask" qui permet de spécifier les layers sur lesquels détecter les collisions.

"RaycastAll" c'est beaucoup moins performant, c'est à utiliser uniquement quand on veut que le rayon affecte plusieurs objets (par exemple un laser qui traverse les objets et leur inflige tous des dégâts)

-Oscar97 -Oscar97
MP
Niveau 57
31 août 2023 à 14:51:57

Le 31 août 2023 à 13:53:48 :
Tous les casts ont un argument "layerMask" qui permet de spécifier les layers sur lesquels détecter les collisions.

"RaycastAll" c'est beaucoup moins performant, c'est à utiliser uniquement quand on veut que le rayon affecte plusieurs objets (par exemple un laser qui traverse les objets et leur inflige tous des dégâts)

Ah, effectivement. Ça m'apprendra à pas vraiment lire la documentation en profondeur. :hap:
Mais par exemple si je veux avoir plusieurs pavés qui flottent au dessus du sol avec le même script, mais que je veux que les pavés puissent flotter au dessus d'un autre pavé, il faudrait un layer différent pour chaque pavé et c'est pas très pratique vu qu'il y a un nombre limité de layers disponibles. Il y a pas un moyen d'ignorer un objet spécifiquement sans passer par RaycastAll ? :(

-Oscar97 -Oscar97
MP
Niveau 57
31 août 2023 à 16:54:45

Bon en fait j'ai trouvé une solution à mon problème, c'était vraiment très con. :hap:
Par contre je voudrais quand même savoir s'il y a une alternative pour que le Raycast ignore un objet en particulier sans qu'il soit dans un layer à part, ça peut toujours être utile.

ThetaTauTau ThetaTauTau
MP
Niveau 8
31 août 2023 à 17:41:01

Notes: Raycasts will not detect Colliders for which the Raycast origin is inside the Collider.

Donc normalement pour l'exemple que tu donnes ça devrait marcher.

Sinon tu peux désactiver le collider ou changer le layer avant de faire le raycast, et les remettre juste après.

BrandNewFlavor BrandNewFlavor
MP
Niveau 9
31 août 2023 à 18:34:19

Le 31 août 2023 à 16:54:45 :
Bon en fait j'ai trouvé une solution à mon problème, c'était vraiment très con. :hap:
Par contre je voudrais quand même savoir s'il y a une alternative pour que le Raycast ignore un objet en particulier sans qu'il soit dans un layer à part, ça peut toujours être utile.

Tu peux toujours faire des conditions après avoir effectué ton raycast, dans le if correspondant. Suffit de checkez si c'est l'objet à ignorer, si c'est le cas ne rien faire, sinon tu executes ton code

J'utilise TryGetComponent pour ça en général

par exemple

Message édité le 31 août 2023 à 18:35:30 par BrandNewFlavor
DébutPage précedente
Page suivanteFin
Répondre
Prévisu
?
Victime de harcèlement en ligne : comment réagir ?
La vidéo du moment