Appeler du JS dans une fonction c#

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
IkaGame
Messages : 75
Inscription : 13 Oct 2016 15:43

Appeler du JS dans une fonction c#

Message par IkaGame » 13 Juin 2017 02:38

Bonjour à tous :-D

Toujours à suivre des tuto fps pour mieux apprendre et faire avancer mon projet , pendant que je travaille afin de mieux comprendre les scripts j'ai rencontré un problème qui m'embêter un petit peu , alors voila :

Je suit actuellement 2 séries française de tutoriel , une série écrit en JS tendit que l'autre en c#

Pour le moment je me concentrer sur le JS , j'ai réaliser la plupart des scripts de mon player dessus , c'est à dire le PlayerStats qui intègre les point de vie etc , les scripts d'arme à feu , etc...

Alors voila je suis sur ce tuto exactement : https://www.youtube.com/watch?v=zeJ2QfNVVVs

J'ai un petit problème pour appeler une fonction d'un JS dans le script en c#

voici le script en c# de la Balle Ennemie :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AiBullet : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}

void OnCollisionEnter(Collision Col)
{
    if (Col.gameObject.tag == "Player")
    {
        GameObject.Find("FPSController").GetComponent<PlayerStats>().healthbase -= GameObject.Find("Sniper").GetComponent<AiSniper>().Degats;
    }
}

}
Comme vous pouvez le voir dans :

Code : Tout sélectionner

  {
        GameObject.Find("FPSController").GetComponent<PlayerStats>().healthbase -= GameObject.Find("Sniper").GetComponent<AiSniper>().Degats;
    }
Unity demande l'accès aux Script PlayerStats de mon GameObject "FPSController" , mais voila le soucis est que le script en question est écrit en JS...car j'avais suivis cette série de tuto auparavant : https://www.youtube.com/watch?v=8039jzBxJHE&t=5s

Puis voici le scipt PlayerStats en JS :

Code : Tout sélectionner

#pragma strict
import UnityEngine.UI;

public var healthBar : Image;

var Regeneration : float = 0;

var grenades : int = 2;
var healthbase : float = 100;
var healthmax : float = 100;

var bloodUI : GameObject;

InvokeRepeating("Regen", 0, 1);
InvokeRepeating("reduceTimer", 0, 1);

function Start(){
	healthbase = healthmax;
}

function ApplyDammage (TheDammage : int)
{
     healthbase -= TheDammage;
	 Regeneration += 5;

     if(healthbase <=0){
	  Dead(); 
	 }
	}

function Dead () 
{
	Debug.Log("Player Dead");
}

function Update(){

healthBar.fillAmount = healthbase / healthmax;

if(healthbase >= 1 && healthbase < 30){
	bloodUI.GetComponent(CanvasGroup).alpha = 1;
}

if(healthbase >= 30 && healthbase < 60){
	bloodUI.GetComponent(CanvasGroup).alpha = 0.5;
}

if(healthbase >= 60 && healthbase < 80){
	bloodUI.GetComponent(CanvasGroup).alpha = 0.2;
}

if(healthbase >= 80 && healthbase < 100){
	bloodUI.GetComponent(CanvasGroup).alpha = 0;
}

	if(healthbase > 100){
		healthbase =100;
	}

	if(Regeneration >= 5){
		Regeneration = 5;
	}

	if(Regeneration <= 0){
		Regeneration = 0;
	}
}

function reduceTimer(){
	Regeneration -= 1;
}

function Regen(){

	if(Regeneration == 0){
		healthbase += 1;
	}
}
J'aimerais vraiment pouvoir résoudre ce problème afin que mon AiSniper puisse tirer sur mon FPSController , malgré la différence de script entre l'ennemie et le player...si vous avez besoin de plus d'explication ou autre je me tient à votre disposition ;-)

Toute aide et la Bienvenue !!! Merci !

Avatar de l’utilisateur
evereal
Messages : 109
Inscription : 06 Nov 2015 18:46

Re: Appeler du JS dans une fonction c#

Message par evereal » 13 Juin 2017 08:47

Salut,
Mélanger ces 2 langages est possible mais vraiment casse gueule, ça reste plus simple et plus sûr d'apprendre les bases du js (ou du c#) pour traduire ce que tu as besoin.
A savoir que l'API unity fourni a la fois des exemples en c# et js pour presque chaque classe et fonction.
Si tu regarde pour le GetComponent qui semble te faire peur, tu verra que ça ressemble énormément au c#.

Je suis un peu rouillé en js mais ça devrait donner:

Code : Tout sélectionner

