[RESOLU] Getcompoment nécessite que la classe dérive de MonoBehaviour ou soit une interface

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
jlap537
Messages : 38
Inscription : 01 Mai 2024 12:43
Localisation : saint-saturnin-sur-Loire (49)

[RESOLU] Getcompoment nécessite que la classe dérive de MonoBehaviour ou soit une interface

Message par jlap537 » 02 Mai 2024 17:29

Bonjour, je débute sur Unity et dans tout ce qui est programmation et je actuellement en train de créer un jeu en 3d et quand je compile les deux codes si dessous, un message d'erreur m'indique cela :

" ArgumentException : GetComponent nécessite que le composant demandé 'PlayerMotor' dérive de MonoBehaviour ou Component ou soit une interface.
UnityEngine.Component.GetComponent[T] () (dans /Users/bokken/build/output/unity/unity/Runtime/Export/Scripting/Component.bindings.cs:42)
PlayerController.Start () (à Assets/PlayerController.cs:14) "

Pouvez-vous m'aider ?

Code : Tout sélectionner

using System;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class PlayerMotor : MonoBehaviour
{
    private Vector3 velocity;
    private Rigidbody rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    public void Move(Vector3 _velocity)
    {
        velocity = _velocity;
    }

    private void FixedUdapte()
    {
        PerformMovement();
    }

    private void PerformMovement()
    {
        if(velocity != Vector3.zero)
        {
            rb.MovePosition(rb.position + velocity * Time.fixedDeltaTime);
        }


    }
}

Voici le deuxième code:

Code : Tout sélectionner

using System;
using UnityEngine;

[RequireComponent(typeof(PlayerMotor))]
public class PlayerController : MonoBehaviour
{
    [SerializeField]
    private float speed;

    private PlayerMotor motor;

    private void Start()
    {
        PlayerMotor.Start()
    }

    private void Update()
    {
        // Calculer la vélocité (vitesse) du mouvement de notre joueur
        float xMov = Input.GetAxisRaw("Horizontal");
        float zMov = Input.GetAxisRaw("Vertical");

        Vector3 moveHorizontal = transform.right * xMov;
        Vector3 moveVertical = transform.forward * zMov;

        Vector3 velocity = (moveHorizontal + moveVertical).normalized * speed;


        //On calcule la rotation du joueur en un vector3
        float yRot = Input.GetAxis("Mouse X");
    }


    private class PlayerMotor
    {
        internal void Move(Vector3 velocity)
        {
            throw new NotImplementedException();
        }


    }
}
"Avant Internet, on acceptait tout le temps un petit cookie sucré. Maintenant, vaut mieux ne pas les accepter, car ils riquent d'avoir un gout amère..."

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

Re: Getcompoment demande que playerMotor dérive de MonoBehaviour ou soit une interface

Message par boubouk50 » 02 Mai 2024 17:41

La fonction Start() est une fonction de Monobehaviour avec un comportement spécifique : elle est appelée dès l'activation du gameObject.
Au lieu d'appeler Start () (qui est privée d'ailleurs, donc pas accessible), appelle une fonction de ton choix (disons public void Init ()) qui fera la même chose que Start.
"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

jlap537
Messages : 38
Inscription : 01 Mai 2024 12:43
Localisation : saint-saturnin-sur-Loire (49)

Re: Getcompoment demande que playerMotor dérive de MonoBehaviour ou soit une interface

Message par jlap537 » 02 Mai 2024 18:40

Merci de m'avoir répondu boubouk50 mais peut-tu préciser de quel script et quelle ligne doive-je remplacer le fonction Start() ?
"Avant Internet, on acceptait tout le temps un petit cookie sucré. Maintenant, vaut mieux ne pas les accepter, car ils riquent d'avoir un gout amère..."

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

Re: Getcompoment demande que playerMotor dérive de MonoBehaviour ou soit une interface

Message par boubouk50 » 03 Mai 2024 09:00

Dans PlayerController, tu fais un appel à PlayerMotor.Start(). Tu ne peux appeler une fonction depuis une classe uniquement si elle est static et public, or cette fonction est private.
Ce qu'il faut faire c'est appeler une fonction depuis la référence motor et pas la classe PlayerMotor.
Il te faut donc définir une fonction public dans PlayerMotor :

Code : Tout sélectionner

private void Awake () // J'ai remplacé le Start par Awake, c'est plus indiqué d'utiliser l'Awake
{
    Init ();
}

// Fonction publique accessible par les autres classes
public void Init()
{
    rb = GetComponent<Rigidbody>();
}
Et dans PlayerController, il suffit de l'appeler :

Code : Tout sélectionner

// PlayerMotor est la classe et motor la référence
private PlayerMotor motor;

private void Awake ()
{
    // ATTENTION : tu dois d'abord récupérer le component AVANT de pouvoir l'appeler
    motor = GetComponent<PlayerMotor>();
}
private void Start()
{
    // Sans avoir récupérer le Component avant (fait dans l'Awake), cela générerait une erreur car motor serait null
    motor.Init()
}
"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

jlap537
Messages : 38
Inscription : 01 Mai 2024 12:43
Localisation : saint-saturnin-sur-Loire (49)

Re: Getcompoment demande que playerMotor dérive de MonoBehaviour ou soit une interface

Message par jlap537 » 03 Mai 2024 10:48

Merci beaucoup d'avoir corrigé mon erreur. Je vais maintenant pouvoir continuer a développer mon jeu.
"Avant Internet, on acceptait tout le temps un petit cookie sucré. Maintenant, vaut mieux ne pas les accepter, car ils riquent d'avoir un gout amère..."

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

Re: Getcompoment demande que playerMotor dérive de MonoBehaviour ou soit une interface

Message par boubouk50 » 03 Mai 2024 10:52

Lorsque la solution a été trouvée, au lieu de verrouiller le sujet, nous préférons éditer le titre du premier post et ajouter [RESOLU] en début de celui-ci.
Cela permet à d'autres membres de poser des questions supplémentaires sur le même sujet et centraliser les réponses autour de la même thématique.
Je m'en occupe cette fois-ci.
"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

jlap537
Messages : 38
Inscription : 01 Mai 2024 12:43
Localisation : saint-saturnin-sur-Loire (49)

Re: [RESOLU] Getcompoment nécessite que la classe dérive de MonoBehaviour ou soit une interface

Message par jlap537 » 03 Mai 2024 12:07

Ah. D'accord,merci de m'avoir prévenu, car je me suis inscrit avant hier donc je ne pouvais pas savoir.
"Avant Internet, on acceptait tout le temps un petit cookie sucré. Maintenant, vaut mieux ne pas les accepter, car ils riquent d'avoir un gout amère..."

Répondre

Revenir vers « Scripting »