Erreur lors du Build

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Ch.heni
Messages : 16
Inscription : 14 Juin 2024 12:14

Erreur lors du Build

Message par Ch.heni » 23 Sep 2024 10:32

Bonjour à tous,

Je suis sur un projet où j'utilise le package "UnityEditor.Scripting.Python".
Tous fonctionne très bien dans unity :-D
Quant au Build, impossible de le faire :shock:
On m'affiche les messages d'erreurs:

"Assets\_Scripts\GetPositionUnity.cs(7,19): error CS0234: The type or namespace name 'Scripting' does not exist in the namespace 'UnityEditor' (are you missing an assembly reference?)"

Assets\_Scripts\GetPositionUnity.cs(21,6): error CS0246: The type or namespace name 'MenuItemAttribute' could not be found (are you missing a using directive or an assembly reference?)

"Assets\_Scripts\GetPositionUnity.cs(21,6): error CS0246: The type or namespace name 'MenuItem' could not be found (are you missing a using directive or an assembly reference?)"

J'ai vu qu'une des solutions qui existent, c'est de mettre le script dans un dossier "Editor" :idea: . Sauf qu'apparemment les scripts contenus dans ce dossier ne peuvent pas être affectés à des gameObjects dans la scène :/
Quelqu'un pourrait me venir en aide s'il vous plait, :triste1:

Code : Tout sélectionner

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using TMPro;
using UnityEditor;
using UnityEditor.Scripting.Python;
using UnityEngine;

public class GetPositionUnity : MonoBehaviour
{
    private string msg;
 
    public TextMeshProUGUI mainText;
  

    [MenuItem("Python Scripts/GetPosition")]
   public static IEnumerator GetPositionFromPython()
   {
	//GetPosition.py fait appel à la methode ExtractPosition de cette classe
        PythonRunner.RunFile("Assets/_Scripts/GetPosition.py");
        yield return new WaitForSeconds(0.1f);
    }


    void Update()
    {
        StartCoroutine(GetPositionFromPython());
    }

    public void ExtractPosition(string msg)
    {   
        //Affichage des coordonnées dans la console
        Debug.Log(msg);
        //Modification du texte affiché dans la fenêtre
        mainText.text = msg;

    }
    }
CS0234.png
CS0234.png (156.01 Kio) Consulté 614 fois

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

Re: Erreur lors du Build

Message par boubouk50 » 23 Sep 2024 11:17

Comme le nom l'indique, les namespaces UnityEditor ne fonctionnent QUE dans l'éditeur d'Unity, pas en compilation.
Il te faut donc utiliser un namespace qui dépend d'UnityEngine ou un autre.
"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

Ch.heni
Messages : 16
Inscription : 14 Juin 2024 12:14

Re: Erreur lors du Build

Message par Ch.heni » 23 Sep 2024 14:32

Merci beaucoup de votre réponse.
Je ne vois pas du tout comment faire appel au script édité en python sans passer par "PythonRunner.RunFile" qui est dans UnityEditor. Du coup j'ai créé un name Space que j'ai appelé PythonInteraction ou j'ai inclus tous ce qui dépond de UnityEditor. puis dans mon script principal j'appelle la fonction de cette manière : PythonCaller.CallPythonMethod();
Je voulais le mettre dans le dossier Editor mais ça ne fonctionne pas.
Message d'erreur "The type or namespace name 'PythonInteraction' could not be found (are you missing a using directive or an assembly reference?"


Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Scripting.Python;


namespace PythonInteraction
{
    public class PythonCaller : MonoBehaviour
    {
        [MenuItem("Python Scripts/GetPosition")]
        public static void CallPythonMethod()
        {
            PythonRunner.RunFile("Assets/_Scripts/GetPosition.py");
        }
    }
}


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

Re: Erreur lors du Build

Message par boubouk50 » 23 Sep 2024 17:54

Quoi que tu fasses, tu ne peux pas utiliser quelque chose qui dépend d'UnityEditor. Ce namespace n'est pas inclus dans les compilations. Donc, tu auras beau trafiquer tout ce que tu veux, la source de tes fonctions ne sera jamais accessible en build.
Il te faut donc trouver un asset, une API, un plugin qui permette la compilation de code Python au runtime.
"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

Ch.heni
Messages : 16
Inscription : 14 Juin 2024 12:14

Re: Erreur lors du Build

Message par Ch.heni » 26 Sep 2024 08:09

Merci beaucoup du temps que tu prends pour me répondre et m'aider à trouver une solution.
j'ai vu que tu essaye d'aider tout le monde sur ce forum. C'est bien louable :ange: !!

J'ai fais des recherche sur google et j'ai vu une potentielle solution dans le lien ci-dessous.
ça ne m'a pas l'air simple mais je vais l'essayer et te tenir au courant.

ça se fait en 7 étapes:
- Copier le contenu du paquet " com.unity.scripting.python " dans le projet.
- Modifier les paramètres du plugin,
- Déplacer les scripts de Editor à Runtime
- Créer un .asmdef approprié,
- Définir les paramètres de votre Player pour utiliser Mono au lieu de il2cpp.
- Mettre les binaires Python (dans le paquet .) dans StreamingAssets pour qu'ils soient inclus dans le build
- Modifier PythonRunner.cs pour les trouver.

https://discussions.unity.com/t/python- ... y/796460/9

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

Re: Erreur lors du Build

Message par boubouk50 » 26 Sep 2024 09:12

Eh bien bon courage :geek: (tout ce qui s'éloigne d'Unity, je deviens novice)

Peut-être une autre approche possible :
Modifier ton programme python pour envoyer des messages (UDP ou autre) à ton application Unity. Ainsi, tu décorrèles les deux programmes.
Concernant la partie Unity :

Code : Tout sélectionner

public static IEnumerator GetPositionFromPython()
   {
	//GetPosition.py fait appel à la methode ExtractPosition de cette classe
        PythonRunner.RunFile("Assets/_Scripts/GetPosition.py");
        yield return new WaitForSeconds(0.1f);
    }

    void Update()
    {
        StartCoroutine(GetPositionFromPython());
    }
Ça, c'est pas top. La coroutine a pour but de vivre en dehors de l'update avec un rafraichissement propre, on pourrait le voir dans certains cas comme un Update() personnalisé.
Du coup, autant en profiter en intégrant la boucle directement dans la coroutine. Il faut aussi prévoir l'arrêt et le redémarrage de la coroutine en cas de problème ou de désactivation.

Code : Tout sélectionner

private Coroutine routine = null;

// Quand l'objet sera activé, la récupération de la position commencera
void OnEnable ()
{
    if (routine == null) // ce sera normalement toujours le cas, mais la normalité joue des tours
        routine = StartCoroutine (GetPositionFromPython());
}

// Quand l'objet sera désactivé, la récupération de la position sera arrêtée
void OnDisable ()
{
    StopCoroutine (routine);
    routine = null; // StopCoroutine devrait la mettre à null, mais ça ne coûte rien de s'en assurer
}

public static IEnumerator GetPositionFromPython()
{
    //GetPosition.py fait appel à la methode ExtractPosition de cette classe
    while (true)
    {
         PythonRunner.RunFile("Assets/_Scripts/GetPosition.py");
         yield return new WaitForSeconds(0.1f);
    }
}
"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 « Unity le logiciel »