Salut Mediateur of game, je voualis savoir si c'était possible que tu me contact sur skype pour discuter du projet terminé.
Sur ce, merci encore à toi et sans doute à bientôt !
Bonjour/Bonsoir,
J'aimerais que vous m'aidiez à résoudre un problème que j'ai depuis pas mal de temps, voici la situation:
Nous somme en multijoueur, il y a 2 joueurs sur le terrain, l'un possède le tag de l’équipe 1, l'autre le tag de l’équipe 2.
Quand notre joueur 1 appui sur le clique gauche, un GameObject est Instancier dans le réseau. Ce GameObject (appelons là la balle), part dans une direction, et va détecter une collision.
Quand notre balle va toucher le joueur 2 (le tag de l’équipe 2), il va envoyer un message au GameObject touché (le joueur 2) qui va appeler sa fonction et lui faire perdre de la vie.
Seulement voilà, j'ai l'impression que la balle ne détecte pas le tag du joueur 2 et agis comme si c’était un mur normal.
De plus, si la balle doit détecter le même tag que celui du joueur "tireur" (par exemple le joueur 1 peut infliger des dégâts au joueur 1), alors tout fonctionne correctement et le joueur perd de la vie.
Voilà, si quelqu'un a la moindre idée de comment résoudre le problème je suis preneur, dites mois si vous voulez que je poste des scripts.
En tout cas merci d'avoir lu, bonne journée/soirée.
@Underty :
Je suis malheureusement reparti en déplacement dès Vendredi dernier.
Je serai dispo des Mercredi.
@MOTROK :
L'idéal pour comprendre ton anomalie est effectivement de fournir l'extrait de code de la gestion du tir.
A bientôt.
Voici le script de la balle:
http://pastebin.com/fAkk9db2
Voici la partie du script de joueur qui nous intéresse:
http://pastebin.com/Dv595xyF
Re,
Sur ton script de la balle il semble y avoir un petit problème.
"if(collider.transform.tag == tag2)"
Ton test ne me semble pas bon...
collider.transform.tag ne te renvoie pas le tag de ton GameObject. De mémoire et a vérifier il faut faire :
"if(collider.gameobject.tag == tag2)"
Je travaille rarement en Javascript , regarde et vérifie la syntaxe.
Fo être de même sur que le string tag2 corresponde à la bonne chaine de test désirée. Fait un debug.log pour vérifier.
Voila pour ma première lecture du premier script.
Je n'ai pas trop de temps la pour regarder l'autre script, je ferais cela tout à l'heure.
Tient nous au courant (basse tension STP).
A bientôt.
Pour le premier cas,
"if(collider.gameobject.tag == tag2)"
cela n'a pas réellement l'air de changer grand-chose.
Par contre, et là c'est beaucoup plus intéressant et je me sens un peu bête de n'y avoir pas pensé avant, c'est de faire un debug.log de tag2 de la balle.
Pour le premier joueur (celui qui joue directement via l’éditeur de Unity), pas de souci, la balle possède bien la tag de l’équipe adverse.
Mais pour le deuxième joueur, la variable est vide, le debug.log ne m'affiche aucun caractère.
Pourtant, quand je debug.log ceci dans le script qui va donner la valeur de tag2:
http://pastebin.com/6HXLqVMp (debug.log dans la fonction Awake)
La variable tagg qui va donner la valeur à tag2 est bien le tag de l’équipe adverse.
Je vais sans doute envoyer un message au script de la balle qui va appeler une fonction qui va ensuite modifier la valeur de tag2, plutôt que de la changer directement comme vous pouvez le voir dans le script que j'ai posté ci-dessus.
Si vous avez des idées n'hésiter pas,
et je vous tien au courant (en basse tension).
Ouille, ouille...
Je réitère (suis pas sur du french là).
Dans ton cas...
Un if (collider.gameobject.tag == "toto") te signalera une collision avec un des gameobject de ta scène possédant le tag "toto".
De même, un if (collider.gameobject.name == "toto") te signalera une collision avec un des gameobject de ta scène possédant le name "toto".
Peut importe la méthode en fait (quoi que). La première chose à faire dans ton cas c'est d'utiliser la bonne et de valider cette entrée dans le "IF" soit par un debug.xx soit par un point d'arrêt à l'execution (Là sur c'est une autre histoire hein).
Au pire ou au mieux, si tu as pas peur que te vole ton super code, ben MP, tu balance projet, je debugue, et hop.
Suis pas super calé en JVscript, au pire siflerai Adrien si j'ai doute.
A toi de voir maintenant.
A bientôt.
Hello MOTROK,
je viens de lire http://pastebin.com/6HXLqVMp
Je pense avoir compris ton problème par rapport non pas à votre code, mais à votre approche entre moteur 3D et moteur physique.
C'est juste une compréhension facteur temps entres les deux...
Par rapport à mon analyse cela risque de remettre en cause pas mal du GamePlay employé dans le code (ou inversement).
Je manque de temps ce soir pour développer. Je te ferais cela en MP ou ici (ce qui est plus profitable à d'autres).
A bientôt.
Voila mon code pour faire courir et accroupir mon personnage :
var walkSpeed: float = 2;
var crchSpeed: float = 1;
var runSpeed: float = 6.5;
private var chMotor: CharacterMotor;
private var tr: Transform;
private var dist: float;
var vScale = 1;
var speed = walkSpeed;
var crouched : boolean = false;
var running : boolean = false;
function Start(){
chMotor = GetComponent(CharacterMotor);
tr = transform;
var ch:CharacterController = GetComponent(CharacterController);
dist = ch.height/2;d
}
function Update(){
if (chMotor.grounded && Input.GetKeyDown("left shift") && !running){
speed = runSpeed;
running = true;
}
else if (chMotor.grounded && Input.GetKeyDown("left shift") && running){
speed = walkSpeed;
running = false;
}
if (Input.GetKeyDown("left ctrl") && !crouched){
vScale = 0.5;
speed = crchSpeed;
crouched = true;
}
else if (Input.GetKeyDown("left ctrl") && crouched){
vScale = 1;
speed = walkSpeed;
crouched = false;
}
chMotor.movement.maxForwardSpeed = speed;
chMotor.movement.maxSidewaysSpeed = speed;
chMotor.movement.maxBackwardsSpeed = speed;
var ultScale = tr.localScale.y;
tr.localScale.y = Mathf.Lerp(tr.localScale.y, vScale, 5*Time.deltaTime);
tr.position.y += dist * (tr.localScale.y-ultScale);
}
Le problème c'est que quand je clique sur ctrl le personnage traverse le sol et au lieu que vScale = 0.5; et bah il égale 0
Comment faire ?
Bjour,
Sans être un Pro du Javascript...
Au lieu de :
var vScale = 1;
Faire
var vScale : float = 1;
Par défaut sans donner le type à ta variable vScale elle sera de type int, donc si tu fait vScale = 0.5 le compilateur (ou l’interpréteur) lui affectera juste la partie entière soit 0 !!!
Soit conscient que quant tu code, le fait de supprimer la directive de compilation #pragma strict , permet au compilateur de ne pas t'avertir de ce type d'erreur.
DONC...
Toujours #pragma strict....
Au mieux, fait l'effort d'apprendre et de coder en C#. C'est la un super conseil que te donne.
Bonne continuation.
@MediateurOfGame :
En lisant ton message je n'ai pas très bien compris ce que tu tentais de m'expliquer, si tu souhaites développer je pense aussi qu'il faudrait le faire ici pour effectivement faire profiter d'autre personne.
En tout cas merci de prendre du temps pour mon problème.
MediateurOfGame merci ça marche du tonnerre
Pour ce qui est du c#, a chaque fois je l'utilise je prend 10 fois plus de temps pour faire marcher le script qu'avec du javascript, je suis pas a l'aise avec ce langage
T'aurais pas des tutos pour apprendre du c# sur unity en douceur ?
@MOTROK :
A la relecture de ton code j'ai remarqué une chose..
Dans la function Shoot tu affecte la chaine de caractère tagg à la variable tag2 de ton script de bullet.
go.GetComponent("bullet").tag2 = tagg;
Dans le traitement de la collision tu fait un test du tag du transform ???
if(collider.transform.tag == tag2)
A mon avis tu devrais écrire:
if(collider.gameObject.GetComponent("bullet").tag2
== tag2)
En ce qui concerne l'autre problème que je souhaitais soulever et qu'il faut se méfier dans le cas de détection de collision d'un objet possédant une certaine vélocité (vitesse).
Le moteur physique d'unity effectue ses calculs et détections toutes les 1/15eme de secondes (de mémoire).
Imaginons le cas suivant :
A un instant T0 on créer un objet bullet et on lui applique une force lui donnant une vitesse de 100 mètre / seconde vers un obstacle qui est positionné à 10 mètre et qui représente un cube de 1x1x1 mètre.
Quand le moteur physique va tester la collision le projectile aura donc parcouru 1/15 * 100 soit 6.66 mètres.
Ainsi :
T0 = 0 mètres
T1 = 6.66 mètres
T2 = 13.32 mètres
On voit bien la qu'aucune détection de collision n'est possible !!! Le test de la collision ne se fait pas dans la plage 9,5 , 10.5 mètres.
Ainsi en fonction de la vitesse des objets et de leur taille il peut arriver de rater certaines collisions.
A méditer hein .
A bientôt.
@GarryMod :
Si tu ne te sent pas du tout à l'aise avec le C# et que tu arrive à un résultat avec le Javascript, reste sur le Jvs.
Après tout quand l'on créer un jeu amateur, c'est pour son aspect ludique (fo donc pas trop se prendre la tête).
Par contre si tu programme dans un langage quel qu'il soit il est bon de réfléchir avant toute écriture à l'algo à mettre en place.
Par exemple dans ton cas dans le Update tu fait :
if (chMotor.grounded && Input.GetKeyDown("left shift") && !running){
speed = runSpeed;
running = true;
}
else if (chMotor.grounded && Input.GetKeyDown("left shift") && running){
speed = walkSpeed;
running = false;
}
Donc la tu execute un premier test si objet sur sol et si touche pressée et objet se déplace.
Si ce n'est pas le cas tu reteste si objet sur sol et si touche pressée et objet est a l'arrêt.
Tu teste donc deux fois la même condition !!!
Alors qu'en fait il te suffirai de tester une fois le groupe de conditions commune (objet sol et key) et ensuite effectuer un traitement en fonction de l'état de l'objet.
A titre d'exemple voici le même fonctionnement tel que je l'aurai écrit.
if (chMotor.grounded && Input.GetKeyDown("left shift"))
{
____if (!running)
________speed = runSpeed;
____else
________speed = walkSpeed;
____running = !running;
}
Tu remarque là que le code est plus lisible et plus clair.
Il est forcément plus rapide.
Il est de maintenance plus aisée.
Et puis les programmeurs sont des feignants, moins on écrit de lignes, mieux on se porte .
Mon conseil, si je puis me permettre.
Reste donc sur le Jvs.
Applique toujours la directive #pragma strict.
Optimise aux max ton code par rapport à tes algos.
Et surtout fait nous un bon jeu.
A bientôt.
@MediateurOfGame :
Pour le "if(collider.transform.tag == tag2)",
en fait je veux vérifier le tag du GameObject toucher par la balle, d'ailleurs j'ai désormais changé:
if(collider.transform.tag == tag2)
par
if(collider.gameObject.tag == tag2)
Ensuite, je pense avoir bien compris cette histoire de collision, connaîtrais-tu une solution alternative pour un projectile à grand vitesse? Ou suis-je contraint d’utiliser un raycast?
En tout cas merci d'avoir expliqué ça, pour revenir au problème que tag2 reste vide, le:
go.GetComponent("bullet").tag2 = tagg;
n'a pas l'air de changer tag2.
Je vais essayer dès ce soir d'utiliser un SendMessage, et peut-être connais-tu d'autre moyen? À moins que je ne les utilise mal?
MediateurOfGame Merci des conseils, c'est vrai que c'est plus lisible du coup
Bjour,
Alias "MediateurOfGame", mon pseudo ayant été kické, je continu donc mon possible support sur ce new Nick .
@Emmentis:
J'utilise parfois Ngui.
Quel est ton problème ?
@MOTROK :
Dès que possible je simule de mon coté ton problème de Bullet et te tient au courant dès que résultat positif.
A bientôt.
Salut,
En gros, je viens de faire un model de boite (avec une texture faite par moi et ajoutée grâce à l'UV mapping) à mettre sur Unity depuis blender, mais cette fameuse texture ne s'affiche pas!
Je ne sais pas si je dois convertir mon model en quelque chose d'autre pour que mon model et ma texture soient vus par unity, et c'est à ce moment là que vous entrez en scène
Faut faire une manip' spéciale?
t'as pas de texture du tout ou juste une couleur uniforme qui s'affiche? T'as parametré la texture dans le material, dans unity?