[RÉSOLU] [DB-AL] détecter l'objet le plus proche à partir d'un nom.

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
Avatar de l’utilisateur
Paullux
Messages : 68
Inscription : 12 Nov 2015 17:11
Contact :

[RÉSOLU] [DB-AL] détecter l'objet le plus proche à partir d'un nom.

Message par Paullux » 20 Jan 2018 20:56

Bonjour,

J'essaye de détecter l'objet le plus proche du joueur à partir de son nom.
Je n'y arrive pas, j'ai commencé à écrire un script :

Code : Tout sélectionner

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

public class NearedZombie : MonoBehaviour
{
    private float dist;
    private float mindist;
    public GameObject goodhumain;

    void start()
    {

    }

    void Update()
    {
        mindist = 1000f;
        if (gameObject!= null)
        {
            foreach (GameObject human in GameObject.FindObjectsOfType(typeof(GameObject)))
            {
                if (human.name == "CaucasianMale")
                {
                    dist = Vector3.Distance(human.position, gameObject.position);
                    if (dist < mindist)
                    {
                        mindist = dist;
                        goodhuman = human;
                    }
                }
            }
            if (Input.GetKey((KeyCode)PlayerPrefs.GetInt("follow")))
            {
                goodhuman.setFollowMe();
            }
        }
    }
}
J'ai 4 erreurs :

Assets/Scripts/NearedZombie.cs(26,51): error CS1061: Type `UnityEngine.GameObject' does not contain a definition for `position' and no extension method `position' of type `UnityEngine.GameObject' could be found. Are you missing an assembly reference?

Assets/Scripts/NearedZombie.cs(26,72): error CS1061: Type `UnityEngine.GameObject' does not contain a definition for `position' and no extension method `position' of type `UnityEngine.GameObject' could be found. Are you missing an assembly reference?

Assets/Scripts/NearedZombie.cs(30,25): error CS0103: The name `goodhuman' does not exist in the current context

Assets/Scripts/NearedZombie.cs(36,17): error CS0103: The name `goodhuman' does not exist in the current context

Je veux bien un peu d'aide...

De plus l'objet que j'essaye de détecter n'ai pas présent sur la scène au départ.
Dernière édition par Paullux le 21 Jan 2018 20:33, édité 1 fois.
J'ai créé un ensemble de jeux :

Un HUB : https://bit.ly/2J6EZTO
Un jeu avec contrôle tactile à l'écran : https://bit.ly/2J3IkTw
Un jeu en VR : https://bit.ly/2h5jdzk
Un jeu en AR : https://bit.ly/2LgMvIo

Il s'agit de FPS pour Android.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: C# détecter l'objet le plus proche à partir d'un nom.

Message par Max » 20 Jan 2018 22:16

Bonsoir,

Bon, par ou commencer...
Au delà du bien fondé de la méthode, déjà au niveau de ta boucle, essais de décomposer le code, c'est plus lisible et moins source d'erreur. Donc on écrira plutôt quelque chose comme:

Code : Tout sélectionner

GameObject[] humans = FindObjectsOfType(typeof(GameObject)) as GameObject[];
foreach (GameObject human in humans)
{ .... }
En suite, tu travailles sur des GameObject (human), mais tu cherches à accéder à une position. Il te faut passer par le transform du GameObject: human.transform.position
Enfin (pour n'en rester qu'aux erreurs affichées) l'une des erreurs est claire: error CS0103: The name `goodhuman' does not exist in the current context. En gros, goodhuman n'est jamais définis... vu que tu as définis goodhumain.
En suite, pourquoi cette ligne:

Code : Tout sélectionner

if (gameObject != null)
Ton script est sur un GameObject j'imagine, donc gameObject ne peut pas être null. Et comme pour human, si tu veux sa position, il faut passer par son Transform.

( Après sur le fond, récupérer et passer en revue tout les gameobjects pour un test dans ton update, c'est certainement pas l'approche la plus adéquate. )
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Avatar de l’utilisateur
Paullux
Messages : 68
Inscription : 12 Nov 2015 17:11
Contact :

Re: C# détecter l'objet le plus proche à partir d'un nom.

Message par Paullux » 20 Jan 2018 22:24

J'ai réécrit le script et ça donne ça :

Code : Tout sélectionner

public class NearedZombie : MonoBehaviour
{
    private float dist;
    private float mindist;
    public GameObject goodhuman;

    void start()
    {
        
    }

    void Update()
    {
        mindist = Mathf.Infinity;
        GameObject[] humans = FindObjectsOfType(typeof(GameObject)) as GameObject[];
        foreach (GameObject human in humans)
        {
            if (human.name == "CaucasianMale")
            {
                dist = Vector3.Distance(human.transform.position, transform.position);
                if (dist < mindist)
                {
                    mindist = dist;
                    goodhuman = human;
                }
            }
        }
        if (Input.GetKey((KeyCode)PlayerPrefs.GetInt("follow")))
        {
            if (goodhuman.activeSelf) goodhuman.GetComponent<setFollowMe>();
        }
    }
}
Maintenant je cherche à appeler la void "setFollowMe" du gameobject "human". et j'ai une erreur :

Assets/Scripts/NearedZombie.cs(35,62): error CS0246: The type or namespace name `setFollowMe' could not be found. Are you missing an assembly reference?

dans le gameobject human j'ai définit la "public void setFollowMe()" comment y accéder, la rendre static ?
J'ai créé un ensemble de jeux :

Un HUB : https://bit.ly/2J6EZTO
Un jeu avec contrôle tactile à l'écran : https://bit.ly/2J3IkTw
Un jeu en VR : https://bit.ly/2h5jdzk
Un jeu en AR : https://bit.ly/2LgMvIo

Il s'agit de FPS pour Android.

Avatar de l’utilisateur
Paullux
Messages : 68
Inscription : 12 Nov 2015 17:11
Contact :

Re: C# détecter l'objet le plus proche à partir d'un nom.

Message par Paullux » 20 Jan 2018 22:43

Après avoir réfléchis, voici le script corrigé :

Code : Tout sélectionner

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


public class NearedZombie : MonoBehaviour
{
    private float dist;
    private float mindist;
    private GameObject goodhuman;

    void start()
    {
        
    }

    void Update()
    {
        mindist = Mathf.Infinity;
        GameObject[] humans = FindObjectsOfType(typeof(GameObject)) as GameObject[];
        foreach (GameObject human in humans)
        {
            if (human.name == "CaucasianMale")
            {
                dist = Vector3.Distance(human.transform.position, transform.position);
                if (dist < mindist)
                {
                    mindist = dist;
                    goodhuman = human;
                }
            }
        }
        if (Input.GetKey((KeyCode)PlayerPrefs.GetInt("follow")))
        {
            if (goodhuman.activeSelf) goodhuman.GetComponent<MoveHuman>().setFollowMe();
        }
    }
}
faut que je dorme
J'ai créé un ensemble de jeux :

Un HUB : https://bit.ly/2J6EZTO
Un jeu avec contrôle tactile à l'écran : https://bit.ly/2J3IkTw
Un jeu en VR : https://bit.ly/2h5jdzk
Un jeu en AR : https://bit.ly/2LgMvIo

Il s'agit de FPS pour Android.

Avatar de l’utilisateur
Max
Messages : 8771
Inscription : 30 Juil 2011 13:57
Contact :

Re: C# détecter l'objet le plus proche à partir d'un nom.

Message par Max » 21 Jan 2018 11:55

Hello,
si techniquement tout est ok, pense à passer le sujet en Résolu.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

Répondre

Revenir vers « (C#) CSharp »