Problème avec les classes

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
kyzfu
Messages : 33
Inscription : 25 Sep 2012 18:30

Problème avec les classes

Message par kyzfu » 17 Sep 2014 18:48

Bonsoir à tous ,
J'ai un problème avec une classe, je m'explique :
Dans un script j'ai cette ligne :

Code : Tout sélectionner

static var attractor : FauxGravityAttractor
qui fait référence a une classe du script portant le même nom :

Code : Tout sélectionner

public class FauxGravityAttractor extends MonoBehaviour {
public var gravity : float = -12;

public function Attract(body : Transform) {
      var gravityUp : Vector3 = (body.position - transform.position).normalized;
      var localUp : Vector3 = body.up;

      body.rigidbody.AddForce(gravityUp * gravity);

      var targetRotation : Quaternion = Quaternion.FromToRotation(localUp,gravityUp) * body.rotation;
      body.rotation = Quaternion.Slerp(body.rotation,targetRotation,50f * Time.deltaTime );
}


}
Avant cette variable était publique et j'avais juste à glisser-déposer un gameObject de la scène pour le lier à "attractor" mais maintenant j'ai besoin d’accéder à "attractor" à partir d'autres scripts et donc j'ai changer "public" par "static". Maintenant le glisser-déposer est impossible et j'aimerais savoir comment associé un gameObject de la scène à "attractor" par script sachant que "attractor" est de type classe.
j'ai essayer avec GameObject.Find() mais evidement c'est du type GameObject et non "FauxGravityAttractor" ^^


Merci d'avance,

kyz.

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Problème avec les classes

Message par giyomuSan » 17 Sep 2014 23:51

GetComponent. .. non ?

Ou se trouve ton script FauxGravityAttractor ?

D'ailleur l utilisation du static la a pas beaucoup de sens dans ce cas la, tu peux faire sans est simplement recuperer ce component dans les scripts ou tu en a besoin.

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Problème avec les classes

Message par ZJP » 18 Sep 2014 00:32

Ce script fonctionne avec un autre et sert de base pour un système de gravité autour d'une sphère.
Le script "optimum" est celui ci ( a placer sur le GO "planète")

Code : Tout sélectionner

using UnityEngine;

public class FauxGravityAttractor : MonoBehaviour
{
    public bool  m_UseLocalVector = true;
    public float m_Gravity        = -5.0f; // ZJP
    
    public void Attract(FauxGravityBody body)
    {
        // Create local variables
        Vector3   gravityUp;
        Transform trans = body.transform;
        Rigidbody rigid = body.rigidbody;
        rigid.drag = 0.1f;

        // Set gravity local variable
        gravityUp = trans.position - this.transform.position;
        //Debug.Log(gravityUp);
        gravityUp.Normalize();
        
        // Apply forces to body
        rigid.AddForce(gravityUp * this.m_Gravity * rigid.mass);
        
        // Check value of rotation freeze
//        if(rigid.freezeRotation == true)
        {
            // Calculate quaternion
            Quaternion quatern = Quaternion.FromToRotation(trans.up, gravityUp);
            quatern = quatern * trans.rotation;
            
            // Calculate rotation of body
//            trans.rotation = quatern;
            trans.rotation = Quaternion.Slerp(trans.rotation, quatern, 1.0f);
        }

    }

}


Le suivant :

Code : Tout sélectionner

using UnityEngine;

[RequireComponent (typeof(Rigidbody))]
public class FauxGravityBody : MonoBehaviour
{
    public FauxGravityAttractor m_Attractor = null;
    private int m_Grounded = 0;

    public int Grounded
    {
        get
        {
            // Return value of grounded member
            return this.m_Grounded;
        }
    }

    private void Awake()
    {
        // Set needed rigid body values
        this.rigidbody.WakeUp();
        this.rigidbody.useGravity = false;
        this.rigidbody.freezeRotation = true;
    }

    private void FixedUpdate()
//    private void Update()
    {
        // Check if attractor member is set
        if(this.m_Attractor != null)
        {
            // Apply attract to object
            this.m_Attractor.Attract(this);
        }
    }
}

 
est placé sur TOUT les GOs se mouvant sur la "planète". "m_Attractor" est le GO de la planète qui contient la classe (le script) FauxGravityAttractor.
Cette paire de scripts fonctionne très bien : je les utilise depuis près de 2 ans pour mon projet Moon.

kyzfu
Messages : 33
Inscription : 25 Sep 2012 18:30

Re: Problème avec les classes

Message par kyzfu » 19 Sep 2014 10:34

Déjà merci pour vos réponses !
Comme ZJP l'a bien expliqué, le script FauxGravityAttractor est à placé sur les planètes et le script FauxGravityBody à placer sur les GO qui sont sur la planète.
Mon problème est que je n'arrive pas à récupérer la valeur de "attractor" (de type FauxGravityAttractor) pour pouvoir la manipuler (et encore moins lorsque cette variable est déclaré publique). j'ai essayé avec :

Code : Tout sélectionner

FauxGravityBody.attractor = GetComponent(FauxGravityAttractor);
mais sans succès :(

Cordialement,

kyz


EDIT : Problème résolu ! c'est juste que je ne maîtrisais pas la fonction GetComponent^^
voici mon code pour acceder à "attractor"

Code : Tout sélectionner

var tmp = GetComponent(FauxGravityBody);
print(tmp.attractor);// tmp.attractor désigne bien "attractor"

Répondre

Revenir vers « Scripting »