This shows you the differences between two versions of the page.
pjv:laboratoare:02 [2018/10/14 20:15] alexandru.gradinaru |
pjv:laboratoare:02 [2019/10/16 15:50] (current) alexandru.gradinaru |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Elemente de programare a jocurilor 2D ===== | + | ===== Introducere in 2D ===== |
+ | |||
+ | === Parametri ==== | ||
+ | |||
+ | Parametri se pot controla in editor atat timp cat sunt definiti ca variabile publice sau serializabile. | ||
+ | |||
+ | Se pot defini atat variabile simple cat si liste (array) | ||
+ | |||
+ | <code> | ||
+ | public float speed; | ||
+ | |||
+ | public Sprite[] images; | ||
+ | |||
+ | |||
+ | [SerializeField] | ||
+ | private Text scoreText; | ||
+ | | ||
+ | [SerializeField] | ||
+ | private GameObject[] enemyTypes; | ||
+ | </code> | ||
+ | |||
+ | |||
+ | === Instantierea obiectelor === | ||
+ | |||
+ | Obiectele se pot instantia folosind functia | ||
+ | <code> | ||
+ | newobj = Instantiate(objTemplate) as ObjType; | ||
+ | |||
+ | //from pregab - prefab must be in Resources folder | ||
+ | newobj1 = Instantiate(Resources.Load("enemy")); | ||
+ | |||
+ | // Instantiate the projectile at the position and rotation of this transform | ||
+ | Rigidbody projectile; | ||
+ | Rigidbody clone; | ||
+ | clone = Instantiate(projectile, transform.position, transform.rotation); | ||
+ | |||
+ | enemyOrc = Instantiate(Orc) as Enemy; | ||
+ | </code> | ||
+ | |||
+ | === Transformari === | ||
+ | |||
+ | Transformarile unui obiect se pot accesa prin atributul `transform` (https://docs.unity3d.com/ScriptReference/Transform.html) | ||
+ | |||
+ | <code> | ||
+ | Vector3 objectPosition = GameObject.transform.position; | ||
+ | |||
+ | GameObject.transform.position = new Vector3(posX, posY, posZ); | ||
+ | |||
+ | transform.Translate(Vector3.up * Time.deltaTime, Space.World); | ||
+ | |||
+ | transform.Rotate(Vector3.up * Time.deltaTime, Space.World); | ||
+ | </code> | ||
+ | |||
+ | === Random === | ||
+ | |||
+ | Pentru a genera valori random puteti folosi clasa Random | ||
+ | |||
+ | <code> | ||
+ | |||
+ | Random.Range(-10.0f, 10.0f) | ||
+ | Random.Range(0, 8); | ||
+ | |||
+ | </code> | ||
+ | |||
+ | === Controlul unor obiecte sau componente === | ||
+ | |||
+ | Afisarea sau ascunderea unui obiect din scena se poate face prin functia de activare | ||
+ | |||
+ | <code> | ||
+ | myObject.SetActive(false); // ascunde | ||
+ | myObject.SetActive(true); // arata | ||
+ | </code> | ||
+ | |||
+ | Similar, se pot controla componentele unui obiect | ||
+ | |||
+ | <code> | ||
+ | |||
+ | this.GetComponent<BoxCollider>().SetActive(false); // dezactivare | ||
+ | this.GetComponent<SpriteRenderer>().sprite = image; //setarea unei imagini | ||
+ | |||
+ | myObject.GetComponent<Text>().text = '123' //setarea unui text | ||
+ | |||
+ | </code> | ||
+ | |||
+ | De asemenea se pot accesa elemente copil sau parinte | ||
+ | <code> | ||
+ | childObject=parentObject.GetChild("child_name"); | ||
+ | |||
+ | //setarea unei componente a elementului copil | ||
+ | parentObject.GetChild("child_name").GetComponent<SpriteRenderer>().sprite = image; | ||
+ | </code> | ||
+ | |||
+ | === Asteptari/Wait === | ||
+ | |||
+ | Daca vreti veti sa introduceti asteptari in rularea unui script/functii puteti folosi corutine. | ||
+ | Corutinele sunt folosite pentru a porni functii asincrone, care se pot intinde pe mai multe frame-uri, si in care se poate pune pauza (wait). | ||
+ | |||
+ | <code> | ||
+ | void Start() | ||
+ | { | ||
+ | StartCoroutine(Example()); | ||
+ | } | ||
+ | |||
+ | IEnumerator Example() | ||
+ | { | ||
+ | print(Time.time); | ||
+ | yield return new WaitForSeconds(5); | ||
+ | print(Time.time); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | === Evenimente de Input === | ||
+ | |||
+ | Pentru a putea detecta daca un element a fost apasat, se poate folosi functia OnMouseDown | ||
+ | <code> | ||
+ | |||
+ | void OnMouseDown() | ||
+ | { | ||
+ | gameObject.SetActive(false); | ||
+ | } | ||
+ | | ||
+ | </code> | ||
+ | |||
+ | <note important>Atentie! Aceasta functie este activa doar in cazul in care utilizatorul apasa cu mouseul peste un elemente de UI sau un Collider</note> | ||
+ | |||
+ | === Cerinte === | ||
+ | |||
+ | Realizarea unui joc 2D de memorare | ||
+ | |||
+ | |||
+ | - Configurati scene pentru rulare 2D | ||
+ | - Adaugati in scena o imagine care reprezinta o tabla de joc (masa) | ||
+ | - Adaugati doua imagini in scena: | ||
+ | - unul care sa reprezinte elementul ascuns | ||
+ | - unul care sa reprezinte elementul afisat | ||
+ | - Scriptati elementul afisat astfel incat la click sa se ascunda si sa se afiseze cel ascuns | ||
+ | - Colectati inca 3 imagini pentru elementele afisate | ||
+ | - Realizati un game controller in care sa scriptati urmatoarele | ||
+ | - instantierea dinamica a unui grid de 4x4 elemente (primul este deja instantiat) | ||
+ | - pozitionarea random a tipurilor de elemente (in scena trebuie sa fie perechi de elemente - deci vor fi 8 perechi pozitionate random la fiecare rulare) | ||
+ | - schimbarea dinamica a imaginii in functie de tip pentru fiecare element din scena | ||
+ | - mentinerea elementelor selectate curent (se selecteaza o data maxim 1 pereche) | ||
+ | - rularea asincrona a verificarii daca perechea a fost selectata sau nu corect | ||
+ | - mentinerea si afisarea unui scor. Scorul creste atunci cand descoperiti doua elemente identice. | ||
+ | - Adaugati un buton de restart game | ||