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 | ||