[DB-AL] Invoquer une variable dans un autre script

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
Nudges
Messages : 2
Inscription : 26 Juil 2016 18:00

[DB-AL] Invoquer une variable dans un autre script

Message par Nudges » 26 Juil 2016 18:24

Bonjour, tout d'abord, je ne sais pas si ce dont je vais vous parler fait parti de l'Algorithmie ou du réseau, si c'est du réseau, désolé, je me suis trompé dans le titre :?

Voilà mon problème, je veux créer un script BonnusCollide qui me permet, au contact de l'objet auquel est rattaché le script, d'augmenter la cadence de tir de mon arme. Seulement, la variable définissant la cadence de tir de l'arme (timeBetweenBullets) est définie sur le script PlayerShooting. J'aimerais donc pouvoir invoquer le script PlayerShooting et sa variable timeBetweenBullets dans le script BonnusCollide et pouvoir y modifier la valeur de timeBetweenBullets.
Seulement voila, je n'ai jamais codé (du moins sans tuto) de ma vie :gene:
J'ai bien cherché sur internet et j'ai compris qu'il me fallait utiliser GetComponent , seulement je ne sais pas comment l'utiliser ni où il faut le mettre et encore moins sa syntaxe.

Voilà quand même le script PlayerShooting d'où est issue timeBetweenBullets ainsi que quelques essais que j'ai pu faire avec le GetComponnent mais qui se sont conclus sur des erreurs :/

PlayerShooting

Code : Tout sélectionner

using UnityEngine;

public class PlayerShooting : MonoBehaviour
{
    public int damagePerShot = 20;
    public float timeBetweenBullets = 0.15f;
    public float range = 100f;


    float timer;
    Ray shootRay;
    RaycastHit shootHit;
    int shootableMask;
    ParticleSystem gunParticles;
    LineRenderer gunLine;
    AudioSource gunAudio;
    Light gunLight;
    float effectsDisplayTime = 0.2f;


    void Awake ()
    {
        shootableMask = LayerMask.GetMask ("Shootable");
        gunParticles = GetComponent<ParticleSystem> ();
        gunLine = GetComponent <LineRenderer> ();
        gunAudio = GetComponent<AudioSource> ();
        gunLight = GetComponent<Light> ();
    }


    void Update ()
    {
        timer += Time.deltaTime;

		if(Input.GetButton ("Fire1") && timer >= timeBetweenBullets && Time.timeScale != 0)
        {
            Shoot ();
        }

        if(timer >= timeBetweenBullets * effectsDisplayTime)
        {
            DisableEffects ();
        }
    }


    public void DisableEffects ()
    {
        gunLine.enabled = false;
        gunLight.enabled = false;
    }


    void Shoot ()
    {
        timer = 0f;

        gunAudio.Play ();

        gunLight.enabled = true;

        gunParticles.Stop ();
        gunParticles.Play ();

        gunLine.enabled = true;
        gunLine.SetPosition (0, transform.position);

        shootRay.origin = transform.position;
        shootRay.direction = transform.forward;

        if(Physics.Raycast (shootRay, out shootHit, range, shootableMask))
        {
            EnemyHealth enemyHealth = shootHit.collider.GetComponent <EnemyHealth> ();
            if(enemyHealth != null)
            {
                enemyHealth.TakeDamage (damagePerShot, shootHit.point);
            }
            gunLine.SetPosition (1, shootHit.point);
        }
        else
        {
            gunLine.SetPosition (1, shootRay.origin + shootRay.direction * range);
        }
    }
}


BonusCollide

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class BonusCollide : MonoBehaviour {

    PlayerShooting playerShooting;

    void Awake (){
        playerShooting = GetComponentInChildren<PlayerShooting>().timeBetweenBullets;
    }
	
	// Update is called once per frame
	void Update () {
	    
	}

    void OnCollisionEnter (Collision c){
        playerShooting.timeBetweenBullets = 0.05f;
    }
}
Dance ce script, l'erreur affichée est
Assets/BonusCollide.cs(9,9): error CS0029: Cannot implicitly convert type `float' to `PlayerShooting'

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

Re: [DB-AL] Invoquer une variable dans un autre script

Message par Moi 1971 » 26 Juil 2016 19:57

Bonjour,
L'erreur te dit qu'Unity en peut convertir une variable float en variable PlayerShooting.
Cela vient du fait que dans le script "BonusCollide" tu utilises le GetComponent() pour VOULOIR mettre le script "PlayerShooting" dans la variable "playerShooting". Mais en fait, avec le code que tu as écrit tu mets la variable "timeBetweenBullets" dans la variable "playerShooting".
"timeBetweenBullets" est un flaot, "playerShooting" est de type script "PlayerShooting".
L'erreur ici :

Code : Tout sélectionner

void Awake (){
        playerShooting = GetComponentInChildren<PlayerShooting>().timeBetweenBullets;
    }
Essaies ça :

Code : Tout sélectionner

void Awake (){
        playerShooting = GetComponent<PlayerShooting>();
    }
Des exemples : https://unity3d.com/learn/tutorials/top ... tcomponent
;-)

Nudges
Messages : 2
Inscription : 26 Juil 2016 18:00

Re: [DB-AL] Invoquer une variable dans un autre script

Message par Nudges » 26 Juil 2016 21:14

Hey ! Merci, l'erreur précédente est partie. Et en regardant tes exemples, je pense que la ligne 18 (ci-dessous) peut me permettre de modifier la valeur de la variable.

Code : Tout sélectionner

playerShooting.timeBetweenBullets = 0.05f;
Sauf qu'il m'affiche cette erreur :/
NullReferenceException: Object reference not set to an instance of an object
BonusCollide.OnCollisionEnter (UnityEngine.Collision c) (at Assets/BonusCollide.cs:18)

amphibia
Messages : 52
Inscription : 21 Juin 2016 23:16

Re: [DB-AL] Invoquer une variable dans un autre script

Message par amphibia » 26 Juil 2016 22:32

C'est ce qui arrive quand tu n'instancies pas l'objet que tu veux utiliser, dans ton cas, il faudrait faire :

Code : Tout sélectionner

PlayerShooting playerShooting = gameObject.GetComponent<PlayerShooting>();
playerShooting.timeBetweenBullets = 0.05f
Au passage, tu ne respectes pas la règle d'encapsulation en modifiant les variables d'autres classes directement, il vaut mieux utiliser des accesseurs.

Répondre

Revenir vers « (C#) CSharp »