#pragma strict
public class AiBullet extends MonoBehaviour {

function OnCollisionEnter(col: Collision) {
	if (col.gameObject.tag == "Player")
    	{
		GameObject.Find("FPSController").GetComponent.<PlayerStats>().healthbase -= GameObject.Find("Sniper").GetComponent.<AiSniper>().Degats;
	}
}
“La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi !”

IkaGame
Messages : 75
Inscription : 13 Oct 2016 15:43

Re: Appeler du JS dans une fonction c#

Message par IkaGame » 13 Juin 2017 10:46

Donc la solution la plus adapté , serais de convertir tout mes scripts c# en JS ?

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

Re: Appeler du JS dans une fonction c#

Message par boubouk50 » 13 Juin 2017 10:55

Il vaut mieux n'avoir qu'un seul langage de script, et on recommande le C# (pour des X raisons justifiées sur ce forum).
Après, si tu es plutôt parti sur du Js, continue en Js, pour ne pas à avoir à tout traduire, mais peut-être est-ce encore le moment de changer avant que ce ne soit plus possible.
"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

IkaGame
Messages : 75
Inscription : 13 Oct 2016 15:43

Re: Appeler du JS dans une fonction c#

Message par IkaGame » 13 Juin 2017 11:00

Je pense que je vais opter pour le JS en majorité , car c'est lui que j'utilise le plus , voici mes scripts de c# :

Comment pourrais-je les traduire rapidement seul ? pour que je n'ai plus à demande par la suite , la programmation est vraiment compliqué...

Script AiSoldat :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AiSoldat : MonoBehaviour {

    public Transform Target;
    public float LookAt = 50f;
    public int Degats = 10;
    public float FireAt = 30f;
    public float FireRate = 2f;
    public GameObject Projectil;
    public GameObject Eject;
    public AudioClip SoundFire;
    public int Force;
    public AudioClip SoundDead;

    private Animator Anim;
    private float NextFire;
    private UnityEngine.AI.NavMeshAgent Agent;
    private bool SoldatIsDead = false;


    // Use this for initialization
    void Start() {

        Anim = GetComponent<Animator>();
        Agent = GetComponent<UnityEngine.AI.NavMeshAgent>();

    }

    // Update is called once per frame
    void Update()
    {

        if (Vector3.Distance(Target.position, transform.position) < FireAt)
        {
            SoldatCourse();
        }
        else
        {
            Anim.SetBool("Course", false);
        }

        if (Vector3.Distance(Target.position, transform.position) < FireAt)
        {
            SoldatFire();
        }
    }

        void SoldatCourse()
        {
            if (Agent.velocity.magnitude > 0.1)
        {
            Anim.SetBool("Course", true);
        }
         else
        { 
            Anim.SetBool("Course", false);
        }
        Agent.updateRotation = true;
        Agent.SetDestination(Target.position);

    }

    void SoldatFire()
    {
        Debug.DrawRay(Eject.transform.position, transform.TransformDirection(Vector3.forward * 30));

        if (Time.time > NextFire && !SoldatIsDead)
        {
            NextFire = Time.time + FireRate;

            RaycastHit hit;
            if (Physics.Raycast(Eject.transform.position, transform.TransformDirection(Vector3.forward), out hit))
            {
                if (hit.transform.gameObject.tag == "Player")
                {
                    GetComponent<AudioSource>().PlayOneShot(SoundFire);
                    GameObject Bullet = Instantiate(Projectil, Eject.transform.position, Quaternion.identity) as GameObject;
                    Bullet.GetComponent<Rigidbody>().AddForce(transform.TransformDirection(Vector3.forward) * Force);
                }
            }

        }
    }
    public void SoldatDead()
    {
        SoldatIsDead = true;
        Agent.speed = 0;
        GetComponent<Collider>().enabled = false;
        GetComponent<AudioSource>().PlayOneShot(SoundDead);
        Anim.SetTrigger("Mort");
        Destroy(gameObject, 4f);
    }
}
Puis le script AiSniper :

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AiSniper : MonoBehaviour
{

    public Transform Target;
    public float LookAt = 50f;
    public float Degats = 10f;
    public float FireAt = 30f;
    public float FireRate = 2f;
    public GameObject Projectil;
    public GameObject Eject;
    public AudioClip SoundFire;
    public int Force;
    public AudioClip SoundDead;

    private Animator Anim;
    private float NextFire;
    private UnityEngine.AI.NavMeshAgent Agent;
    private bool SoldatIsDead = false;


    // Use this for initialization
    void Start()
    {
        Anim = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {

        if (Vector3.Distance(Target.position, transform.position) < LookAt)
        {
            SniperViser();
        }
        else
        {
            Anim.SetBool("Viser", false);
        }
    }

    void SniperViser()
    {
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Target.position - transform.position), 20 * Time.deltaTime);

        if (Vector3.Distance(Target.position, transform.position) < 5)
        {
            transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z);
        }
    }

    void SniperFire()
    {
        Debug.DrawRay(Eject.transform.position, transform.TransformDirection(Vector3.forward*30));
        if (Time.time > NextFire)
        {
            NextFire = Time.time + FireRate;

            RaycastHit hit;

            if (Physics.Raycast(Eject.transform.position, transform.TransformDirection(Vector3.forward), out hit))
            {
                if (hit.transform.gameObject.tag == "Player")
                {
                    GetComponent<AudioSource>().PlayOneShot(SoundFire);
                    GameObject AiBullet = Instantiate(Projectil, Eject.transform.position, Quaternion.identity) as GameObject;
                    AiBullet.GetComponent<Rigidbody>().AddForce(transform.TransformDirection(Vector3.forward) * Force);
                }
            }
        }
    }
}
Merci à tous :-D

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

