[DB-AL] [resolu] Instantier un gameobject et utiliser un script contenu dans celui-ci

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
Kobal
Messages : 7
Inscription : 12 Mars 2019 11:15

[DB-AL] [resolu] Instantier un gameobject et utiliser un script contenu dans celui-ci

Message par Kobal » 22 Mars 2019 04:08

Bonsoir !

Dans mon code j'essaie d'instancier puis de déplacer des gameobject en faisant appel à un script à l'intérieur de ces gameobject.

J'ai un premier gameobject vide dont le script "CreateCells" contient l'instanciation de plusieurs prefab :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CreateCells : MonoBehaviour {
 
    public GameObject Cell;
    GameObject CellClone;
    Vector3 pos;
    // Use this for initialization
    void Start () {
 
        for (int i = 0; i < 5; i++) {
            CellClone = Instantiate (Cell) as GameObject;
            pos.x = -5;
            pos.y = 0;
            pos.z = 0;
            CellClone.transform.position = pos;
            pos.x = -5+2*i;
            pos.y = 5;
            pos.z = 0;
            Debug.Log ("X :" + pos.x + " Y :" + pos.y + " Z :" + pos.z);
            CellClone.GetComponent<MoveCell> ().MoveC (pos);
        }
       
    }
   
    // Update is called once per frame
    void Update () {
       
    }
}
Il me crée donc 5 gameobject "Cell" puis fait appel au script "MoveCell" et plus particulièrement à la fonction MoveC contenue dans chacun d'eux afin de les déplacer :

Code : Tout sélectionner

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
     
    public class MoveCell : MonoBehaviour {
     
        public Vector3 target;
        float speed;
        float step;
     
        // Use this for initialization
        void Start () {
            target = new Vector3 ();
            target = this.gameObject.transform.position;
            speed = 100f;
     
        }
     
        public void MoveC (Vector3 move)
        {
            target = move;
        }
       
        // Update is called once per frame
        void Update () {
     
            if (target != this.gameObject.transform.position ){
            step = speed * Time.deltaTime;
                this.gameObject.transform.position = Vector3.MoveTowards (this.gameObject.transform.position, target, step);
                }
           
        }
    }

Malheureusement ce "MoveCell" n'est jamais exécuté et je ne comprend pas du tout pourquoi.
Si vous aviez une idée de ce qu'il se passe et de comment contourner le problème j'en serais ravi :)

Cordialement,
Kobal
Dernière édition par Kobal le 24 Mars 2019 16:18, édité 1 fois.

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

Re: [DB-AL] Instantier un gameobject et utiliser un script contenu dans celui-ci

Message par Max » 22 Mars 2019 09:09

Bonjour,
Kobal a écrit :
22 Mars 2019 04:08
Malheureusement ce "MoveCell" n'est jamais exécuté et je ne comprend pas du tout pourquoi.
Si, tu dois bien entrer dans MoveCell, seulement dans chaque nouveau prefab instancié, n'oublie pas que Start() va être exécuté, et donc tu auras un target = transform.position;, ce qui fait que ta condition dans l'update() if (target != transform.position) renverra toujours false.
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

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: [DB-AL] Instantier un gameobject et utiliser un script contenu dans celui-ci

Message par Moi 1971 » 22 Mars 2019 10:55

Bonjour,
normalement

Code : Tout sélectionner

public void MoveC (Vector3 move)
        {
            target = move;
        }
devrait changer les coordonnées de target, donc dans l'update le if devrait renvoyer true.

Pour vérifier ce qu'il en est, il faut mettre des debug, du genre :

Code : Tout sélectionner

 void Update () {
     Debug.Log ("target => X :" + target.x + " Y :" + target.y + " Z :" + target.z);
     Debug.Log ("this.gameObject.transform.position => X :" + this.gameObject.transform.position.x + " Y :" + this.gameObject.transform.position.y + " Z :" + this.gameObject.transform.position.z);
            if (target != this.gameObject.transform.position ){
            step = speed * Time.deltaTime;
                this.gameObject.transform.position = Vector3.MoveTowards (this.gameObject.transform.position, target, step);
                }
           
        }

Kobal
Messages : 7
Inscription : 12 Mars 2019 11:15

Re: [DB-AL] Instantier un gameobject et utiliser un script contenu dans celui-ci

Message par Kobal » 24 Mars 2019 16:18

Bonjour et merci de vos réponses !

Effectivement si j'enlève la définition "target = this.transform.position" du Start() cela fonctionne !

Cordialement,
Kobal

Répondre

Revenir vers « (C#) CSharp »