TP Unity3D - Scripts

1. Les fonctions de base

Awake Start Update

Créer un script C# dans un dossier scripts

using UnityEngine;
public class test : MonoBehaviour {
    void Awake(){
        print("awake");
    }
    void Start() {
        print("start");
    }
    void Update() {
        print("update");
    }
    void OnApplicationQuit(){
        print("Exit");
    }
}

Appliquer ce script à n’importe quel GameObject

2. Rotation des cubes

Créer un script rotator

using UnityEngine;

public class rotator : MonoBehaviour {

	// Update is called once per frame
	void Update () {
        transform.Rotate(new Vector3(15, 30, 45) * Time.deltaTime);
	}
}

Et l’appliquer au cube

Si le cube tourne:

  • Dupliquer le cube
  • Les répartir sur le terrain

Les quaternions

Note sur les rotations

Les angles de la rotation ne sont pas stockés en vecteur3 mais en quaternion avec i, j, k
tels que \(i^{2}=j^{2}=k^{2}=ijk=-1\)
On note un quaternion \(q= a + bi + cj + dk\) avec \(a, b, c, d \in \mathbb{R}\)

Avantages:

  • stockage similaire
  • calcul d’interpolation entre orientations
  • évite le blocage de cardan


(lorsque 2 axes de rotation ont la même direction)

3. Tirer

  1. créer un point de départ
  2. créer un projectile
  3. écrire un script pour:
    • lancer le projectile
    • depuis le point de départ
    • avec l’orientation de la caméra

Déclaration de variables:

using UnityEngine;
public class shoot : MonoBehaviour {
    private Transform m_cam;
    public float puissance;
    public GameObject prefab_boule;
    public Transform position_init;

On récupère l’orientation de la caméra (son Transform)

using UnityEngine;
public class shoot : MonoBehaviour {
    private Transform m_cam;
    public float puissance;
    public GameObject prefab_boule;
    public Transform position_init;
    
void Start(){
    m_cam = Camera.main.transform;
}

Si click souris alors créer balle

using UnityEngine;
public class shoot : MonoBehaviour {
    private Transform m_cam;
    public float puissance;
    public GameObject prefab_boule;
    public Transform position_init;
    
void Start(){
    m_cam = Camera.main.transform;
}

void Update(){
    if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Fire();
        }
}

void Fire()
    {
        balle = Instantiate(prefab_boule, position_init.position, m_cam.rotation);

Il faut donc rajouter cette balle aux variables déclarées.

using UnityEngine;
public class shoot : MonoBehaviour {
    private Transform m_cam;
    public float puissance;
    public GameObject prefab_boule;
    public Transform position_init;
    private GameObject balle;

Et on peut finir le script en lançant la balle

using UnityEngine;
public class shoot : MonoBehaviour {
    private Transform m_cam;
    public float puissance;
    public GameObject prefab_boule;
    public Transform position_init;
    private GameObject balle;
    
void Start(){
    m_cam = Camera.main.transform;
}

void Update(){
    if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Fire();
        }
}

void Fire()
    {
    balle = Instantiate(prefab_boule, position_init.position, m_cam.rotation);
    balle.GetComponent<Rigidbody>().velocity = balle.transform.forward * puissance;
    }
}

On peut rajouter la destruction des balles trop vieilles.

using UnityEngine;
public class shoot : MonoBehaviour {
    private Transform m_cam;
    public float puissance;
    public GameObject prefab_boule;
    public Transform position_init;
    private GameObject balle;
    
void Start(){
    m_cam = Camera.main.transform;
}

void Update(){
    if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Fire();
        }
}

void Fire()
    {
    balle = Instantiate(prefab_boule, position_init.position, m_cam.rotation);
    balle.GetComponent<Rigidbody>().velocity = balle.transform.forward * puissance;
    Destroy(balle, 30.0f);
    }
}

Mise en place de ce script

et test!

4. Améliorations du script Tirer

Plus on clique longtemps plus ça tire fort

private float puissance;
void Start()
    {
        puissance = 0;
        m_cam = Camera.main.transform;
    }

    // Update is called once per frame
    void Update () {
        //var angleTir = cam.transform.rotation;
        
        // rajoute de la puissance et s'arrete à 5
        if (Input.GetKey(KeyCode.Mouse0) && puissance < 5)
        {
            puissance += Time.deltaTime;
        }

        if (Input.GetKeyUp(KeyCode.Mouse0))
        {
            Fire();
            puissance = 0;
        }

    }

deck

By matthieuquantin

deck

  • 775