DB-AL Turret multitag

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
meTonne
Messages : 14
Inscription : 27 Fév 2017 16:29

DB-AL Turret multitag

Message par meTonne » 27 Fév 2017 16:35

Bonjour à tous,

Je viens vers vous car j'ai un petit soucis.
J'ai écrit un script pour des tourelles de défense. La tourelle tourne et se verrouille sur l'ennemi.
Mon problème est le suivant, j'ai plusieurs factions, chaque faction aillant son tag.
Du coup je souhaiterais pouvoir mettre plusieurs tags que la tourelle doit verrouiller.
J'ai testé quelques trucs mais rien ne se produit ... :/


Ci joint mon script :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Tower : MonoBehaviour {
    private Transform target;
    public float range = 15f;
    public string enemyTag = "Enemy";
    public Transform partToRotate;

    void Start()
    {
        InvokeRepeating("UpdateTarget", 0f, 0.5f);
    }
    void UpdateTarget ()
        {
        GameObject[] enemies = GameObject.FindGameObjectsWithTag(enemyTag);
        float shortestDistance = Mathf.Infinity;
        GameObject nearestEnemy = null;
        foreach (GameObject enemy in enemies)
        {
            float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
            if (distanceToEnemy < shortestDistance)
            {
                shortestDistance = distanceToEnemy;
                nearestEnemy = enemy;
            }
        }
        if (nearestEnemy != null && shortestDistance <= range)
        {
            target = nearestEnemy.transform;
        } else
        {
            target = null;
        }
    }
    void Update() { 
            if (target == null)
                return;
            
          Vector3 dir = target.position - transform.position;
          Quaternion lookRotation = Quaternion.LookRotation(dir);
          Vector3 rotation = lookRotation.eulerAngles;
          partToRotate.rotation = Quaternion.Euler (0f, rotation.y, 0f);
}
    void OnDrawGizmosSelectited ()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, range);
    }
}
Merci d'avance de vos réponses
meTonne

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

Re: DB-AL Turret multitag

Message par boubouk50 » 27 Fév 2017 16:52

Salut meTonne,

Alors plusieurs petits conseils:
Quand tu ne sais pas ce qui pêche, place des Debug.Log (MaSchaineDeCaracteres ou maVariable); dans les conditions de ton script, ça te permettra de suivre en console l'avancée de ton script, et les valeurs retournées.
Ici, il te faut tester le nombres d'ennemis trouvés, la distance minimale et la target. Tu sauras si ton updateTarget () fonctionne correctement et ce qui pêche.
"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

meTonne
Messages : 14
Inscription : 27 Fév 2017 16:29

Re: DB-AL Turret multitag

Message par meTonne » 27 Fév 2017 17:59

Salut Boubouk,

Actuellement l'ensemble du script fonctionne. La tourelle s'oriente correctement, elle verrouille bien les cibles et une fois que la cible est tuée la tourelle change de cible dès lors que les cibles ont le tag renseigné dans mon inspector.
Ce que j'aimerais c'est dans mon inspector avoir comme une liste ou j'inscris tout les tags qu'elle doit verrouiller.

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

Re: DB-AL Turret multitag

Message par boubouk50 » 27 Fév 2017 18:27

Oula, je sais pas comment j'ai mal lu ton premier post, il est clair pourtant.

Une dropDownList donc?
Je crois qu'Unity en a de base, mais j'avais vu passer une extension d'UI qui les intégrait, et apparemment mieux. Je ne retrouve pas...
Faut-il qu'elle se remplisse automatiquement ou bien les tags sont fixes?

Aussi, j'utilise des boutons dans un scrollview avec un vertical layout group. Pour gérer dynamiquement les boutons à afficher. Tu pourrais utiliser un prefab contenant un bouton radio et un text.

Tu peux jeter un œil à cette extension.
"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

meTonne
Messages : 14
Inscription : 27 Fév 2017 16:29

Re: DB-AL Turret multitag

Message par meTonne » 27 Fév 2017 20:22

Pas de soucis ^^

Une liste avec des tags fixes que je taperais à la mano pour chaque tourelle de faction.

J'ai pas vraiment besoin d'élément UI vue que le joueur n'interagira pas avec du coup je sais pas si ça me sera utile.

Avatar de l’utilisateur
VaultGuy
Messages : 16
Inscription : 23 Avr 2016 21:54

Re: DB-AL Turret multitag

Message par VaultGuy » 27 Fév 2017 23:41

Salut,

Tu peux stocker tous les tags que la tourelle doit attaquer dans un tableau, ou une liste si tu veux modifier durant la partie.

Code : Tout sélectionner

[SerializedField]
private String[] ennemyTags;
A placer au début de ton script (avec les autres attributs du script).

Et à la place de récupérer tous les objets avec le tag ennemy, tu récupères tous les objets à porter, et tu vérifies, en partant du plus proche qu'il contient le tag.

meTonne
Messages : 14
Inscription : 27 Fév 2017 16:29

Re: DB-AL Turret multitag

Message par meTonne » 28 Fév 2017 15:42

Bonjour,

J'ai juste à copier coller ou faut que j'ajoute quelques choses d'autres ?

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

Re: DB-AL Turret multitag

Message par boubouk50 » 28 Fév 2017 16:05

Ces 2 lignes te permettront de voir depuis l'Inspector un tableau de chaîne de caractères que tu devras remplir. Elles contiendront les tags à surveiller.
Ensuite dans ton code, au lieu de récupérer seulement les ennemis d'un seul tag, tu devras le faire pour tous les tags entrés dans ce tableau.
"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

meTonne
Messages : 14
Inscription : 27 Fév 2017 16:29

Re: DB-AL Turret multitag

Message par meTonne » 28 Fév 2017 16:27

Oui en effet ! J'ai ma liste dans mon inspector. Merci :D

Du coup j'ai un soucis avec la fonction : GameObject.FindGameObjectsWithTag
Apparemment elle est pas multi tag. Faut je trouve par quoi la remplacer.

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

Re: DB-AL Turret multitag

Message par boubouk50 » 28 Fév 2017 16:49

C'est bien la fonction à utiliser, mais il faut l'utiliser pour chaque tag. Tu ne peux pas le faire en une seule fois. Il va falloir boucler.

Code : Tout sélectionner

 include System.Collections.Generics; //a mettre tout en haut
...
void UpdateTarget ()
        {
        GameObject[] enemies = FindTaggedEnnemies ();
        float shortestDistance = Mathf.Infinity;
        GameObject nearestEnemy = null;
        foreach (GameObject enemy in enemies)
        {
            float distanceToEnemy = Vector3.Distance(transform.position, enemy.transform.position);
            if (distanceToEnemy < shortestDistance)
            {
                shortestDistance = distanceToEnemy;
                nearestEnemy = enemy;
            }
        }
        if (nearestEnemy != null && shortestDistance <= range)
        {
            target = nearestEnemy.transform;
        } else
        {
            target = null;
        }
    }
    
    //fonction de recherches des ennemis
    private GameObject[] FindTaggedEnnemies () {
    	List<GameObject> enemiesList = new List<GameObject>();
    	//Pour chaque tag dans le tableau de tag
    	foreach (string tag in ennemyTags) {
    		//Récupérer les ennemis et les mettre dans la liste
    		enemiesList.AddRange (GameObject.FindGameObjectsWithTag (tag));
    	}
    	//renvoyer le tableau
    	return enemiesList.ToArray();
    }
Je l'ai fait à main levée, il se peut qu'il contienne des erreurs.
"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

Répondre

Revenir vers « (C#) CSharp »