Re: Appeler du JS dans une fonction c#

Message par boubouk50 » 13 Juin 2017 11:16

Franchement les langages sont assez proches, mis à part les déclarations, ça change pas beaucoup.
Comme te l'a écrit evereal, vas sur la documentation d'Unity, chaque fonction est fournie en C# et Js, tu pourras traduire donc facilement ton code.
"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

IkaGame
Messages : 75
Inscription : 13 Oct 2016 15:43

Re: Appeler du JS dans une fonction c#

Message par IkaGame » 13 Juin 2017 12:09

Pour le moment je pense avoir réussi à convertir les variables...en JS mais sur le NavMeshAgent je galère un peu :snif:

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AiSoldat : MonoBehaviour {

    public Transform Target;
    public float LookAt = 50f;
    public int Degats = 10;
    public float FireAt = 30f;
    public float FireRate = 2f;
    public GameObject Projectil;
    public GameObject Eject;
    public AudioClip SoundFire;
    public int Force;
    public AudioClip SoundDead;

    private Animator Anim;
    private float NextFire;
    private UnityEngine.AI.NavMeshAgent Agent;
    private bool SoldatIsDead = false;

Code : Tout sélectionner

  public var Target : Transform;
    public var LookAt : float = 50f;
    public var Degats : float = 10f;
    public var FireAt : float = 30f;
    public var FireRate : float = 2f;
    public var Projectil : GameObject;
    public var Eject : GameObject;
    public var SoundFire : AudioClip;
    public var Force : int;
    public var SoundDead : AudioClip;

    private var Anim : Animator;
    private var NextFire : float;
    private var UnityEngine.AI.NavMeshAgent Agent;
    private var SoldatIsDead : bool = false;

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

Re: Appeler du JS dans une fonction c#

Message par boubouk50 » 13 Juin 2017 12:18

Comme les autres, dans la doc tu as une déclaration: https://docs.unity3d.com/ScriptReferenc ... ation.html

Code : Tout sélectionner

var Agent: NavMeshAgent;
Aussi, toutes tes variables devraient commencer par une minuscule et pas par une majuscule pour pas que tu aies de conflit avec des noms de classe ou de fonction.
"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

IkaGame
Messages : 75
Inscription : 13 Oct 2016 15:43

Re: Appeler du JS dans une fonction c#

Message par IkaGame » 14 Juin 2017 16:08

J'ai quasiment tout corriger , et je peut vous dire vu mon niveau en programmation...c'est presque un exploit :mdr1: , enfin bref , je but sur un petit problème depuis ma correction , en effet je ne comprend pas comment placr mon "out hit" dans mon script , voici le script corriger en Js :

Code : Tout sélectionner

import System.Collections;
import System.Collections.Generic;
import UnityEngine;

{

     var Target : Transform;
     var LookAt : float = 50f;
     var Degats : float = 10f;
     var FireAt : float = 30f;
     var FireRate : float = 2f;
     var Projectil : GameObject;
     var Eject : GameObject;
     var SoundFire : AudioClip;
     var Force : int;
     var SoundDead : AudioClip;
     var anim : Animator;
     var NextFire : float = 2f;
     var SoldatIsDead : bool = false;
	 private var agent: NavMeshAgent;


    // Use this for initialization
    function Start()
    {
         anim = GetComponent("Animator");
    }

    // Update is called once per frame
    function Update()
    {

        if(Vector3.Distance(Target.position, transform.position) < LookAt)
        {
            SniperViser();
        }
        else
        {
            GetComponent.<Animator>().Play("Viser");
        }
    }

    function SniperViser()
    {
        transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(Target.position - transform.position), 20 * Time.deltaTime);

        if (Vector3.Distance(Target.position, transform.position) < 5)
        {
            transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, transform.eulerAngles.z);
        }
    }

    function SniperFire()
    {
        Debug.DrawRay(Eject.transform.position, transform.TransformDirection(Vector3.forward*30));
        if (Time.time > NextFire)
        {
            NextFire = Time.time + FireRate;

            var hit : RaycastHit;

            if (Physics.Raycast(Eject.transform.position, transform.TransformDirection(Vector3.forward), out hit))
            {
                if (hit.transform.gameObject.tag == "Player")
                {
                    GetComponent.<AudioSource>().PlayOneShot(SoundFire);
                    GameObject.AiBullet = Instantiate(Projectil, Eject.transform.position, Quaternion.identity) as GameObject;
                    GetComponent.AiBullet.<Rigidbody>().AddForce(transform.TransformDirection(Vector3.forward) * Force);
                }
            }
        }
    }
Voici le petit problème à la fin de la ligne :hello:

Code : Tout sélectionner

  if (Physics.Raycast(Eject.transform.position, transform.TransformDirection(Vector3.forward), out hit))

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

Re: Appeler du JS dans une fonction c#

Message par boubouk50 » 14 Juin 2017 16:17

C'est écrit dans la doc: il ne faut pas mettre le out.
"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 « Scripting »