Φτιάχνοντας ένα απλό παιχνίδι με κουμπιά, κουτιά και πόρτες στο Unity. Ενεργοποιήστε και απενεργοποιήστε τη μουσική. Λειτουργία Unity3D Ενημερώστε την κίνηση του ανελκυστήρα πατώντας κουμπιά

Αυτό το σεμινάριο θα δώσει σε όλους μια βασική κατανόηση του τρόπου λειτουργίας του GUI στο Unity χρησιμοποιώντας το παράδειγμα της δημιουργίας ενός απλού μενού. Αυτό είναι ένα πολύ απλό μάθημα που δεν απαιτεί άλλες ειδικές δεξιότητες εκτός από βασικές γνώσεις Unity Java Script (ή, γενικά, οποιοδήποτε σενάριο). Ας αρχίσουμε.

Ας ξεκινήσουμε δημιουργώντας μια νέα σκηνή παιχνιδιού. Θα ονομάσουμε αυτή τη σκηνή "Επίπεδο_1". Θα ονομάσουμε τη σκηνή του μενού "Μενού". Στο μέλλον, η μετακίνηση μεταξύ αυτών των σκηνών θα είναι δυνατή χρησιμοποιώντας την εντολή.
Application.LoadLevel(SceneNumber);
Ωστόσο, θα επιστρέψουμε σε αυτήν την εντολή αργότερα. Σε αυτό το σημείο θα έπρεπε να μας ενδιαφέρει περισσότερο ο «Αριθμός Σκηνής». Μπορείτε να εισαγάγετε και να προβάλετε τον αριθμό σκηνής χρησιμοποιώντας το παράθυρο Build Settings (Αρχείο

%D0%92%20%D1%8D%D1%82%D0%BE%D0%BC%20%D1%83%D1%80%D0%BE%D0%BA%D0%B5%20%D1%8F %20%D1%80%D0%B0%D1%81%D1%81%D0%BA%D0%B0%D0%B6%D1%83,%20%D0%BA%D0%B0%D0%BA% 20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20GUI%20%D0%B2%20Ενότητα,%20%D0%B8 %20%D0%BF%D0%BE%20%D1%85%D0%BE%D0%B4%D1%83%20%D0%B4%D0%B5%D0%BB%D0%B0%20%D0 %B1%D1%83%D0%B4%D1%83%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%B2%D0%B0%D1%82%D1 %8C%20%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B5%20%D0%BC%D0%B5%D0%BD%D1%8E .%20%D0%AD%D1%82%D0%BE%D1%82%20%D1%83%D1%80%D0%BE%D0%BA%20%D0%B4%D0%BB%D1% 8F%20%D0%BD%D0%BE%D0%B2%D0%B8%D1%87%D0%BA%D0%BE%D0%B2,%20%D0%BD%D0%BE%20%D0 %B6%D0%B5%D0%BB%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%20%D1%81%20%D0%BD %D0%B0%D1%87%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%BC%20%D0%B7%D0%BD%D0%B0%D0%BD %D0%B8%D0%B5%D0%BC%20Unity%20Java%20Script,%20%D0%B4%D0%B0%20%D0%B8%D0%BB%D0%B8%20%D0%B2% D0%BE%D0%BE%D0%B1%D1%89%D0%B5%20%D0%BA%D0%B0%D0%BA%D0%BE%D0%B3%D0%BE%20%D0% BB%D0%B8%D0%B1%D0%BE%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0.%20%D0%9D %D1%83%20%D1%87%D1%82%D0%BE,%20%D0%BD%D0%B0%D1%87%D0%BD%D1%91%D0%BC.

%D0%90%20%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C%20%D1%8F%20%D0%B4%D1%83%D0%BC %D0%B0%D1%8E%20%D1%81%20%D1%82%D0%BE%D0%B3%D0%BE,%20%D1%87%D1%82%D0%BE%20% D0%BC%D1%8B%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%B4%D0%B8%D0%BC%20%D0%BD%D0% BE%D0%B2%D1%83%D1%8E%20%D1%81%D1%86%D0%B5%D0%BD%D1%83.%20%D0%9D%D0%B0%D0%B7 %D0%BE%D0%B2%D1%91%D0%BC%20%D1%81%D1%86%D0%B5%D0%BD%D1%83%20%D1%81%20%D0%B8 %D0%B3%D1%80%D0%BE%D0%B9%20" level_1="">

Application.LoadLevel(SceneNumber);

Θα επιστρέψουμε στην ομάδα λίγο αργότερα. Τώρα μας ενδιαφέρει περισσότερο το «Scene Number». Πώς να το εγκαταστήσετε; Που μπορώ να το παρακολουθήσω;
Μπορείτε να ορίσετε και να προβάλετε τον αριθμό στο παράθυρο ρυθμίσεων Build (Ρυθμίσεις αρχείου/κατασκευής...):
/img/origs/647.jpg" alt="Photo" />!}
Ο αριθμός είναι κυκλωμένος με κόκκινο χρώμα.
Για να προσθέσετε μια σκηνή, πρέπει να κάνετε κλικ στο Add Current (με πράσινο κύκλο). Σε όποια σκηνή κι αν βρίσκεστε, μια τέτοια σκηνή θα προστεθεί. Όταν ξεκινάτε το παιχνίδι, ξεκινά η σκηνή "0", δηλαδή "Μενού".

Το σκηνικό είναι στημένο. Τώρα ας δημιουργήσουμε ένα σενάριο, για παράδειγμα "menu.js" και ας το επισυνάψουμε στην κάμερα. Περαιτέρω θα εργαστούμε σχεδόν αποκλειστικά με αυτό το σενάριο. Οι προετοιμασίες έχουν ολοκληρωθεί.

Σχεδόν το απλούστερο αντικείμενο GUI είναι ένα Παράθυρο. Ας δούμε την εντολή στο σενάριο με περισσότερες λεπτομέρειες.

GUI.Box(Rect(A, B, C, D), "Text");

A είναι ο αριθμός των pixel από το αριστερό άκρο της οθόνης μέχρι το αριστερό άκρο του παραθύρου.
B είναι ο αριθμός των pixel από το επάνω άκρο της οθόνης έως το επάνω άκρο του παραθύρου.
C - πλάτος παραθύρου.
D - ύψος παραθύρου.
Και μετά ακολουθεί το όνομα του παραθύρου. Αυτή η επιγραφή θα κρεμαστεί στην κορυφή του παραθύρου.
Ας δημιουργήσουμε το πρώτο μας παράθυρο:

Λειτουργία OnGUI() ( GUI.Box(Rect(5,5,200,200), "Text"); )

Ο αριθμός είναι κυκλωμένος με κόκκινο χρώμα.
Εάν θέλετε να προσθέσετε μια σκηνή, θα χρειαστεί να κάνετε κλικ στο κουμπί AddCurrent, το οποίο είναι κυκλωμένο με πράσινο χρώμα. Θα προστεθεί η ίδια η σκηνή στην οποία βρίσκεστε αυτήν τη στιγμή. Όταν ξεκινάτε το πρόγραμμα παιχνιδιού, θα ξεκινήσει η σκηνή "0", που σημαίνει "Μενού".
Η σκηνή έχει πλέον δημιουργηθεί. Στη συνέχεια, θα πρέπει να δημιουργήσετε ένα σενάριο, ας το ονομάσουμε "menu.js" και να το κρεμάσετε στην κάμερα. Θα γίνει περαιτέρω δουλειά κυρίως με αυτό το σενάριο. Οι απαραίτητες προετοιμασίες έχουν ολοκληρωθεί.
Το απλούστερο αντικείμενο GUI είναι ένα παράθυρο. Η εντολή στο σενάριο μοιάζει με αυτό:
GUI.Box(Rect(A, B, C, D), "Text");
, όπου A είναι ο αριθμός των pixel από το αριστερό άκρο της οθόνης μέχρι το αριστερό άκρο του παραθύρου,
B – το ίδιο, από το δεξί άκρο της οθόνης μέχρι το πάνω άκρο του παραθύρου,
C είναι το πλάτος του παραθύρου,
D είναι το ύψος του παραθύρου,
Ακολουθεί το όνομα του παραθύρου. Η επιγραφή θα βρίσκεται στο επάνω μέρος του παραθύρου σας.
Τώρα ας δημιουργήσουμε το πρώτο παράθυρο, στη σκηνή θα μοιάζει με αυτό:


Για να το συνδέσετε σε άλλες γωνίες της οθόνης ή να το τοποθετήσετε στο κέντρο, υπάρχουν οι ακόλουθες εντολές:

Οθόνη.πλάτος Οθόνη.ύψος

Η πρώτη εντολή θα επιστρέψει τον αριθμό των pixel κατά το πλάτος της οθόνης και η δεύτερη θα επιστρέψει τον αριθμό των pixel κατά μήκος της οθόνης. Χρησιμοποιώντας αυτές τις δύο εντολές μπορείτε να τοποθετήσετε παράθυρα σε διαφορετικά σημεία της οθόνης και θα παραμείνουν εκεί σε διαφορετικές αναλύσεις οθόνης.

Λειτουργία OnGUI () ( GUI.Box (Rect (5,5,50,50), "1"); //επάνω αριστερή γωνία GUI.Box (Rect (Screen.width - 55,5,50,50), " 2"); // επάνω δεξιά γωνία του GUI.Box (Rect (5,Screen.height - 55,50,50), "3"); // Κάτω αριστερή γωνία του GUI.Box (Rect (Screen.width - 55, Screen.height - 55,50,50), "4"); , "5");


Ανάλογα με την ανάλυση της οθόνης σας, μπορείτε πλέον να κάνετε τα παράθυρα όλο και μικρότερα.

Σύμφωνα με πολλούς χρήστες του Unity, το πιο χρησιμοποιούμενο αντικείμενο GUI είναι το κουμπί. Η σύνταξη ενός σεναρίου για ένα κουμπί είναι πολύ απλή.

Αν (εδώ) ( )

Τώρα θα δημιουργηθεί ένα κουμπί που μπορεί να μας στείλει στη σκηνή του παιχνιδιού:

Λειτουργία OnGUI () ( GUI.Box (Rect (Screen.width/2 - 100,Screen.height/2 - 100.200.180), "Main Menu"); // window if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 - 80,180,30), "Play")) ( // το κουμπί μας Application.LoadLevel (1); // φόρτωση του επιπέδου Level_1 ) )

Όταν κάνετε κλικ στο κουμπί "Αναπαραγωγή", θα φορτωθεί η πρώτη τιμή (Επίπεδο_1).
Αξίζει επίσης να δημιουργήσετε μερικά ακόμη κουμπιά λειτουργιών και ένα κουμπί "έξοδος".

Λειτουργία OnGUI () ( GUI.Box (Rect (Screen.width/2 - 100, Screen.height/2 - 100.200.180), "Main Menu"); if (GUI.Button (Rect (Screen.width/2 - 90, Screen.height/2 - 80.180,30), "Play")) ( Application.LoadLevel (1); ) if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 - 40.180,30) ), "Ρυθμίσεις")) ( ) if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 - 0,180,30), "Help")) ( ) if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 + 40,180,30), "Exit")) ( Application.Quit(); // exit ) )


Εντολή "Application.Quit();" δεν θα λειτουργήσει στον επεξεργαστή.
Αξίζει επίσης να ρυθμίσετε πρόσθετα παράθυρα για να κάνετε ρυθμίσεις και βοήθεια. Για να τα δημιουργήσουμε θα χρησιμοποιήσουμε μια μεταβλητή, για παράδειγμα "window".
Ας προσθέσουμε μερικά ακόμη παράθυρα.

Παράθυρο Var = 0; λειτουργία OnGUI () ( εάν (παράθυρο == 0) ( // τώρα το κύριο μενού είναι ενεργοποιημένο όταν παράθυρο = 0 GUI.Box (Rect (Screen.width/2 - 100,Screen.height/2 - 100.200.180), "Main Μενού" ); if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 - 80,180,30), "Play")) ( Application.LoadLevel (1); ) if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 - 40,180,30), "Settings")) (παράθυρο = 1; // ενεργοποιήστε το παράθυρο "ρυθμίσεις") if (GUI.Button (Rect (Screen .width/ 2 - 90,Screen.height/2 - 0,180,30), "Help")) (παράθυρο = 2; //ενεργοποίηση του παραθύρου "help") if (GUI.Button (Rect (Screen.width/2 - 90,Screen .height/2 + 40,180,30), "Exit")) ( Application.Quit(); ) ) if (window == 1) ( // ρυθμίσεις μας GUI.Box (Rect (Screen.width/ 2 - 100, Screen.height/2 - 100.200.180), "Ρυθμίσεις" if (GUI.Button (Rect (Screen.width/2 - 90, Screen.height/2 + 40.180,30), "Back")) ( παράθυρο = 0 ; ) ) if (παράθυρο == 2) ( // βοήθειά μας GUI.Box (Rect (Screen.width/2 - 100,Screen.height/2 - 100.200.180), "Help"); if (GUI .Κουμπί (Rect (Screen.width/2 - 90,Screen.height/2 + 40,180,30), "Back")) ( παράθυρο = 0; ) ))

Σύνδεση κουμπιών πληκτρολογίου με χειριστήρια:

If (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 + 40,180,30), "Back") || Input.GetKey ("escape")) ( παράθυρο = 0; )

Το κείμενο έχει μεγάλη σημασία για τη δημιουργία ενός μενού. Μπορούμε να πούμε ότι το σενάριο κειμένου δεν διαφέρει καθόλου από το σενάριο παραθύρου. Η ενότητα "Βοήθεια" απαιτεί συμπλήρωση:

Αν (παράθυρο == 2) ( GUI.Box (Rect (Screen.width/2 - 100, Screen.height/2 - 100.200.180), "Help"); GUI.Label (Rect (Screen.width/2 - 100, Screen.height/2 - 80.200.140), "Θα πρέπει να υπάρχει βοήθεια εδώ" // text if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 + 40.180,30), "Back"); " ) || Input.GetKey("escape")) (παράθυρο = 0; ) )

Υπάρχει τώρα κείμενο στην ενότητα Βοήθεια.
Μπορείτε επίσης να εφαρμόσετε ένα στυλ σε αυτό το κείμενο. Για να γίνει αυτό πρέπει να το δημιουργήσετε.

Var style: GUIStyle;

Τα ακόλουθα θα εμφανιστούν στο λεγόμενο camera inpestor:

Οι επιλογές που χρησιμοποιούνται συχνά επισημαίνονται με κόκκινο χρώμα:
1 - Χρώμα κειμένου.
2 - Γραμματοσειρά.
3 - Άγκυρα.
μέγεθος 4.
5 - Έντονη, Πλάγια, Έντονη Πλάγια.

Αφού επιλέξετε τις απαραίτητες επιλογές, το στυλ επισυνάπτεται στο κείμενο:

Ο διακόπτης εναλλαγής θα είναι πολύ παρόμοιος με ένα κουμπί, αλλά σε αντίθεση με αυτόν, μπορεί να είναι σε δύο θέσεις (ενεργοποίηση ή απενεργοποίηση). Είναι γραμμένο έτσι:

Var toggle: boolean = false; toggle = GUI.Toggle(Rect(20, 20, 100, 20), toggle, "Toggle");

Ο διακόπτης εναλλαγής χρησιμοποιείται για μεταβλητές τύπου boolean, οι οποίες μπορούν να έχουν μόνο δύο τιμές: true και false.

Προσθέστε ένα επιπλέον παράθυρο στην ενότητα "Ρυθμίσεις":

Αν (παράθυρο == 1) ( GUI.Box (Rect (Screen.width/2 - 100,Screen.height/2 - 100.200.180), "Settings"); toggle = GUI.Toggle (Rect (Screen.width/2 - 90,Screen.height/2 - 70, 80, 20), toggle, "Toggle" // εναλλαγή μας if (toggle == true) (GUI.Box (Rect (Screen.width/2 - 130), Ύψος οθόνης/2 - 100,20,20), "") // αριστερό παράθυρο GUI. ); // δεξιό παράθυρο ) if (GUI.Button (Rect (Screen.width/2 - 90,Screen.height/2 + 40,180,30), "Back") || Input.GetKey ("escape")) ("Escape")) παράθυρο = 0 ) )

Εάν ενεργοποιήσετε τον διακόπτη εναλλαγής, δύο επιπλέον θα εμφανιστούν δίπλα στο κύριο παράθυρο.

Αξίζει επίσης να εξοικειωθείτε με μια τόσο χρήσιμη λειτουργία όπως το ρυθμιστικό. Χρησιμοποιώντας το ρυθμιστικό μπορείτε να αλλάξετε την ένταση κ.λπ. Όσον αφορά τη γραφή, το ρυθμιστικό πρακτικά δεν διαφέρει από τον διακόπτη εναλλαγής, μόνο χρησιμοποιεί μια διαφορετική μεταβλητή: float, int.

Var side: int = 0; Sider = GUI.HorizontalSlider(Rect(25, 25, 100, 30), side, A, B);

όπου Α είναι ένας αριθμός που υποδεικνύει την τιμή της μεταβλητής όταν το ρυθμιστικό βρίσκεται στα αριστερά.
B - ένας αριθμός που υποδεικνύει την τιμή της μεταβλητής όταν το ρυθμιστικό βρίσκεται στα δεξιά.
Ας εκσυγχρονίσουμε το προηγούμενο σενάριο χρησιμοποιώντας το ρυθμιστικό:

Αν (παράθυρο == 1) ( GUI.Box (Rect (Screen.width/2 - 100,Screen.height/2 - 100.200.180), "Settings"); toggle = GUI.Toggle (Rect (Screen.width/2 - 90,Screen.height/2 - 70, 180, 20), toggle, "Toggle" if (toggle == true) (side = GUI.HorizontalSlider(Rect(Screen.width/2 - 90,Screen.) ύψος/ 2 - 40, 180, 20), πλαϊνό, 0, 160 //Ρυθμιστικό GUI.Box (Rect (Screen.width/2 - 130,Screen.height/2 - 100,20,20 + side), "" ); 90,Screen.height/2 + 40,180,30), "Back") ||


Τώρα μπορείτε εύκολα να αλλάξετε το μέγεθος των παραθύρων χρησιμοποιώντας το ρυθμιστικό.
Ας προσθέσουμε επίσης ένα κατακόρυφο ρυθμιστικό για να δείξουμε ότι δεν μπορεί να είναι μόνο οριζόντιο.

Αν (παράθυρο == 1) ( GUI.Box (Rect (Screen.width/2 - 100,Screen.height/2 - 100.200.180), "Settings"); toggle = GUI.Toggle (Rect (Screen.width/2 - 90,Screen.height/2 - 70, 180, 20), toggle, "Toggle" if (toggle == true) (side = GUI.HorizontalSlider(Rect(Screen.width/2 - 90,Screen.) ύψος/ 2 - 40, 180, 20), πλευρά, 0, 160, //οριζόντια πλευρά1 = GUI.VerticalSlider(Rect(Screen.width/2 - 90,Screen.height/2 - 20, 20, 50), Sider1, 0, 160); πλάτος/2 + 110, Ύψος οθόνης/2 - 100,20 + πλαϊνή πλευρά, 20 + πλαϊνή πλευρά1), "" ) εάν (GUI.Button (Rect (Screen.width/2 - 90,Screen.height)) /2 + 40.180 ,30), "Πίσω") ||.

Πρέπει να θυμηθώ να προσθέσω όλες τις απαραίτητες μεταβλητές;

Var toggle = false; //εναλλαγή διακόπτη var side: int = 0; // οριζόντιο ρυθμιστικό var sider1: int = 0; // κατακόρυφο ρυθμιστικό

Ανάλυση της οθόνης
Η ανάλυση της οθόνης αλλάζει χρησιμοποιώντας την εντολή:

Screen.SetResolution(A, B, C);

Όπου Α είναι το πλάτος.
Β - ύψος.
C - πλήρης οθόνη ή με παράθυρο.
Παράδειγμα:

Screen.SetResolution(1280, 1024, true);

Ενταση ήχου
Για να αλλάξετε την ένταση, χρησιμοποιήστε την εντολή:

Audio.volume = μεταβλητή (κατά προτίμηση float);

Η ίδια η μεταβλητή αλλάζει χρησιμοποιώντας το ρυθμιστικό.

Γεια σας αγαπητοί δημιουργοί παιχνιδιών.
Υπάρχουν πολλά μαθήματα για τη δημιουργία παιχνιδιών στο Unity3D στο Διαδίκτυο, αλλά είναι πολύ λίγα στο ανώτερο επίπεδο και απευθύνονται σε αρχάριους.
Σε αυτήν τη σειρά μαθημάτων, θα περιγράψω πώς να δημιουργήσετε ένα μενού παιχνιδιού χρησιμοποιώντας ένα τυπικό GUI, χωρίς τη χρήση μη τυπικών στοιχείων.
Το μάθημα απευθύνεται σε αρχάριους που θέλουν να μάθουν πώς να δημιουργούν το δικό τους μενού στο παιχνίδι.

Στο τέλος του πρώτου μαθήματος, θα έχετε ένα μενού παιχνιδιού με κουμπιά εργασίας:

Οι παρακάτω συναρτήσεις θα χρησιμοποιηθούν σε αυτό το μάθημα:
1) δημόσιος ενθ- αντιστοίχιση μιας μεταβλητής σε μια αριθμητική τιμή
2) GUI.BeginGroup- δημιουργία μιας ομάδας GUI
3) GUI.Button- Δημιουργία κουμπιού GUI
4) Debug.Log- Έξοδος μηνύματος στην κονσόλα
5) Application.LoadLevel- επίπεδο φόρτωσης
6) Application.Quit- κλείσιμο του παιχνιδιού

Λοιπόν, ας ξεκινήσουμε:
Βήμα 1:Δημιουργούμε ένα σενάριο στο παράθυρο του Project C# και το ονομάζουμε δικό μας.
Βήμα 2:Δημιουργία κάμερας παιχνιδιού:
* Στο επάνω μενού του προγράμματος, κάντε κλικ στο στοιχείο Αντικείμενο παιχνιδιού
* Αφού κάνετε κλικ, εμφανίζεται ένα αναπτυσσόμενο μενού, σε αυτό κάντε κλικ στο στοιχείο Δημιουργία Άλλου
* Στη λίστα που εμφανίζεται, κάντε κλικ στη γραμμή που ονομάζεται Κάμερα και μετά από αυτήν την ενέργεια εμφανίζεται ένα αντικείμενο στο παράθυρο Ιεραρχία ΦΩΤΟΓΡΑΦΙΚΗ ΜΗΧΑΝΗ

Βήμα 3:Αντιστοιχίζουμε το σενάριο που δημιουργήσαμε στο πρώτο βήμα στο αντικείμενο Camera. Για να το κάνετε αυτό, βρείτε το σενάριό σας στο παράθυρο Project, το δικό μου ονομάζεται Menu και σύρετέ το στο παράθυρο Hierarchy στο αντικείμενο Camera.
Για να βεβαιωθείτε ότι η κίνηση είναι σωστή, πρέπει: Κάντε κλικ στο αντικείμενο Κάμερα στο παράθυρο Ιεραρχία. Στο παράθυρο Inspector, θα δείτε το ακόλουθο αντικείμενο στο αντικείμενο:

Αν δείτε μια γραμμή τονισμένη στην εικόνα με το όνομα του σεναρίου σας, τότε τα κάνατε όλα σωστά.

Βήμα 4:Ας ανοίξουμε το σενάριο στο πρόγραμμα επεξεργασίας. Για να το κάνετε αυτό, κάντε διπλό κλικ στο σενάριο σας στο παράθυρο Project. Θα ανοίξει ένα πρόγραμμα επεξεργασίας σεναρίων, στην περίπτωσή μου είναι το MonoDevelop. Αφού ανοίξετε το πρόγραμμα επεξεργασίας, θα εμφανιστεί μπροστά σας ένα σενάριο, το οποίο θα είναι εντελώς κενό, αλλά με βασικό περιεχόμενο:

200?"200px":""+(this.scrollHeight+5)+"px");">
χρησιμοποιώντας UnityEngine?
χρησιμοποιώντας System.Collections;
δημόσια τάξη Μενού 1: Μονοσυμπεριφορά (
// Χρησιμοποιήστε το για προετοιμασία
void Start() (
}
void Update() (
}
}


Γραμμή

200?"200px":""+(this.scrollHeight+5)+"px");">δημόσια τάξη [u]Μενού : MonoBehaviour (

Αντί για λόγια Μενούθα περιέχει το όνομα του σεναρίου σας. Δεν χρειάζεται να αγγίξετε ή να αλλάξετε τη γραμμή. Τουλάχιστον σε αυτό το μάθημα.

Βήμα 5:Ας επεξεργαστούμε το σενάριο κάτω από το μενού για να το κάνουμε αυτό, μπορείτε να αφαιρέσετε μερικές γραμμές που δεν θα χρειαστείτε σε αυτό το μάθημα:

200?"200px":""+(this.scrollHeight+5)+"px");">
// Χρησιμοποιήστε αυτό για προετοιμασία - δεν χρειαζόμαστε αυτό το σχόλιο

// Η ενημέρωση καλείται μία φορά ανά καρέ
void Update() (
) - δεν χρειαζόμαστε ούτε τη μέθοδο Void

Βήμα 6:Το σενάριό μας είναι έτοιμο να δημιουργήσει ένα μενού παιχνιδιού σε αυτό.
Πριν από τη μέθοδο κενό ΈναρξηΑς δημιουργήσουμε μια μεταβλητή για την αρίθμηση των παραθύρων στο μενού του παιχνιδιού.
Τα περιεχόμενα της γραμμής είναι:

200?"200px":""+(this.scrollHeight+5)+"px");">δημόσιο παράθυρο int;


δημόσιος ενθ- ορίστε την αριθμητική τιμή της μεταβλητής
παράθυρο- όνομα της μεταβλητής που θα χρησιμοποιηθεί στο σενάριο με μια αριθμητική τιμή

Βήμα 6:Για να λειτουργεί σωστά το μενού, όταν ξεκινά το σενάριο, πρέπει να εμφανίσουμε ένα περιεχόμενο, για αυτό το σκοπό στη μέθοδο κενό Έναρξηπροσθέστε την αρχική τιμή της μεταβλητής παράθυρο. Ολόκληρη η μέθοδος θα μοιάζει με αυτό:

200?"200px":""+(this.scrollHeight+5)+"px");">
void Start() (
παράθυρο = 1;
}

Όταν η δέσμη ενεργειών αρχίσει να εκτελείται, η μέθοδος θα εκχωρήσει την τιμή 1 στη μεταβλητή του παραθύρου

[b]Βήμα 7:
Ας αρχίσουμε να εργαζόμαστε με την έξοδο του μενού GUI, για αυτό θα δημιουργήσουμε μια μέθοδο void Start κάτω από τη μέθοδο εξόδου GUI. Θα μοιάζει με αυτό:

200?"200px":""+(this.scrollHeight+5)+"px");">
void OnGUI() (
}

Αυτή η μέθοδος στο πρόγραμμα Unity3D και στην εφαρμογή σας που δημιουργείται θα προκαλέσει την έξοδο γραφικών στοιχείων.

Βήμα 8:Για να εμφανίζεται το μενού στο κέντρο της οθόνης και να μην χρειάζεται να υπολογίσουμε τη θέση για κάθε κουμπί, θα δημιουργήσουμε μια ομάδα που θα εμφανίζει τα περιεχόμενά του στο κέντρο της οθόνης:

200?"200px":""+(this.scrollHeight+5)+"px");">
GUI.EndGroup();

GUI.BeginGroup- δημιουργία ομάδας
(νέο Rect- ορίστε την τιμή που θα δοθούν περαιτέρω δεδομένα σχετικά με την τοποθεσία της ίδιας της ομάδας
(Screen.width / 2 - 100,- ορίστε τη θέση της ομάδας σε σχέση με το πλάτος της οθόνης
Screen.height / 2 - 100,- ορίστε τη θέση της ομάδας σε σχέση με το ύψος της οθόνης
200 - ορίστε το πλάτος της ομάδας
200 - ορίστε το ύψος της ομάδας

Μπορείτε να ορίσετε τις δικές σας τιμές για το πλάτος και το ύψος, αλλά έτσι ώστε τα πάντα να είναι σωστά κεντραρισμένα Screen.width / 2 - 100, Screen.height / 2 - 100Αντικαθιστούμε την τιμή 100 με την τιμή μας. Δηλαδή, εάν η ομάδα σας έχει πλάτος και ύψος 300, τότε αντί για 100 θα πρέπει να εισαγάγετε το μισό πλάτος των 300. Η τιμή που εισαγάγατε θα είναι 150.

Βήμα 9:Δημιουργούμε μια έξοδο μενού εάν η μεταβλητή του παραθύρου = 1. Για να γίνει αυτό, μεταξύ της αρχής και του τέλους της ομάδας που δημιουργήθηκε στο βήμα Νο. 8, δηλαδή

200?"200px":""+(this.scrollHeight+5)+"px");">
GUI.BeginGroup(new Rect(Screen.width / 2 - 100, Screen.height / 2 - 100, 200, 200));
Εδώ!!!
GUI.EndGroup();


Ας γράψουμε την τιμή εξόδου όταν παράθυρο = 1:

200?"200px":""+(this.scrollHeight+5)+"px");">
if(παράθυρο == 1)
{
if(GUI.Button (νέο Rect (10,30,180,30), "Play"))
{
παράθυρο = 2;
}
if(GUI.Button (νέο Rect (10,70,180,30), "Ρυθμίσεις"))
{
παράθυρο = 3;
}
if(GUI.Button (νέο Rect (10,110,180,30), "About the Game"))
{
παράθυρο = 4;
}
if(GUI.Button (νέο Rect (10,150,180,30), "Έξοδος"))
{
παράθυρο = 5;
}
}

if(παράθυρο == 1)- εάν τα windows είναι ίσα με την τιμή 1, τότε θα δημιουργήσουμε μια έξοδο
if(GUI.Button (νέο Rect (10,30,180,30), "Play"))- δημιουργήστε ένα κουμπί "Αναπαραγωγή".
(παράθυρο = 2;)- εάν πατηθεί το κουμπί "Αναπαραγωγή", τότε το παράθυρο θα λάβει την τιμή 2
Τα υπόλοιπα κουμπιά είναι ίδια.

Βήμα 10:Δημιουργήστε έξοδο εάν η μεταβλητή παραθύρου είναι 2

200?"200px":""+(this.scrollHeight+5)+"px");">
if(παράθυρο == 2)
{

{
Application.LoadLevel(1);
}
{
Application.LoadLevel(2);
}
{
Application.LoadLevel(3);
}
{
παράθυρο = 1;
}
}

Εμφανίζουμε τα κουμπιά που είναι διαθέσιμα όταν κάνετε κλικ στο κουμπί "Αναπαραγωγή". Η έξοδος δεν διαφέρει από τα προηγούμενα κουμπιά, θα αποκρυπτογραφήσω μόνο τις νέες λειτουργίες:
Debug.Log("Επίπεδο 1 φορτώθηκε"); -
Application.LoadLevel(1);- καλέστε μια συνάρτηση που φορτώνει το επίπεδο του παιχνιδιού. 1 - μπορεί να αλλάξει στο επίπεδο που χρειάζεστε. Μπορείτε να πάρετε μια αριθμητική τιμή πατώντας το συνδυασμό πλήκτρων Ctrl + Shift + B.

Βήμα 11:Παράγετε έξοδο εάν το παράθυρο είναι 3:

200?"200px":""+(this.scrollHeight+5)+"px");">
if(παράθυρο == 3)
{

{
}
{
}
{
}
if(GUI.Button (νέο Rect (10,160,180,30), "Πίσω"))
{
παράθυρο = 1;
}
}


Αυτό το βήμα δεν χρησιμοποιεί νέες συναρτήσεις, επομένως απλώς τις προσθέτουμε. Τα παρακάτω μαθήματα θα περιγράψουν τον τρόπο δημιουργίας λειτουργιών για τη διαμόρφωση του παιχνιδιού.

Βήμα 12:Εμφανίστε τα περιεχόμενα εάν η τιμή είναι το παράθυρο 4

200?"200px":""+(this.scrollHeight+5)+"px");">
if(παράθυρο == 4)
{

{
παράθυρο = 1;
}
}

Βήμα 13:Εμφανίστε τα περιεχόμενα εάν η μεταβλητή παραθύρου έχει οριστεί στο 5 και πατηθεί το κουμπί "Έξοδος".

200?"200px":""+(this.scrollHeight+5)+"px");">
if(παράθυρο == 5)
{

{
Application.Quit();
}
{
παράθυρο = 1;
}
}


Σε αυτήν την έξοδο των νέων συναρτήσεων, μόνο αυτό:
Application.Quit();- αυτή η λειτουργία απενεργοποιεί την εφαρμογή όταν πατήσετε το κουμπί "Ναι".
ΥΣΤΕΡΟΓΡΑΦΟ. Η συνάρτηση δεν λειτουργεί στον επεξεργαστή Unity3D, λειτουργεί μόνο στο μεταγλωττισμένο έργο.

Το σενάριο είναι έτοιμο, αλλά αν τα κάνατε όλα βήμα-βήμα, τότε θα έχετε το μενού που εμφανιζόταν στην εικόνα στην αρχή.

Αν (παράθυρο == 2)
{
GUI.Label(new Rect(50, 10, 180, 30), "Select level");
if(GUI.Button (νέο Rect (10,40,180,30), "Επίπεδο 1"))
{
Debug.Log("Επίπεδο 1 φορτώθηκε");
Application.LoadLevel(1);
}
if(GUI.Button (νέο Rect (10,80,180,30), "Επίπεδο 2"))
{
Debug.Log("Επίπεδο 2 φορτώθηκε");
Application.LoadLevel(2);
}
if(GUI.Button (νέο Rect (10,120,180,30), "Επίπεδο 3"))
{
Debug.Log("Επίπεδο 3 φορτώθηκε");
Application.LoadLevel(3);
}
if(GUI.Button (νέο Rect (10,160,180,30), "Πίσω"))
{
παράθυρο = 1;
}
}

Αν (παράθυρο == 3)
{
GUI.Label(new Rect(50, 10, 180, 30), "Game Settings");
if(GUI.Button (νέο Rect (10,40,180,30), "Game"))
{
}
if(GUI.Button (νέο Rect (10,80,180,30), "Ήχος"))
{
}
if(GUI.Button (νέο Rect (10,120,180,30), "Βίντεο"))
{
}
if(GUI.Button (νέο Rect (10,160,180,30), "Πίσω"))
{
παράθυρο = 1;
}
}

Αν (παράθυρο == 4)
{
GUI.Label(new Rect(50, 10, 180, 30), "About the Game");
GUI.Label(new Rect(10, 40, 180, 40), "Information about the developer and the game");
if(GUI.Button (νέο Rect (10,90,180,30), "Πίσω"))
{
παράθυρο = 1;
}
}

Αν (παράθυρο == 5)
{
GUI.Label(new Rect(50, 10, 180, 30), "Θα φύγεις ακόμα;");
if(GUI.Button (νέο Rect (10,40,180,30), "Ναι"))
{
Application.Quit();
}
if(GUI.Button (νέο Rect (10,80,180,30), "Όχι"))
{
παράθυρο = 1;
}
}
GUI.EndGroup();
}
}


Προς το παρόν αυτό είναι το πρώτο μάθημα, στο μέλλον θα υπάρξουν ένα δύο ακόμη που θα σας διδάξουν πώς να φτιάξετε ένα πλήρως λειτουργικό μενού

Ιδανικό για γρήγορη δημιουργία πρωτοτύπων παιχνιδιών. Εάν έχετε μια ιδέα για κάποιο νέο μηχανικό παιχνιδιών, με το Unity μπορείτε να το εφαρμόσετε και να το δοκιμάσετε στο συντομότερο δυνατό χρόνο. Κάτω από την περικοπή θα σας πω πώς μπορείτε να φτιάξετε ένα απλό παζλ χρησιμοποιώντας μόνο τυπικά στοιχεία και χωρίς να μπείτε σε επεξεργαστές γραφικών. Θα δείξω μερικά κόλπα σχεδιασμού παιχνιδιών σε όλο το άρθρο και στο τέλος θα μιλήσω λίγο για την αισθητική, τη δυναμική και τη μηχανική.

Για τους πιο ανυπόμονους, οι παρακάτω σύνδεσμοι περιέχουν ένα ολοκληρωμένο πρωτότυπο.
Online έκδοση
Μεταγλωττισμένη έκδοση για Windows [Mirror] ~7,5 MB

Τι θα κάνουμε; Ένα δισδιάστατο παζλ με κεντρικό χαρακτήρα ένα kolobok που μπορεί να μετακινήσει κουτιά, που μπορεί να πατήσει κουμπιά, να ανοίξει πόρτες, πίσω από το οποίο είναι η έξοδος από το επίπεδο που έχτισα. Ή εσείς, τελικά έχουμε ένα σεμινάριο εδώ.

Υποτίθεται ότι έχετε ήδη κατεβάσει το Unity και παίξατε λίγο με τον επεξεργαστή. Οχι; Τώρα είναι η ώρα, θα περιμένω.

Πρόχειρο σκίτσο

Είπα ψέματα, δεν θα περιμένω. Ας δημιουργήσουμε ένα κενό έργο χωρίς περιττά πακέτα και ας επιλέξουμε μια διάταξη παραθύρου που ταιριάζει στο γούστο σας, θα χρησιμοποιήσω το Tall. Προσθέστε μια σφαίρα στην ιεραρχία και σύρετε την κύρια κάμερα πάνω της. Τώρα η κάμερα θα ακολουθεί τη σφαίρα μας αν θέλει ξαφνικά να κάνει μια βόλτα. Μετονομάζουμε τη σφαίρα σε "Παίκτης", τη σύρουμε στο Project, τώρα έχουμε ένα προκατασκευασμένο που μπορούμε να χρησιμοποιήσουμε σε οποιεσδήποτε νέες σκηνές, αν υπάρχουν. Μην ξεχάσετε να ελέγξετε τις συντεταγμένες των προκατασκευασμένων κατά τη δημιουργία και τη χρήση τους, εάν θέλουμε να φτιάξουμε ένα παιχνίδι σε δύο διαστάσεις, τότε ο τρίτος άξονας θα πρέπει να μηδενιστεί για όλα τα αντικείμενα που αλληλεπιδρούν.

Τώρα ας προσθέσουμε μια πηγή φωτός, πηγαίνουμε στο μενού GameObject -> Create Other -> Directional light. Οι συντεταγμένες του δεν έχουν σημασία, θα φωτίσει τα αντικείμενά μας με τον ίδιο τρόπο από οποιαδήποτε τοποθεσία. Ωστόσο, είναι λογικό να το σηκώσετε λίγο πάνω από τη σκηνή, ώστε να μην παρεμβαίνει στην επιλογή αντικειμένων, οπότε ας του δώσουμε συντεταγμένες (0;0;-10). Μιλώντας για τη σκηνή, ο άξονας Χ θα μεγαλώσει από αριστερά προς τα δεξιά, το Y - από κάτω προς τα πάνω και το Z - από τον θεατή βαθιά στην οθόνη. Κάντε κλικ στα βέλη γύρω από τον κύβο στην επάνω δεξιά γωνία της σκηνής και περιστρέψτε τον όπως χρειάζεται.

Ας προσθέσουμε έναν κύβο στη σκηνή, ας τον ονομάσουμε "Τοίχος" και σύρουμε τον στα Στοιχεία. Ένας μοναχικός κυβικός τοίχος δίπλα σε ένα σφαιρικό kolobok δεν είναι πολύ εντυπωσιακός, σωστά; Τρία πεδία κλίμακας στον επιθεωρητή θα μας επιτρέψουν να εξωθήσουμε τον τοίχο και ο συνδυασμός πλήκτρων Ctrl+D θα δημιουργήσει ένα αντίγραφό του. Το Unity έχει πολλά άλλα χρήσιμα πλήκτρα πρόσβασης, για παράδειγμα, κρατώντας το Ctrl περιορίζει την κίνηση των αντικειμένων σε μεμονωμένα διαστήματα και το πλήκτρο V θα σας επιτρέψει να σύρετε ένα αντικείμενο από τις κορυφές του και θα κολλήσουν στις κορυφές άλλων αντικειμένων. Υπέροχο, έτσι δεν είναι; Και γράφεις ακόμα τον κινητήρα σου; Ω καλά.

Επινοήστε κάτι που μοιάζει με δωμάτιο, αποθηκεύστε τη σκηνή, πατήστε Play και θαυμάστε τη δημιουργία σας για μερικά λεπτά. Οι καλοί σχεδιαστές παιχνιδιών αποκαλούν αυτό το τεστ. Κάτι λείπει, σωστά; Χμμ. Ίσως αν το θαυμάζω λίγο περισσότερο, τότε...

Σενάρια και φυσική

Χρειαζόμαστε περισσότερη κίνηση και χρώμα! Αν και, αν η σκληρή παιδική σας ηλικία ήταν γεμάτη με τσιμεντένια παιχνίδια, τότε μπορείτε να τα αφήσετε όλα όπως είναι. Για όλους τους άλλους, ήρθε η ώρα του σεναρίου. Θα δώσω παραδείγματα σε C#, αλλά μπορείτε επίσης να γράψετε σε JS ή Boo. Στην πραγματικότητα, δεν έχει νόημα να επιλέξετε τα δύο τελευταία που προστέθηκαν στο Unity περισσότερο ως πρόσθετο, υποστηρίζονται λιγότερο, είναι λιγότερο επεκτάσιμα και είναι πιο δύσκολο να βρεθούν παραδείγματα. Ιδιαίτερα τρομερό είναι το Boo, το οποίο είναι ουσιαστικά unpython Python. Μια αηδία. Vivat, Πυθωνιστές!

Δημιουργούμε ένα σενάριο C#, το ονομάζουμε «PlayerController», το σύρουμε στο προκατασκευασμένο πρόγραμμα αναπαραγωγής και το ανοίγουμε χρησιμοποιώντας τον αγαπημένο σας επεξεργαστή χρησιμοποιώντας το Visual Studio. Πρώτα πρέπει να σκουπίσετε τα υπερβολικά υπολείμματα, αφήνοντας μόνο ό,τι χρειάζεστε.

Χρήση UnityEngine. public class PlayerController: MonoBehaviour ( void Update() ( ) )
Η συνάρτηση Update καλείται σε κάθε πλαίσιο, η οποία είναι πολύ βολική για την υλοποίηση της κίνησης, θα τοποθετήσουμε τον κώδικα μέσα σε αυτό. Τα πατήματα κουμπιών του προγράμματος αναπαραγωγής μπορούν να ληφθούν χρησιμοποιώντας την κλάση Input. Το Unity συνοδεύεται από υπέροχες ρυθμίσεις εισαγωγής, απλώς γράψτε Input.GetAxis ("Οριζόντια") και γνωρίζουμε ήδη αν ο παίκτης πάτησε το δεξί ή το αριστερό βέλος στο πληκτρολόγιο. Εάν ο παίκτης έχει συνδεδεμένο ένα gamepad, τότε μπορεί να το ελέγξει από αυτό, δεν χρειάζεται καν να γράψουμε επιπλέον κώδικα.


Με αυτή την απλή γραμμή λαμβάνουμε πληροφορίες για τις ενέργειες του χρήστη και δημιουργούμε ένα διάνυσμα κίνησης. Για να συνδέσουμε το διάνυσμα κάπου, χρειαζόμαστε ένα Άκαμπτο σώμα. Επιλέξτε το προκατασκευασμένο πρόγραμμα αναπαραγωγής και προσθέστε το απαιτούμενο στοιχείο μέσω του μενού Component -> Physics -> Rigidbody. Τώρα μπορούμε να το αναφέρουμε στο σενάριό μας.

Rigidbody.AddForce(direction);
Η συνάρτηση AddForce έχει πολλές ενδιαφέρουσες επιλογές για την εφαρμογή δύναμης, αλλά για αρχή, οι προεπιλεγμένες τιμές θα αρκούν.

Ετοιμος! Αποθήκευση, κάντε κλικ στην Αναπαραγωγή, δοκιμή.

Χμ, ξέρετε, αυτό μου θύμισε εκείνη τη στιγμή από την ταινία Inception, όπου ο άντρας γούρλωνε με μανία τα μάτια του και γυρνούσε το κεφάλι πάνω από τα τακούνια, είτε στον τοίχο είτε στο ταβάνι. Μάλλον έτσι ένιωθε.

Πρέπει να απαγορεύσουμε την περιστροφή και την κίνηση κατά μήκος του άξονα Z Επιλέξτε το προκατασκευασμένο, κοιτάξτε το στοιχείο Rigidbody και δείτε την ενότητα Περιορισμοί. Αφήνουμε μη τσεκαρισμένα μόνο τα δύο πρώτα πλαίσια ελέγχου X και Y και ενεργοποιούμε τα υπόλοιπα τέσσερα. Λίγο ψηλότερα, καταργήστε την επιλογή του πλαισίου ελέγχου Χρήση βαρύτητας και ορίστε το Drag ίσο με τέσσερα (στην ενότητα για την αισθητική, θα σας πω γιατί έγινε αυτό). Ας δοκιμάσουμε ξανά.

Κινείται και δεν στριφογυρίζει! Ζήτω! Αλλά το κάνει πολύ αργά. Ας προσθέσουμε μια μεταβλητή στο σενάριό μας και ας τη χρησιμοποιήσουμε στον τύπο κίνησης. Όλος ο κώδικας θα καταλήξει να μοιάζει με αυτό:

Χρήση UnityEngine. δημόσιας κλάσης PlayerController: MonoBehaviour ( δημόσια επιτάχυνση int; void Update() ( var direction = new Vector3(Input.GetAxis("Οριζόντια"), Input.GetAxis("Vertical"), 0); rigidbody.AddForce(direction * acceleration) ) )
Παρατηρήσατε πώς εμφανίστηκε ένα νέο πεδίο Επιτάχυνσης στον επιθεωρητή για το σενάριο μας; Αποτελεσματικό, σωστά; Εισάγουμε τριάντα ή οτιδήποτε της επιλογής σας στο πεδίο και το ελέγχουμε εν ενεργεία.

Υλικά και συγκρουόμενοι

Ήρθε η ώρα να φτιάξετε κάποιο κουμπί ώστε να υπάρχει κάτι να πατήσετε. Αντιγράψτε το προκατασκευασμένο Wall και μετονομάστε το σε "Button". Στον επιθεωρητή του επιταχυντή, επιλέξτε το πλαίσιο Is Trigger. Αυτό θα απουλοποιήσει το κουμπί μας και θα κάνει άλλα αντικείμενα να περάσουν μέσα από αυτό. Δημιουργούμε ένα σενάριο "Button" και το επισυνάπτουμε στο κουμπί.

Τα trigger colliders έχουν συμβάντα OnTriggerEnter και OnTriggerExit που ενεργοποιούνται κάθε φορά που κάτι διασχίζει την περιοχή ενεργοποίησης. Στην πραγματικότητα, αυτό δεν είναι απολύτως αλήθεια, επειδή υπάρχουν πολλά διαφορετικά αντικείμενα και η μηχανή φυσικής δεν επεξεργάζεται όλες τις συγκρούσεις, διαβάστε περισσότερα.

Αρχικά, ας ελέγξουμε πώς λειτουργούν οι σκανδαλισμοί. Ας γράψουμε κάτι στην κονσόλα Unity. Η λειτουργία Debug.Log είναι πολύ χρήσιμη εκτός από κείμενο, μπορεί επίσης να εκτυπώσει διάφορα αντικείμενα παιχνιδιού.

Χρήση UnityEngine. Κουμπί δημόσιας τάξης: MonoBehaviour ( void OnTriggerEnter(Collider other) ( Debug.Log("Hello"); ) void OnTriggerExit(Collider other) ( Debug.Log("Habr!"); ))
Πέταξαν ένα κουμπί στη σκηνή. Το έχεις δοκιμάσει; Προχώρα. Θα ήταν πιο ξεκάθαρο αν το κουμπί μας άλλαζε χρώμα όταν το πατούσαμε. Για χρώμα, πρέπει να κολλήσουμε ένα υλικό στο κουμπί. Δημιουργία -> Υλικό, ας το ονομάσουμε "Button Mat" και ας το βάλουμε στο κουμπί. Στις ιδιότητες υλικού, επιλέξτε πράσινο για το Κύριο χρώμα. Τώρα στο σενάριο μπορούμε να έχουμε πρόσβαση στο χρώμα του υλικού χρησιμοποιώντας το renderer.material.color και να το αλλάξουμε όπως θέλουμε. Ας κάνουμε το κουμπί να γίνει κόκκινο όταν μπει το kolobok μας. Κάπως έτσι πέτυχε.

Χρήση UnityEngine. Κουμπί δημόσιας τάξης: MonoBehaviour ( void OnTriggerEnter(Collider other) ( renderer.material.color = new Color(1, 0, 0); ) void OnTriggerExit(Collider other) ( renderer.material.color = new Color(0, 1, 0) )
Η κλάση Color μπορεί επίσης να δεχτεί ένα άλφα εκτός από το τριπλό RGB, αλλά έχουμε ένα κανονικό διάχυτο shader, επομένως δεν είναι σημαντικό για εμάς. Ας δοκιμάσουμε!

Αν δεν το έχετε κάνει ακόμα, τότε ήρθε η ώρα να τακτοποιήσετε το έργο μας, διαφορετικά θα χαθούμε σε ένα συνονθύλευμα προκατασκευασμένων και σεναρίων. Για παράδειγμα, ας δημιουργήσουμε έναν φάκελο "Επίπεδα" για την αποθήκευση σκηνών, "Προκατασκευές" για την αποθήκευση κενών, "Υλικά" για υλικά και "Σενάρια" για σενάρια και, στη συνέχεια, ταξινομούμε τον συσσωρευμένο πλούτο σε φακέλους.

Ξέρετε, το κουμπί μας εξακολουθεί να μην μοιάζει με κουμπί! Ας το ισιώνουμε και το αναγκάζουμε να πατήσει κάτω από το τσουρέκι. Επιλέξτε ένα κουμπί στην ιεραρχία, κάντε το πάχος 0,3 μονάδων και τοποθετήστε το στο πάτωμα, δηλαδή ορίστε τη συντεταγμένη Z στο 0,35. Βλέπετε τρία βολικά κουμπιά "Επιλογή", "Επαναφορά" και "Εφαρμογή" στον επιθεωρητή στο επάνω μέρος; Χρησιμοποιώντας τα, μπορείτε να αλληλεπιδράσετε με το προκατασκευασμένο επί τόπου. Κάντε κλικ στην επιλογή Εφαρμογή και όλα τα κουμπιά θα είναι πλέον επίπεδα και ξαπλωμένα.

Για να εφαρμόσουμε κινούμενα σχέδια λογισμικού, θα χρησιμοποιήσουμε την κλάση Transform. Έχει μια ιδιότητα localPosition που θα μας επιτρέψει να μετακινήσουμε το κουμπί:

Transform.localPosition += new Vector3(0, 0, 0.3f);
Αυτός ο κωδικός θα κάνει κλικ στο κουμπί. Σε γενικές γραμμές μοιάζει με αυτό:

Χρήση UnityEngine. δημόσια τάξη Κουμπί: MonoBehaviour ( void OnTriggerEnter(Collider other) ( transform.localPosition += new Vector3(0, 0, 0.3f); renderer.material.color = new Color(1, 0, 0); ) void OnTriggerExit(Collider άλλο) ( transform.localPosition -= new Vector3(0, 0, 0.3f); renderer.material.color = new Color(0, 1, 0); ) )
Δοκιμασμένο. Πατώντας το κουμπί το αναγκάζει να ταλαντεύεται αρκετά βίαια λόγω του σφαιρικού επιταχυντή του kolobok, ο οποίος δεν θα είναι πάντα σε επαφή με το χωνευτό κουμπί. Πώς να το λύσετε αυτό; Θυμόμαστε ότι τα παιχνίδια αποτελούνται κατά το ήμισυ από ψέματα, πράγμα που σημαίνει ότι οι διαστάσεις του επιταχυντή δεν πρέπει απαραίτητα να συμπίπτουν με το μοντέλο. Εξετάζουμε τις ιδιότητες του επιταχυντή στον επιθεωρητή, τετραπλασιάζουμε το μέγεθός του κατά μήκος του άξονα Z και τον μετατοπίζουμε κατά -1,5 προς την ίδια κατεύθυνση. Ας δοκιμάσουμε! Είναι πολύ καλύτερα έτσι.

Πόρτες, συρτάρια και μαγνήτες

Τώρα που έχουμε ένα πλήρως λειτουργικό κουμπί, μπορούμε να το κάνουμε να κάνει κάτι. Ας κλωνοποιήσουμε την προκατασκευή του τοίχου, ας την ονομάσουμε «Πόρτα», δημιουργήσουμε ένα κόκκινο υλικό «Χαλάκι πόρτας», το κρεμάμε όπου το χρειαζόμαστε και ας πετάξουμε τη φρεσκοψημένη πόρτα στη σκηνή. Για να επηρεάσουμε με κάποιο τρόπο την πόρτα, πρέπει να έχουμε έναν σύνδεσμο προς το αντικείμενό της, οπότε θα δημιουργήσουμε μια νέα μεταβλητή για το κουμπί.

Δημόσια πόρτα GameObject.
Το GameObject είναι μια κλάση στην οποία όλα, όλα, όλα τα αντικείμενα στη σκηνή είναι τυλιγμένα, πράγμα που σημαίνει ότι όλα έχουν τη λειτουργία SetActive, η οποία αντιπροσωπεύεται στον επιθεωρητή με ένα σημάδι επιλογής στην επάνω αριστερή γωνία. Εάν εξακολουθείτε να χρησιμοποιείτε την έκδοση Unity 3, τότε θα πρέπει να χρησιμοποιήσετε εναλλακτικές. Χρησιμοποιώντας την ιδιότητα δραστηριότητα, μπορείτε να αποκρύψετε αντικείμενα χωρίς να τα διαγράψετε. Φαίνονται να εξαφανίζονται από τη σκηνή και οι συγκρουόμενοι τους παύουν να συμμετέχουν στους υπολογισμούς. Ό,τι χρειάζεστε για την πόρτα. Φέρνουμε τον κώδικα στην παρακάτω φόρμα:

Χρήση UnityEngine. δημόσια τάξη Κουμπί: MonoBehaviour ( δημόσια πόρτα GameObject; void OnTriggerEnter(Collider other) ( door.SetActive(false); transform.localPosition += new Vector3(0, 0, 0.3f); renderer.material.color = new Color(1 , 0, 0 ) void OnTriggerExit(Collider other) ( door.SetActive(true); transform.localPosition -= new Vector3(0, 0, 0.3f); renderer.material.color = new Color(0, 1, 0) )
Επιλέξτε το κουμπί στη σκηνή, σύρετε την πόρτα από την ιεραρχία στο πεδίο που εμφανίζεται στις ιδιότητες του σεναρίου κουμπιού. Ας ελέγξουμε τον κώδικα σε δράση.

Πατώντας το kolobok στο κουμπί διαλύεται αυτόματα η πόρτα και την επιστρέφει στη θέση της μετά την έξοδο. Τι ωφελεί όμως ένα κουμπί που σβήνει συνεχώς και κλειδώνει την πόρτα μας; Ήρθε η ώρα για κουτιά! Αντιγράφουμε το προκατασκευασμένο τοίχο, το ονομάζουμε "Box", προσθέτουμε ένα Rigidbody σε αυτό, μην ξεχνάμε να κάνουμε τις ίδιες λειτουργίες όπως με το Player και μετά το πετάμε στη σκηνή.

Όπως ίσως έχετε παρατηρήσει, το σπρώξιμο του κουτιού δεν είναι πολύ βολικό. Επιπλέον, αν κολλήσει στη γωνία του δωματίου, θα είναι αδύνατο να το βγάλετε. Εναλλακτικά, μπορούμε να φτιάξουμε ζώνες τηλεμεταφοράς στις γωνίες του δωματίου, οι οποίες θα μετακινούν όλα τα κουτιά που πέφτουν σε αυτές, αλλά αυτό είναι λίγο δύσκολο. Ας προσθέσουμε έναν μαγνήτη στο PlayerController που θα προσελκύει όλα τα κοντινά κουτιά. Η συνάρτηση Input.GetButton, σε αντίθεση με την Input.GetButtonDown, θα επιστρέψει true όσο πατηθεί το κουμπί που ζητήθηκε. Αυτό ακριβώς που χρειαζόμαστε.

If (Input.GetButton("Jump"))
Πώς θα βρούμε τα κουτιά; Υπάρχουν πολλές επιλογές, για παράδειγμα, μπορούμε να επισυνάψουμε έναν άλλο επιταχυντή στο πρόγραμμα αναπαραγωγής και να καταχωρήσουμε το OnTriggerEnter ή το OnTriggerStay, αλλά στη συνέχεια θα χρειαστεί να λύσουμε το πρόβλημα της έγκαιρης απόκρισης της σκανδάλης κουμπιού Θυμάστε αυτόν τον σύνδεσμο προς τη μήτρα Εξάλλου, ο μαγνήτης πρέπει να λειτουργεί μόνο όταν πατηθεί το κουμπί, τον υπόλοιπο χρόνο δεν χρειάζεται, επομένως, θα ελέγξουμε χειροκίνητα για συγκρούσεις χρησιμοποιώντας το Transform.position θα μας δώσει τις συντεταγμένες του κέντρου του kolobok.

Var big = Physics.OverlapSphere(transform.position, 2.1f);
Ας ψάξουμε για αντικείμενα που πρακτικά αγγίζουν το kolobok.

Var small = Physics.OverlapSphere(transform.position, 0.6f);
Οι δύο σφαίρες που θα προκύψουν θα καταγράψουν όλα τα αντικείμενα, συμπεριλαμβανομένων των τοίχων και των κουμπιών. Για να εξαλείψουμε τα περιττά, θα χρησιμοποιήσουμε ετικέτες, θα μας φανούν χρήσιμες περισσότερες από μία φορές. Μεταβείτε στο Επεξεργασία -> Ρυθμίσεις έργου -> Ετικέτες και δημιουργήστε ετικέτες για όλες τις περιπτώσεις: "Κουτί", "Τοίχος", "Κουμπί", "Πόρτα". Ο "Παίκτης" είναι ήδη εκεί. Επιλέξτε προκατασκευές και σημειώστε τις χρησιμοποιώντας την αναπτυσσόμενη λίστα στο επάνω μέρος του επιθεωρητή. Τώρα μπορούμε να ξεχωρίσουμε τα κουτιά που χρειαζόμαστε:

Foreach (var body σε μεγάλο) if (System.Array.IndexOf(small, body) == -1 && body.tag == "Box") body.rigidbody.AddForce((transform.position - body.transform.position) * 20);
Βρήκαμε ένα αντικείμενο σε μια μεγάλη σφαίρα, ελέγξαμε την παρουσία του σε μια μικρή σφαίρα, ελέγξαμε το σημάδι και το μετακινήσαμε προς τον εαυτό μας. Λίγα μαθηματικά με διανύσματα, τίποτα περίπλοκο για όσους δεν παρέλειψαν το σχολείο.

Το κουτί μας πιέζει ακόμα λίγο, ας μην ανησυχούμε για αυτό τώρα, εξακολουθεί να μην παρεμβαίνει στην κίνηση.

Οι προσεκτικοί αναγνώστες έχουν από καιρό παρατηρήσει ένα σφάλμα κουμπιού. Οι προσεκτικοί και επιμελείς άνθρωποι το έχουν ήδη φτιάξει. Τι είδους bug είναι αυτό;

Εάν δύο αντικείμενα πέσουν στο πεδίο του επιταχυντή και, στη συνέχεια, ένα αντικείμενο συνεχίσει τη δουλειά του, τότε ενεργοποιείται μια περιττή απενεργοποίηση του κουμπιού. Τι να κάνω; Πρέπει να μετρήσουμε τον αριθμό των kolobok και των κουτιών στην περιοχή του επιταχυντή και να απενεργοποιήσουμε το κουμπί όταν δεν υπάρχει κανένας κοντά και να το ενεργοποιήσουμε όταν υπάρχει οποιοσδήποτε αριθμός και των δύο. Δυστυχώς, το Unity δεν διαθέτει λίστα με τρέχουσες συναντήσεις. Είναι κρίμα. Ίσως οι προγραμματιστές να μην το έχουν καταφέρει ακόμα. Σε κάθε περίπτωση, αυτό μπορεί να λυθεί με μερικές γραμμές κώδικα. Μπορούμε να φτιάξουμε τη δική μας λίστα και να προσθέσουμε όλα τα εισερχόμενα αντικείμενα σε αυτήν, να αφαιρέσουμε όλα τα εξερχόμενα αντικείμενα και να αλλάξουμε την κατάσταση του κουμπιού στο Update.

Κακή επιλογή

χρησιμοποιώντας UnityEngine? χρησιμοποιώντας System.Collections.Generic; δημόσια τάξη Κουμπί: MonoBehaviour ( δημόσια πόρτα GameObject; δημόσιο bool pressed = false; ιδιωτική λίστα colliders = νέα λίστα () void Update() ( if (colliders.Count > 0 && !pressed) ( door.SetActive(false); transform.localPosition += new Vector3(0, 0, 0.3f); renderer.material.color = new Color(1 , 0, 0 πατημένο = true ) other if (Colliders.Count == 0 && pressed) ( door.SetActive(true); transform.localPosition -= new Vector3(0, 0, 0.3f); renderer.material; .color = new Color(0, 1, 0) ) void OnTriggerEnter(Collider other) ( colliders.Add(other); ) void OnTriggerExit(Collider other) (Collider) )


πρότεινε τη χρήση μετρητή αντί για λίστα. Αυτή η μέθοδος είναι σίγουρα πιο κομψή, αλλά αφήνω τον παλιό κώδικα παραπάνω ως παράδειγμα για το πώς να μην το κάνετε.

Χρήση UnityEngine. δημόσια κλάση Κουμπί: MonoBehaviour ( δημόσια θύρα GameObject; ιδιωτικό int colliderCount = 0; void OnTriggerEnter(Collider other) ( if (colliderCount == 0) ( door.SetActive(false); transform.localPosition += new Vector3(0, 0, 0.3f; renderer.material.color = new Color(1, 0, 0), void OnTriggerExit(ColliderCount--; if (colliderCount == 0) (door.SetActive(true); localPosition -= new Vector3(0, 0, 0.3f renderer.material.color = new Color(0, 1, 0));

Σκηνές, σωματίδια και σκίαστρες

Έχουμε έναν χαρακτήρα παιχνιδιού, τοίχους, ένα κουμπί και μια πόρτα, αλλά τίποτα δεν κρύβεται πίσω από αυτό. Ήρθε η ώρα να μετακινηθείτε μεταξύ των επιπέδων.

Αντιγράψτε το προκατασκευασμένο τοίχο, μετονομάστε το σε "Finish", αλλάξτε την ετικέτα με το ίδιο όνομα, μετατρέψτε το collider σε σκανδάλη. Ας δημιουργήσουμε ένα υλικό «Finish Mat» με σαγηνευτικό μπλε χρώμα και ας το κρεμάσουμε στο φινίρισμα.

Όλη η οικογένεια να μαζευτεί. Αλλά κατά κάποιο τρόπο δεν είναι πολύ φιλόξενο και μοιάζει πάρα πολύ με τοίχο. Και στην πόρτα. Και στον κύβο. Οι Shaders έρχονται στη διάσωση! Τώρα χρησιμοποιούμε κανονικό ματ διάχυτο σκίαστρο για όλα τα υλικά. Στις ιδιότητες υλικού, επιλέξτε Διαφανές/Specular για το φινίρισμα. Αυτό το shader θα λάβει υπόψη το άλφα του χρώματος και θα τονίσει το δεύτερο χρώμα που καθορίζουμε. Ας βάλουμε το άλφα του μπλε στο μισό και ας κάνουμε την αντανάκλαση λευκή. Δοκιμάζουμε.

Ενώ το φινίρισμα δεν φαίνεται πολύ διαφανές, πρέπει να υπονοήσετε με κάποιο τρόπο ότι είναι αιθέριο. Για να γίνει αυτό, θα προσθέσουμε ένα σύστημα σωματιδίων στο φινίρισμα που θα επιπλέει μέσα και θα προσελκύει τον παίκτη. Component -> Effects -> Particle System. Εάν επιλέξετε να τελειώσετε στη σκηνή, μπορείτε να παρακολουθήσετε την προσομοίωση για να διευκολύνετε τη δημιουργία του επιθυμητού εφέ. Πρώτα απ 'όλα, ας τσεκάρουμε το πλαίσιο Prewarm, τότε τα σωματίδια θα εμφανιστούν στο παιχνίδι εκ των προτέρων και θα συνεχίσουν την απλή ζωή τους και δεν θα εμφανίζονται μπροστά στα μάτια του παίκτη. Start Lifetime ανά μονάδα. Ας κάνουμε το Start Speed ​​μικρότερο, για παράδειγμα 0,1. Μέγεθος έναρξης 0.1. Ας βάλουμε το χρώμα στο μπλε. Στην καρτέλα Εκπομπές, αλλάξτε το Rate σε διακόσια. Στην καρτέλα Shape, ορίστε το Shape σε Box, αυτό θα προκαλέσει την εμφάνιση σωματιδίων σε ολόκληρο τον όγκο του φινιρίσματος. Στη συνέχεια, ελέγξτε το πλαίσιο ελέγχου Random Direction, έτσι ώστε τα σωματίδια να πετούν προς διαφορετικές κατευθύνσεις. Ενεργοποιήστε την καρτέλα Size over Lifetime, επιλέξτε κάποια αύξουσα γραμμή εκεί. Στην καρτέλα Randerer, αλλάξτε την τυπική λειτουργία Renderer σε Mesh. Αλλαγή Mesh σε σφαίρα. Ετοιμος! Πολλές και πολλές μικρές φυσαλίδες εμφανίζονται και εξαφανίζονται και το φινίρισμα φαίνεται τώρα πολύ πιο διασκεδαστικό.

Το μόνο που μένει είναι να κάνουμε το τελείωμα να μεταφέρει τον παίκτη στο επόμενο επίπεδο. Το Unity έχει πολλές χρήσιμες λειτουργίες και μεταβλητές για τη διαχείριση σκηνών. Το Application.loadedLevel θα μας δείξει το τρέχον επίπεδο, το Application.levelCount θα δείξει τον αριθμό τους και το Application.LoadLevel θα φορτώσει το επιθυμητό. Επιπλέον, πρέπει να καθορίσουμε στις Ρυθμίσεις δόμησης όλες τις σκηνές στις οποίες θέλουμε να μεταβούμε. Ας δημιουργήσουμε ένα νέο σενάριο "Τέλος", το κρεμάμε στο προκατασκευασμένο και γράψουμε τα εξής μέσα:

Χρήση UnityEngine. δημόσια κλάση Finish: MonoBehaviour ( void OnTriggerEnter(Collider other) ( if (other.tag == "Player") if (Application.loadedLevel + 1 != Application.levelCount) Application.LoadLevel(Application.loadedLevel + 1); αλλιώς Εφαρμογή .LoadLevel(0);
Ελέγχουμε ότι ο παίκτης έχει φτάσει στη γραμμή τερματισμού και μετά περνάμε στο επόμενο ή στο πρώτο επίπεδο. Ας δοκιμάσουμε το νέο μας φινίρισμα με πλήρη χαρακτηριστικά.

Αισθητική, δυναμική και μηχανική

Εδώ το πρωτότυπο μας είναι έτοιμο. Μπορούμε τώρα να πατήσουμε κουμπιά, να ανοίξουμε πόρτες και να μετακινηθούμε από επίπεδο σε επίπεδο. Αν θέλουμε μόνο να δοκιμάσουμε νέους μηχανικούς, τότε αυτό είναι αρκετό. Αλλά αν θέλουμε να φτιάξουμε ένα πρωτότυπο παιχνιδιού, τότε πρέπει να σκεφτούμε την αισθητική και τη δυναμική. Μπορεί να μην έχετε ακούσει πολύ συχνά αυτούς τους όρους να εφαρμόζονται στα παιχνίδια. Εν ολίγοις, η μηχανική είναι κάποιο είδος αλληλεπίδρασης του χρήστη με τον κόσμο του παιχνιδιού. Το κουμπί που μπορεί να πατήσει ο χρήστης για να ανοίξει την πόρτα είναι ένας μηχανικός. Τα κουτιά που μπορούν επίσης να πατήσουν κουμπιά είναι ένα άλλο. Οι μηχανικοί αλληλεπιδρούν μεταξύ τους και δημιουργούν τη δυναμική του παιχνιδιού. Ο παίκτης βρήκε το κουτί, το έσυρε στο κουμπί, άνοιξε την πόρτα και πήγε σε άλλο επίπεδο. Η αισθητική είναι η αίσθηση του παιχνιδιού. Έχετε νιώσει ποτέ ότι πραγματικά πατούσατε τη σκανδάλη σε ένα παιχνίδι σκοποβολής; Ευχάριστη ανάκρουση, κινούμενα σχέδια, ήχος - όλα αυτά επηρεάζουν την αισθητική της λήψης. Η αισθητική ενός παιχνιδιού στο σύνολό του επηρεάζεται από πολλούς παράγοντες, από την ταχύτητα φόρτωσης μέχρι την ιστορία. Η προσεκτική δουλειά πάνω στην αισθητική είναι αυτό που διαχωρίζει τα παιχνίδια που πετάμε από τα παιχνίδια που μένουν στη μνήμη.

Ας δούμε τη δημιουργία μας. Ο πιο συχνά χρησιμοποιούμενος μηχανικός είναι η κίνηση. Ας ρίξουμε μια πιο προσεκτική ματιά για να δούμε αν είναι καλά. Ας ανοίξουμε τον κωδικό.

Var direction = new Vector3(Input.GetAxis("Οριζόντια"), Input.GetAxis("Vertical"), 0);
Αν κοιτάξετε προσεκτικά, μπορείτε να δείτε ότι κατά μήκος των διαγωνίων το διάνυσμά μας είναι μεγαλύτερο, πράγμα που σημαίνει ότι η ασκούμενη δύναμη είναι μεγαλύτερη. Μπορεί να διορθωθεί αυτό;

Ιδανικό για γρήγορη δημιουργία πρωτοτύπων παιχνιδιών. Εάν έχετε μια ιδέα για κάποιο νέο μηχανικό παιχνιδιών, με το Unity μπορείτε να το εφαρμόσετε και να το δοκιμάσετε στο συντομότερο δυνατό χρόνο. Κάτω από την περικοπή θα σας πω πώς μπορείτε να φτιάξετε ένα απλό παζλ χρησιμοποιώντας μόνο τυπικά στοιχεία και χωρίς να μπείτε σε επεξεργαστές γραφικών. Θα δείξω μερικά κόλπα σχεδιασμού παιχνιδιών σε όλο το άρθρο και στο τέλος θα μιλήσω λίγο για την αισθητική, τη δυναμική και τη μηχανική.

Για τους πιο ανυπόμονους, οι παρακάτω σύνδεσμοι περιέχουν ένα ολοκληρωμένο πρωτότυπο.
Online έκδοση
Μεταγλωττισμένη έκδοση για Windows [Mirror] ~7,5 MB

Τι θα κάνουμε; Ένα δισδιάστατο παζλ με κεντρικό χαρακτήρα ένα kolobok που μπορεί να μετακινήσει κουτιά, που μπορεί να πατήσει κουμπιά, να ανοίξει πόρτες, πίσω από το οποίο είναι η έξοδος από το επίπεδο που έχτισα. Ή εσείς, τελικά έχουμε ένα σεμινάριο εδώ.

Υποτίθεται ότι έχετε ήδη κατεβάσει το Unity και παίξατε λίγο με τον επεξεργαστή. Οχι; Τώρα είναι η ώρα, θα περιμένω.

Πρόχειρο σκίτσο

Είπα ψέματα, δεν θα περιμένω. Ας δημιουργήσουμε ένα κενό έργο χωρίς περιττά πακέτα και ας επιλέξουμε μια διάταξη παραθύρου που ταιριάζει στο γούστο σας, θα χρησιμοποιήσω το Tall. Προσθέστε μια σφαίρα στην ιεραρχία και σύρετε την κύρια κάμερα πάνω της. Τώρα η κάμερα θα ακολουθεί τη σφαίρα μας αν θέλει ξαφνικά να κάνει μια βόλτα. Μετονομάζουμε τη σφαίρα σε "Παίκτης", τη σύρουμε στο Project, τώρα έχουμε ένα προκατασκευασμένο που μπορούμε να χρησιμοποιήσουμε σε οποιεσδήποτε νέες σκηνές, αν υπάρχουν. Μην ξεχάσετε να ελέγξετε τις συντεταγμένες των προκατασκευασμένων κατά τη δημιουργία και τη χρήση τους, εάν θέλουμε να φτιάξουμε ένα παιχνίδι σε δύο διαστάσεις, τότε ο τρίτος άξονας θα πρέπει να μηδενιστεί για όλα τα αντικείμενα που αλληλεπιδρούν.

Τώρα ας προσθέσουμε μια πηγή φωτός, πηγαίνουμε στο μενού GameObject -> Create Other -> Directional light. Οι συντεταγμένες του δεν έχουν σημασία, θα φωτίσει τα αντικείμενά μας με τον ίδιο τρόπο από οποιαδήποτε τοποθεσία. Ωστόσο, είναι λογικό να το σηκώσετε λίγο πάνω από τη σκηνή, ώστε να μην παρεμβαίνει στην επιλογή αντικειμένων, οπότε ας του δώσουμε συντεταγμένες (0;0;-10). Μιλώντας για τη σκηνή, ο άξονας Χ θα μεγαλώσει από αριστερά προς τα δεξιά, το Y - από κάτω προς τα πάνω και το Z - από τον θεατή βαθιά στην οθόνη. Κάντε κλικ στα βέλη γύρω από τον κύβο στην επάνω δεξιά γωνία της σκηνής και περιστρέψτε τον όπως χρειάζεται.

Ας προσθέσουμε έναν κύβο στη σκηνή, ας τον ονομάσουμε "Τοίχος" και σύρουμε τον στα Στοιχεία. Ένας μοναχικός κυβικός τοίχος δίπλα σε ένα σφαιρικό kolobok δεν είναι πολύ εντυπωσιακός, σωστά; Τρία πεδία κλίμακας στον επιθεωρητή θα μας επιτρέψουν να εξωθήσουμε τον τοίχο και ο συνδυασμός πλήκτρων Ctrl+D θα δημιουργήσει ένα αντίγραφό του. Το Unity έχει πολλά άλλα χρήσιμα πλήκτρα πρόσβασης, για παράδειγμα, κρατώντας το Ctrl περιορίζει την κίνηση των αντικειμένων σε μεμονωμένα διαστήματα και το πλήκτρο V θα σας επιτρέψει να σύρετε ένα αντικείμενο από τις κορυφές του και θα κολλήσουν στις κορυφές άλλων αντικειμένων. Υπέροχο, έτσι δεν είναι; Και γράφεις ακόμα τον κινητήρα σου; Ω καλά.

Επινοήστε κάτι που μοιάζει με δωμάτιο, αποθηκεύστε τη σκηνή, πατήστε Play και θαυμάστε τη δημιουργία σας για μερικά λεπτά. Οι καλοί σχεδιαστές παιχνιδιών αποκαλούν αυτό το τεστ. Κάτι λείπει, σωστά; Χμμ. Ίσως αν το θαυμάζω λίγο περισσότερο, τότε...

Σενάρια και φυσική

Χρειαζόμαστε περισσότερη κίνηση και χρώμα! Αν και, αν η σκληρή παιδική σας ηλικία ήταν γεμάτη με τσιμεντένια παιχνίδια, τότε μπορείτε να τα αφήσετε όλα όπως είναι. Για όλους τους άλλους, ήρθε η ώρα του σεναρίου. Θα δώσω παραδείγματα σε C#, αλλά μπορείτε επίσης να γράψετε σε JS ή Boo. Στην πραγματικότητα, δεν έχει νόημα να επιλέξετε τα δύο τελευταία που προστέθηκαν στο Unity περισσότερο ως πρόσθετο, υποστηρίζονται λιγότερο, είναι λιγότερο επεκτάσιμα και είναι πιο δύσκολο να βρεθούν παραδείγματα. Ιδιαίτερα τρομερό είναι το Boo, το οποίο είναι ουσιαστικά unpython Python. Μια αηδία. Vivat, Πυθωνιστές!

Δημιουργούμε ένα σενάριο C#, το ονομάζουμε «PlayerController», το σύρουμε στο προκατασκευασμένο πρόγραμμα αναπαραγωγής και το ανοίγουμε χρησιμοποιώντας τον αγαπημένο σας επεξεργαστή χρησιμοποιώντας το Visual Studio. Πρώτα πρέπει να σκουπίσετε τα υπερβολικά υπολείμματα, αφήνοντας μόνο ό,τι χρειάζεστε.

Χρήση UnityEngine. public class PlayerController: MonoBehaviour ( void Update() ( ) )
Η συνάρτηση Update καλείται σε κάθε πλαίσιο, η οποία είναι πολύ βολική για την υλοποίηση της κίνησης, θα τοποθετήσουμε τον κώδικα μέσα σε αυτό. Τα πατήματα κουμπιών του προγράμματος αναπαραγωγής μπορούν να ληφθούν χρησιμοποιώντας την κλάση Input. Το Unity συνοδεύεται από υπέροχες ρυθμίσεις εισαγωγής, απλώς γράψτε Input.GetAxis ("Οριζόντια") και γνωρίζουμε ήδη αν ο παίκτης πάτησε το δεξί ή το αριστερό βέλος στο πληκτρολόγιο. Εάν ο παίκτης έχει συνδεδεμένο ένα gamepad, τότε μπορεί να το ελέγξει από αυτό, δεν χρειάζεται καν να γράψουμε επιπλέον κώδικα.


Με αυτή την απλή γραμμή λαμβάνουμε πληροφορίες για τις ενέργειες του χρήστη και δημιουργούμε ένα διάνυσμα κίνησης. Για να συνδέσουμε το διάνυσμα κάπου, χρειαζόμαστε ένα Άκαμπτο σώμα. Επιλέξτε το προκατασκευασμένο πρόγραμμα αναπαραγωγής και προσθέστε το απαιτούμενο στοιχείο μέσω του μενού Component -> Physics -> Rigidbody. Τώρα μπορούμε να το αναφέρουμε στο σενάριό μας.

Rigidbody.AddForce(direction);
Η συνάρτηση AddForce έχει πολλές ενδιαφέρουσες επιλογές για την εφαρμογή δύναμης, αλλά για αρχή, οι προεπιλεγμένες τιμές θα αρκούν.

Ετοιμος! Αποθήκευση, κάντε κλικ στην Αναπαραγωγή, δοκιμή.

Χμ, ξέρετε, αυτό μου θύμισε εκείνη τη στιγμή από την ταινία Inception, όπου ο άντρας γούρλωνε με μανία τα μάτια του και γυρνούσε το κεφάλι πάνω από τα τακούνια, είτε στον τοίχο είτε στο ταβάνι. Μάλλον έτσι ένιωθε.

Πρέπει να απαγορεύσουμε την περιστροφή και την κίνηση κατά μήκος του άξονα Z Επιλέξτε το προκατασκευασμένο, κοιτάξτε το στοιχείο Rigidbody και δείτε την ενότητα Περιορισμοί. Αφήνουμε μη τσεκαρισμένα μόνο τα δύο πρώτα πλαίσια ελέγχου X και Y και ενεργοποιούμε τα υπόλοιπα τέσσερα. Λίγο ψηλότερα, καταργήστε την επιλογή του πλαισίου ελέγχου Χρήση βαρύτητας και ορίστε το Drag ίσο με τέσσερα (στην ενότητα για την αισθητική, θα σας πω γιατί έγινε αυτό). Ας δοκιμάσουμε ξανά.

Κινείται και δεν στριφογυρίζει! Ζήτω! Αλλά το κάνει πολύ αργά. Ας προσθέσουμε μια μεταβλητή στο σενάριό μας και ας τη χρησιμοποιήσουμε στον τύπο κίνησης. Όλος ο κώδικας θα καταλήξει να μοιάζει με αυτό:

Χρήση UnityEngine. δημόσιας κλάσης PlayerController: MonoBehaviour ( δημόσια επιτάχυνση int; void Update() ( var direction = new Vector3(Input.GetAxis("Οριζόντια"), Input.GetAxis("Vertical"), 0); rigidbody.AddForce(direction * acceleration) ) )
Παρατηρήσατε πώς εμφανίστηκε ένα νέο πεδίο Επιτάχυνσης στον επιθεωρητή για το σενάριο μας; Αποτελεσματικό, σωστά; Εισάγουμε τριάντα ή οτιδήποτε της επιλογής σας στο πεδίο και το ελέγχουμε εν ενεργεία.

Υλικά και συγκρουόμενοι

Ήρθε η ώρα να φτιάξετε κάποιο κουμπί ώστε να υπάρχει κάτι να πατήσετε. Αντιγράψτε το προκατασκευασμένο Wall και μετονομάστε το σε "Button". Στον επιθεωρητή του επιταχυντή, επιλέξτε το πλαίσιο Is Trigger. Αυτό θα απουλοποιήσει το κουμπί μας και θα κάνει άλλα αντικείμενα να περάσουν μέσα από αυτό. Δημιουργούμε ένα σενάριο "Button" και το επισυνάπτουμε στο κουμπί.

Τα trigger colliders έχουν συμβάντα OnTriggerEnter και OnTriggerExit που ενεργοποιούνται κάθε φορά που κάτι διασχίζει την περιοχή ενεργοποίησης. Στην πραγματικότητα, αυτό δεν είναι απολύτως αλήθεια, επειδή υπάρχουν πολλά διαφορετικά αντικείμενα και η μηχανή φυσικής δεν επεξεργάζεται όλες τις συγκρούσεις, διαβάστε περισσότερα.

Αρχικά, ας ελέγξουμε πώς λειτουργούν οι σκανδαλισμοί. Ας γράψουμε κάτι στην κονσόλα Unity. Η λειτουργία Debug.Log είναι πολύ χρήσιμη εκτός από κείμενο, μπορεί επίσης να εκτυπώσει διάφορα αντικείμενα παιχνιδιού.

Χρήση UnityEngine. Κουμπί δημόσιας τάξης: MonoBehaviour ( void OnTriggerEnter(Collider other) ( Debug.Log("Hello"); ) void OnTriggerExit(Collider other) ( Debug.Log("Habr!"); ))
Πέταξαν ένα κουμπί στη σκηνή. Το έχεις δοκιμάσει; Προχώρα. Θα ήταν πιο ξεκάθαρο αν το κουμπί μας άλλαζε χρώμα όταν το πατούσαμε. Για χρώμα, πρέπει να κολλήσουμε ένα υλικό στο κουμπί. Δημιουργία -> Υλικό, ας το ονομάσουμε "Button Mat" και ας το βάλουμε στο κουμπί. Στις ιδιότητες υλικού, επιλέξτε πράσινο για το Κύριο χρώμα. Τώρα στο σενάριο μπορούμε να έχουμε πρόσβαση στο χρώμα του υλικού χρησιμοποιώντας το renderer.material.color και να το αλλάξουμε όπως θέλουμε. Ας κάνουμε το κουμπί να γίνει κόκκινο όταν μπει το kolobok μας. Κάπως έτσι πέτυχε.

Χρήση UnityEngine. Κουμπί δημόσιας τάξης: MonoBehaviour ( void OnTriggerEnter(Collider other) ( renderer.material.color = new Color(1, 0, 0); ) void OnTriggerExit(Collider other) ( renderer.material.color = new Color(0, 1, 0) )
Η κλάση Color μπορεί επίσης να δεχτεί ένα άλφα εκτός από το τριπλό RGB, αλλά έχουμε ένα κανονικό διάχυτο shader, επομένως δεν είναι σημαντικό για εμάς. Ας δοκιμάσουμε!

Αν δεν το έχετε κάνει ακόμα, τότε ήρθε η ώρα να τακτοποιήσετε το έργο μας, διαφορετικά θα χαθούμε σε ένα συνονθύλευμα προκατασκευασμένων και σεναρίων. Για παράδειγμα, ας δημιουργήσουμε έναν φάκελο "Επίπεδα" για την αποθήκευση σκηνών, "Προκατασκευές" για την αποθήκευση κενών, "Υλικά" για υλικά και "Σενάρια" για σενάρια και, στη συνέχεια, ταξινομούμε τον συσσωρευμένο πλούτο σε φακέλους.

Ξέρετε, το κουμπί μας εξακολουθεί να μην μοιάζει με κουμπί! Ας το ισιώνουμε και το αναγκάζουμε να πατήσει κάτω από το τσουρέκι. Επιλέξτε ένα κουμπί στην ιεραρχία, κάντε το πάχος 0,3 μονάδων και τοποθετήστε το στο πάτωμα, δηλαδή ορίστε τη συντεταγμένη Z στο 0,35. Βλέπετε τρία βολικά κουμπιά "Επιλογή", "Επαναφορά" και "Εφαρμογή" στον επιθεωρητή στο επάνω μέρος; Χρησιμοποιώντας τα, μπορείτε να αλληλεπιδράσετε με το προκατασκευασμένο επί τόπου. Κάντε κλικ στην επιλογή Εφαρμογή και όλα τα κουμπιά θα είναι πλέον επίπεδα και ξαπλωμένα.

Για να εφαρμόσουμε κινούμενα σχέδια λογισμικού, θα χρησιμοποιήσουμε την κλάση Transform. Έχει μια ιδιότητα localPosition που θα μας επιτρέψει να μετακινήσουμε το κουμπί:

Transform.localPosition += new Vector3(0, 0, 0.3f);
Αυτός ο κωδικός θα κάνει κλικ στο κουμπί. Σε γενικές γραμμές μοιάζει με αυτό:

Χρήση UnityEngine. δημόσια τάξη Κουμπί: MonoBehaviour ( void OnTriggerEnter(Collider other) ( transform.localPosition += new Vector3(0, 0, 0.3f); renderer.material.color = new Color(1, 0, 0); ) void OnTriggerExit(Collider άλλο) ( transform.localPosition -= new Vector3(0, 0, 0.3f); renderer.material.color = new Color(0, 1, 0); ) )
Δοκιμασμένο. Πατώντας το κουμπί το αναγκάζει να ταλαντεύεται αρκετά βίαια λόγω του σφαιρικού επιταχυντή του kolobok, ο οποίος δεν θα είναι πάντα σε επαφή με το χωνευτό κουμπί. Πώς να το λύσετε αυτό; Θυμόμαστε ότι τα παιχνίδια αποτελούνται κατά το ήμισυ από ψέματα, πράγμα που σημαίνει ότι οι διαστάσεις του επιταχυντή δεν πρέπει απαραίτητα να συμπίπτουν με το μοντέλο. Εξετάζουμε τις ιδιότητες του επιταχυντή στον επιθεωρητή, τετραπλασιάζουμε το μέγεθός του κατά μήκος του άξονα Z και τον μετατοπίζουμε κατά -1,5 προς την ίδια κατεύθυνση. Ας δοκιμάσουμε! Είναι πολύ καλύτερα έτσι.

Πόρτες, συρτάρια και μαγνήτες

Τώρα που έχουμε ένα πλήρως λειτουργικό κουμπί, μπορούμε να το κάνουμε να κάνει κάτι. Ας κλωνοποιήσουμε την προκατασκευή του τοίχου, ας την ονομάσουμε «Πόρτα», δημιουργήσουμε ένα κόκκινο υλικό «Χαλάκι πόρτας», το κρεμάμε όπου το χρειαζόμαστε και ας πετάξουμε τη φρεσκοψημένη πόρτα στη σκηνή. Για να επηρεάσουμε με κάποιο τρόπο την πόρτα, πρέπει να έχουμε έναν σύνδεσμο προς το αντικείμενό της, οπότε θα δημιουργήσουμε μια νέα μεταβλητή για το κουμπί.

Δημόσια πόρτα GameObject.
Το GameObject είναι μια κλάση στην οποία όλα, όλα, όλα τα αντικείμενα στη σκηνή είναι τυλιγμένα, πράγμα που σημαίνει ότι όλα έχουν τη λειτουργία SetActive, η οποία αντιπροσωπεύεται στον επιθεωρητή με ένα σημάδι επιλογής στην επάνω αριστερή γωνία. Εάν εξακολουθείτε να χρησιμοποιείτε την έκδοση Unity 3, τότε θα πρέπει να χρησιμοποιήσετε εναλλακτικές. Χρησιμοποιώντας την ιδιότητα δραστηριότητα, μπορείτε να αποκρύψετε αντικείμενα χωρίς να τα διαγράψετε. Φαίνονται να εξαφανίζονται από τη σκηνή και οι συγκρουόμενοι τους παύουν να συμμετέχουν στους υπολογισμούς. Ό,τι χρειάζεστε για την πόρτα. Φέρνουμε τον κώδικα στην παρακάτω φόρμα:

Χρήση UnityEngine. δημόσια τάξη Κουμπί: MonoBehaviour ( δημόσια πόρτα GameObject; void OnTriggerEnter(Collider other) ( door.SetActive(false); transform.localPosition += new Vector3(0, 0, 0.3f); renderer.material.color = new Color(1 , 0, 0 ) void OnTriggerExit(Collider other) ( door.SetActive(true); transform.localPosition -= new Vector3(0, 0, 0.3f); renderer.material.color = new Color(0, 1, 0) )
Επιλέξτε το κουμπί στη σκηνή, σύρετε την πόρτα από την ιεραρχία στο πεδίο που εμφανίζεται στις ιδιότητες του σεναρίου κουμπιού. Ας ελέγξουμε τον κώδικα σε δράση.

Πατώντας το kolobok στο κουμπί διαλύεται αυτόματα η πόρτα και την επιστρέφει στη θέση της μετά την έξοδο. Τι ωφελεί όμως ένα κουμπί που σβήνει συνεχώς και κλειδώνει την πόρτα μας; Ήρθε η ώρα για κουτιά! Αντιγράφουμε το προκατασκευασμένο τοίχο, το ονομάζουμε "Box", προσθέτουμε ένα Rigidbody σε αυτό, μην ξεχνάμε να κάνουμε τις ίδιες λειτουργίες όπως με το Player και μετά το πετάμε στη σκηνή.

Όπως ίσως έχετε παρατηρήσει, το σπρώξιμο του κουτιού δεν είναι πολύ βολικό. Επιπλέον, αν κολλήσει στη γωνία του δωματίου, θα είναι αδύνατο να το βγάλετε. Εναλλακτικά, μπορούμε να φτιάξουμε ζώνες τηλεμεταφοράς στις γωνίες του δωματίου, οι οποίες θα μετακινούν όλα τα κουτιά που πέφτουν σε αυτές, αλλά αυτό είναι λίγο δύσκολο. Ας προσθέσουμε έναν μαγνήτη στο PlayerController που θα προσελκύει όλα τα κοντινά κουτιά. Η συνάρτηση Input.GetButton, σε αντίθεση με την Input.GetButtonDown, θα επιστρέψει true όσο πατηθεί το κουμπί που ζητήθηκε. Αυτό ακριβώς που χρειαζόμαστε.

If (Input.GetButton("Jump"))
Πώς θα βρούμε τα κουτιά; Υπάρχουν πολλές επιλογές, για παράδειγμα, μπορούμε να επισυνάψουμε έναν άλλο επιταχυντή στο πρόγραμμα αναπαραγωγής και να καταχωρήσουμε το OnTriggerEnter ή το OnTriggerStay, αλλά στη συνέχεια θα χρειαστεί να λύσουμε το πρόβλημα της έγκαιρης απόκρισης της σκανδάλης κουμπιού Θυμάστε αυτόν τον σύνδεσμο προς τη μήτρα Εξάλλου, ο μαγνήτης πρέπει να λειτουργεί μόνο όταν πατηθεί το κουμπί, τον υπόλοιπο χρόνο δεν χρειάζεται, επομένως, θα ελέγξουμε χειροκίνητα για συγκρούσεις χρησιμοποιώντας το Transform.position θα μας δώσει τις συντεταγμένες του κέντρου του kolobok.

Var big = Physics.OverlapSphere(transform.position, 2.1f);
Ας ψάξουμε για αντικείμενα που πρακτικά αγγίζουν το kolobok.

Var small = Physics.OverlapSphere(transform.position, 0.6f);
Οι δύο σφαίρες που θα προκύψουν θα καταγράψουν όλα τα αντικείμενα, συμπεριλαμβανομένων των τοίχων και των κουμπιών. Για να εξαλείψουμε τα περιττά, θα χρησιμοποιήσουμε ετικέτες, θα μας φανούν χρήσιμες περισσότερες από μία φορές. Μεταβείτε στο Επεξεργασία -> Ρυθμίσεις έργου -> Ετικέτες και δημιουργήστε ετικέτες για όλες τις περιπτώσεις: "Κουτί", "Τοίχος", "Κουμπί", "Πόρτα". Ο "Παίκτης" είναι ήδη εκεί. Επιλέξτε προκατασκευές και σημειώστε τις χρησιμοποιώντας την αναπτυσσόμενη λίστα στο επάνω μέρος του επιθεωρητή. Τώρα μπορούμε να ξεχωρίσουμε τα κουτιά που χρειαζόμαστε:

Foreach (var body σε μεγάλο) if (System.Array.IndexOf(small, body) == -1 && body.tag == "Box") body.rigidbody.AddForce((transform.position - body.transform.position) * 20);
Βρήκαμε ένα αντικείμενο σε μια μεγάλη σφαίρα, ελέγξαμε την παρουσία του σε μια μικρή σφαίρα, ελέγξαμε το σημάδι και το μετακινήσαμε προς τον εαυτό μας. Λίγα μαθηματικά με διανύσματα, τίποτα περίπλοκο για όσους δεν παρέλειψαν το σχολείο.

Το κουτί μας πιέζει ακόμα λίγο, ας μην ανησυχούμε για αυτό τώρα, εξακολουθεί να μην παρεμβαίνει στην κίνηση.

Οι προσεκτικοί αναγνώστες έχουν από καιρό παρατηρήσει ένα σφάλμα κουμπιού. Οι προσεκτικοί και επιμελείς άνθρωποι το έχουν ήδη φτιάξει. Τι είδους bug είναι αυτό;

Εάν δύο αντικείμενα πέσουν στο πεδίο του επιταχυντή και, στη συνέχεια, ένα αντικείμενο συνεχίσει τη δουλειά του, τότε ενεργοποιείται μια περιττή απενεργοποίηση του κουμπιού. Τι να κάνω; Πρέπει να μετρήσουμε τον αριθμό των kolobok και των κουτιών στην περιοχή του επιταχυντή και να απενεργοποιήσουμε το κουμπί όταν δεν υπάρχει κανένας κοντά και να το ενεργοποιήσουμε όταν υπάρχει οποιοσδήποτε αριθμός και των δύο. Δυστυχώς, το Unity δεν διαθέτει λίστα με τρέχουσες συναντήσεις. Είναι κρίμα. Ίσως οι προγραμματιστές να μην το έχουν καταφέρει ακόμα. Σε κάθε περίπτωση, αυτό μπορεί να λυθεί με μερικές γραμμές κώδικα. Μπορούμε να φτιάξουμε τη δική μας λίστα και να προσθέσουμε όλα τα εισερχόμενα αντικείμενα σε αυτήν, να αφαιρέσουμε όλα τα εξερχόμενα αντικείμενα και να αλλάξουμε την κατάσταση του κουμπιού στο Update.

Κακή επιλογή

χρησιμοποιώντας UnityEngine? χρησιμοποιώντας System.Collections.Generic; δημόσια τάξη Κουμπί: MonoBehaviour ( δημόσια πόρτα GameObject; δημόσιο bool pressed = false; ιδιωτική λίστα colliders = νέα λίστα () void Update() ( if (colliders.Count > 0 && !pressed) ( door.SetActive(false); transform.localPosition += new Vector3(0, 0, 0.3f); renderer.material.color = new Color(1 , 0, 0 πατημένο = true ) other if (Colliders.Count == 0 && pressed) ( door.SetActive(true); transform.localPosition -= new Vector3(0, 0, 0.3f); renderer.material; .color = new Color(0, 1, 0) ) void OnTriggerEnter(Collider other) ( colliders.Add(other); ) void OnTriggerExit(Collider other) (Collider) )


Ο Lertmind πρότεινε τη χρήση μετρητή αντί για λίστα. Αυτή η μέθοδος είναι σίγουρα πιο κομψή, αλλά αφήνω τον παλιό κώδικα παραπάνω ως παράδειγμα για το πώς να μην το κάνετε.

Χρήση UnityEngine. δημόσια κλάση Κουμπί: MonoBehaviour ( δημόσια θύρα GameObject; ιδιωτικό int colliderCount = 0; void OnTriggerEnter(Collider other) ( if (colliderCount == 0) ( door.SetActive(false); transform.localPosition += new Vector3(0, 0, 0.3f; renderer.material.color = new Color(1, 0, 0), void OnTriggerExit(ColliderCount--; if (colliderCount == 0) (door.SetActive(true); localPosition -= new Vector3(0, 0, 0.3f renderer.material.color = new Color(0, 1, 0));

Σκηνές, σωματίδια και σκίαστρες

Έχουμε έναν χαρακτήρα παιχνιδιού, τοίχους, ένα κουμπί και μια πόρτα, αλλά τίποτα δεν κρύβεται πίσω από αυτό. Ήρθε η ώρα να μετακινηθείτε μεταξύ των επιπέδων.

Αντιγράψτε το προκατασκευασμένο τοίχο, μετονομάστε το σε "Finish", αλλάξτε την ετικέτα με το ίδιο όνομα, μετατρέψτε το collider σε σκανδάλη. Ας δημιουργήσουμε ένα υλικό «Finish Mat» με σαγηνευτικό μπλε χρώμα και ας το κρεμάσουμε στο φινίρισμα.

Όλη η οικογένεια να μαζευτεί. Αλλά κατά κάποιο τρόπο δεν είναι πολύ φιλόξενο και μοιάζει πάρα πολύ με τοίχο. Και στην πόρτα. Και στον κύβο. Οι Shaders έρχονται στη διάσωση! Τώρα χρησιμοποιούμε κανονικό ματ διάχυτο σκίαστρο για όλα τα υλικά. Στις ιδιότητες υλικού, επιλέξτε Διαφανές/Specular για το φινίρισμα. Αυτό το shader θα λάβει υπόψη το άλφα του χρώματος και θα τονίσει το δεύτερο χρώμα που καθορίζουμε. Ας βάλουμε το άλφα του μπλε στο μισό και ας κάνουμε την αντανάκλαση λευκή. Δοκιμάζουμε.

Ενώ το φινίρισμα δεν φαίνεται πολύ διαφανές, πρέπει να υπονοήσετε με κάποιο τρόπο ότι είναι αιθέριο. Για να γίνει αυτό, θα προσθέσουμε ένα σύστημα σωματιδίων στο φινίρισμα που θα επιπλέει μέσα και θα προσελκύει τον παίκτη. Component -> Effects -> Particle System. Εάν επιλέξετε να τελειώσετε στη σκηνή, μπορείτε να παρακολουθήσετε την προσομοίωση για να διευκολύνετε τη δημιουργία του επιθυμητού εφέ. Πρώτα απ 'όλα, ας τσεκάρουμε το πλαίσιο Prewarm, τότε τα σωματίδια θα εμφανιστούν στο παιχνίδι εκ των προτέρων και θα συνεχίσουν την απλή ζωή τους και δεν θα εμφανίζονται μπροστά στα μάτια του παίκτη. Start Lifetime ανά μονάδα. Ας κάνουμε το Start Speed ​​μικρότερο, για παράδειγμα 0,1. Μέγεθος έναρξης 0.1. Ας βάλουμε το χρώμα στο μπλε. Στην καρτέλα Εκπομπές, αλλάξτε το Rate σε διακόσια. Στην καρτέλα Shape, ορίστε το Shape σε Box, αυτό θα προκαλέσει την εμφάνιση σωματιδίων σε ολόκληρο τον όγκο του φινιρίσματος. Στη συνέχεια, ελέγξτε το πλαίσιο ελέγχου Random Direction, έτσι ώστε τα σωματίδια να πετούν προς διαφορετικές κατευθύνσεις. Ενεργοποιήστε την καρτέλα Size over Lifetime, επιλέξτε κάποια αύξουσα γραμμή εκεί. Στην καρτέλα Randerer, αλλάξτε την τυπική λειτουργία Renderer σε Mesh. Αλλαγή Mesh σε σφαίρα. Ετοιμος! Πολλές και πολλές μικρές φυσαλίδες εμφανίζονται και εξαφανίζονται και το φινίρισμα φαίνεται τώρα πολύ πιο διασκεδαστικό.

Το μόνο που μένει είναι να κάνουμε το τελείωμα να μεταφέρει τον παίκτη στο επόμενο επίπεδο. Το Unity έχει πολλές χρήσιμες λειτουργίες και μεταβλητές για τη διαχείριση σκηνών. Το Application.loadedLevel θα μας δείξει το τρέχον επίπεδο, το Application.levelCount θα δείξει τον αριθμό τους και το Application.LoadLevel θα φορτώσει το επιθυμητό. Επιπλέον, πρέπει να καθορίσουμε στις Ρυθμίσεις δόμησης όλες τις σκηνές στις οποίες θέλουμε να μεταβούμε. Ας δημιουργήσουμε ένα νέο σενάριο "Τέλος", το κρεμάμε στο προκατασκευασμένο και γράψουμε τα εξής μέσα:

Χρήση UnityEngine. δημόσια κλάση Finish: MonoBehaviour ( void OnTriggerEnter(Collider other) ( if (other.tag == "Player") if (Application.loadedLevel + 1 != Application.levelCount) Application.LoadLevel(Application.loadedLevel + 1); αλλιώς Εφαρμογή .LoadLevel(0);
Ελέγχουμε ότι ο παίκτης έχει φτάσει στη γραμμή τερματισμού και μετά περνάμε στο επόμενο ή στο πρώτο επίπεδο. Ας δοκιμάσουμε το νέο μας φινίρισμα με πλήρη χαρακτηριστικά.

Αισθητική, δυναμική και μηχανική

Εδώ το πρωτότυπο μας είναι έτοιμο. Μπορούμε τώρα να πατήσουμε κουμπιά, να ανοίξουμε πόρτες και να μετακινηθούμε από επίπεδο σε επίπεδο. Αν θέλουμε μόνο να δοκιμάσουμε νέους μηχανικούς, τότε αυτό είναι αρκετό. Αλλά αν θέλουμε να φτιάξουμε ένα πρωτότυπο παιχνιδιού, τότε πρέπει να σκεφτούμε την αισθητική και τη δυναμική. Μπορεί να μην έχετε ακούσει πολύ συχνά αυτούς τους όρους να εφαρμόζονται στα παιχνίδια. Εν ολίγοις, η μηχανική είναι κάποιο είδος αλληλεπίδρασης του χρήστη με τον κόσμο του παιχνιδιού. Το κουμπί που μπορεί να πατήσει ο χρήστης για να ανοίξει την πόρτα είναι ένας μηχανικός. Τα κουτιά που μπορούν επίσης να πατήσουν κουμπιά είναι ένα άλλο. Οι μηχανικοί αλληλεπιδρούν μεταξύ τους και δημιουργούν τη δυναμική του παιχνιδιού. Ο παίκτης βρήκε το κουτί, το έσυρε στο κουμπί, άνοιξε την πόρτα και πήγε σε άλλο επίπεδο. Η αισθητική είναι η αίσθηση του παιχνιδιού. Έχετε νιώσει ποτέ ότι πραγματικά πατούσατε τη σκανδάλη σε ένα παιχνίδι σκοποβολής; Ευχάριστη ανάκρουση, κινούμενα σχέδια, ήχος - όλα αυτά επηρεάζουν την αισθητική της λήψης. Η αισθητική ενός παιχνιδιού στο σύνολό του επηρεάζεται από πολλούς παράγοντες, από την ταχύτητα φόρτωσης μέχρι την ιστορία. Η προσεκτική δουλειά πάνω στην αισθητική είναι αυτό που διαχωρίζει τα παιχνίδια που πετάμε από τα παιχνίδια που μένουν στη μνήμη.

Ας δούμε τη δημιουργία μας. Ο πιο συχνά χρησιμοποιούμενος μηχανικός είναι η κίνηση. Ας ρίξουμε μια πιο προσεκτική ματιά για να δούμε αν είναι καλά. Ας ανοίξουμε τον κωδικό.

Var direction = new Vector3(Input.GetAxis("Οριζόντια"), Input.GetAxis("Vertical"), 0);
Αν κοιτάξετε προσεκτικά, μπορείτε να δείτε ότι κατά μήκος των διαγωνίων το διάνυσμά μας είναι μεγαλύτερο, πράγμα που σημαίνει ότι η ασκούμενη δύναμη είναι μεγαλύτερη. Μπορεί να διορθωθεί αυτό;

Στο σεμινάριο New GUI in Unity, μέρος 1, δημιουργήσατε μια σκηνή με ένα μενού δύο κουμπιών. Επιπλέον, μάθατε πώς να χρησιμοποιείτε εικόνες, κουμπιά, διεπαφές διαχείρισης κειμένου και έννοιες όπως άγκυρες και περιστροφές. Ωστόσο, η ίδια η σκηνή του μενού είναι αρκετά βασική και χρειάζεται βελτίωση.

Σε αυτό το σεμινάριο, θα διακοσμήσουμε τη σκηνή μας προσθέτοντας κινούμενα σχέδια, ένα παράθυρο διαλόγου επιλογών και μερικά στοιχεία ελέγχου, όπως ένα ρυθμιστικό και ένα διακόπτη. Εάν δεν έχετε έργο, κατεβάστε το από εδώ και ανοίξτε το MenuScene

Κινούμενα σχέδια κουμπιών

Ας προχωρήσουμε κατευθείαν στην εξάσκηση προσθέτοντας μερικά όμορφα κινούμενα σχέδια. Υπάρχουν διάφοροι λόγοι για αυτό. Πρώτα απ 'όλα, το animation είναι ωραίο! Δεύτερον, αυτό το έργο απλά δεν μπορεί να γίνει χωρίς αυτούς. Θα κάνουμε το κουμπί να μετακινηθεί εκτός σκηνής, ώστε να έχουμε χώρο να εμφανίσουμε το νέο πλαίσιο διαλόγου που θα δημιουργήσουμε αργότερα.

Ας ξεκινήσουμε τη δημιουργία του animation και του animator. Η κίνηση ενός κουμπιού δεν διαφέρει από την κίνηση οποιουδήποτε άλλου αντικειμένου Unity. Θα χρειαστεί να προσθέσετε ένα στοιχείο Animator, να δημιουργήσετε μερικές κινούμενες εικόνες και να ορίσετε καταστάσεις και μεταβάσεις μεταξύ τους. Να τι πρέπει να κάνουμε:



Εκτός από τη δημιουργία του ίδιου του animation, το Unity προσθέτει ευγενικά ένα στοιχείο animator στο btn_start και δημιουργεί έναν ελεγκτή animator.


Εάν δεν είστε εξοικειωμένοι με τα κινούμενα σχέδια και τους ελεγκτές του Animator Ενότητα, δείτε το σεμινάριο που ονομάζεται Sculpting a Jetpack Joyride Style Game στο Unity 2D.

Κινούμενη κίνηση ενός κουμπιού που απομακρύνεται από την οθόνη

Αν και στην πραγματικότητα χρειαζόμαστε δύο κινούμενα σχέδια τεχνικά- ένα κουμπί που μετακινείται έξω από τη σκηνή και ένα κουμπί που μετακινείται πίσω στη σκηνή - θα εξαπατήσουμε και θα δημιουργήσουμε μόνο ένα και στη συνέχεια θα το κάνουμε κύλιση προς τα πίσω.

Για να δημιουργήσετε μια διαφάνεια από μια κινούμενη εικόνα, ακολουθήστε τα εξής βήματα:

  1. Επιλέξτε btn_start στην Ιεραρχία
  2. Βεβαιωθείτε ότι εμφανίζεται η καρτέλα Προβολή κινούμενης εικόνας.
  3. Κάντε κλικ στο 1:00 στη γραμμή χρόνου και βεβαιωθείτε ότι η κινούμενη εικόνα εγγράφεται. Αυτό θα πρέπει να συμβεί αυτόματα.
  4. Αλλάξτε τα Anchors σε top-stretch.
  5. Αλλάξτε τη θέση Y σε 60 στο Inspector.
  6. Σταματήστε την εγγραφή πατώντας το κουμπί με τον κόκκινο κύκλο.

Σημείωση:Ο ευκολότερος τρόπος για να επιβεβαιώσετε ότι η εγγραφή έχει ξεκινήσει είναι να κοιτάξετε τα χειριστήρια αναπαραγωγής και να δείτε ότι γίνονται κόκκινα.

Δώστε προσοχή στα ακόλουθα δύο σημεία, που επισημαίνονται με γράμματα στο στιγμιότυπο οθόνης:

Α: Το βασικό καρέ ορίστηκε αυτόματα στο 0:00. Αυτή τη στιγμή, το κουμπί βρίσκεται στην αρχική του θέση, την ίδια που ρυθμίσατε στο προηγούμενο σεμινάριο.

B: Παρόλο που η οπτική εμφάνιση των αγκυρών δεν αλλάζει σε κόκκινο, μπορείτε να δείτε ότι οι αριθμητικές τιμές έχουν αλλάξει και έχουν γίνει κόκκινες, υποδεικνύοντας ότι έχετε επίσης κινήσει τις αγκυρώσεις.


Βεβαιωθείτε ότι τόσο το κινούμενο σχέδιο όσο και η ίδια η σκηνή είναι ορατά και πατήστε αναπαραγωγή. Θα πρέπει να δείτε κάτι σαν αυτό:


Προσέξατε το animation των άγκυρων; Αν όχι, τότε αυτό το ενοχλητικά κόκκινο βέλος που αναβοσβήνει μάλλον τράβηξε την προσοχή σας. Είναι κρίμα που η γραφιστική δεν είναι το φόρτε μου. Αν και, αν το σκεφτείς λίγο, όλα μπαίνουν στη θέση τους: η θέση του κουμπιού αντιστοιχεί στην απόσταση από τις άγκυρες. Στην περίπτωση του btn_start , αυτή ήταν η απόσταση από το κάτω περίγραμμα. Αυτή τη στιγμή εργάζεστε μόνο με κάθετη κίνηση, επομένως μόνο το κάτω όριο έχει σημασία. Για να βεβαιωθείτε ότι το κουμπί εκτείνεται εκτός οθόνης, μετακινήστε το προς τα πάνω μέχρι να εξαφανιστεί από την προβολή. Τι να κάνετε αν δεν γνωρίζετε το ύψος της οθόνης; Πώς μπορείτε να κάνετε ένα κουμπί να σταματήσει τη στιγμή που δεν μπορείτε πλέον να το δείτε; Απάντηση: αλλάζοντας τις άγκυρες του. Ρυθμίζοντας άγκυρες στο επάνω περίγραμμα της οθόνης, ορίζετε απλώς την απόσταση από αυτό το περίγραμμα. Με αυτόν τον τρόπο, το κουμπί θα βρίσκεται πάντα πάνω από την άκρη της οθόνης και δεν θα εξαρτάται από το ύψος του, αφού είναι τοποθετημένο σε σχέση με το πάνω άκρο της οθόνης.

Κινούμενη κίνηση ενός κουμπιού που εισέρχεται σε μια σκηνή

Καλή δουλειά! Έχετε ένα κουμπί που βγαίνει από την οθόνη και τώρα χρειαζόμαστε μια αντίστροφη κίνηση. Θα το χρησιμοποιήσετε σε δύο περιπτώσεις:

  1. Κατά τη φόρτωση μιας σκηνής, το κουμπί δεν πρέπει μόνο να εμφανίζεται, αλλά και να διαφανεί.
  2. Όταν κλείνετε το παράθυρο ρυθμίσεων, τα κουμπιά πρέπει να επιστρέψουν στην αρχική τους θέση

Είναι αρκετά εύκολο να γίνει. Αρχικά, θα πρέπει να απενεργοποιήσετε το animation looping, καθώς το κουμπί πρέπει να κινείται είτε προς τα πάνω είτε προς τα κάτω και να μην αναπηδά μπρος-πίσω σαν μπάλα του πινγκ-πονγκ. Για να απενεργοποιήσετε τον βρόχο, ανοίξτε το φάκελο Animations στο Project Browser και επιλέξτε το animation btn_start_slide_out και στο Inspector καταργήστε την επιλογή Loop Time.

Τώρα επιλέξτε btn_start στην Ιεραρχία και ανοίξτε την προβολή Animator (καρτέλα Animator). Κάντε δεξί κλικ στην κατάσταση btn_start_slide_out και επιλέξτε Αντιγραφή.


Κάντε δεξί κλικ οπουδήποτε μέσα στην καρτέλα Animator και επιλέξτε Επικόλληση για να αντιγράψετε την κατάσταση btn_start_slide_out.


Τώρα επιλέξτε αυτήν την διπλή κατάσταση, που πιθανότατα ονομάζεται btn_start_slide_out 0, και μετονομάστε την στο Inspector σε btn_start_slide_in. Επιπλέον, ορίστε την Ταχύτητα σε -1.

Στη συνέχεια, μέσα στην καρτέλα Animator, κάντε δεξί κλικ στο btn_start_slide_in και επιλέξτε Ορισμός ως προεπιλογή επειδή Χρειαζόμαστε τον κύκλο ζωής του κουμπιού για να ξεκινήσει με την εμφάνισή του στην οθόνη και όχι το αντίστροφο.



Τέλος, προσθέστε δύο μεταβάσεις κατάστασης. Για να το κάνετε αυτό, κάντε δεξί κλικ στην κατάσταση btn_start_slide_out και επιλέξτε Πραγματοποίηση μετάβασης. Στη συνέχεια, κάντε κλικ στο btn_start_slide_in για να κάνετε τη μετάβαση. Μετά από αυτό, δημιουργήστε μια αντίστροφη μετάβαση κάνοντας δεξί κλικ στο btn_start_slide_in , επιλέγοντας Make Transition και, στη συνέχεια, κάνοντας κλικ στο btn_start_slide_out . Αυτό είναι αυτό που πρέπει να πάρετε:


Είστε κοντά στον στόχο, αλλά πρέπει να διαμορφώσετε περαιτέρω τις μεταβάσεις. Θα πρέπει να χρησιμοποιήσετε την παράμετρο isHidden. Επιλέξτε τη μετάβαση από btn_start_slide_out σε btn_start_slide_in και αλλάξτε τις Συνθήκες στο Inspector για να κάνετε το isHidden ίσο με false.

Στη συνέχεια, επιλέξτε τη μετάβαση που πηγαίνει προς την αντίθετη κατεύθυνση, από btn_start_slide_in σε btn_start_slide_out και αλλάξτε τις Συνθήκες για να κάνετε το isHidden ίσο με true.

Ξεκινήστε τη σκηνή. Το κουμπί πρέπει να ταιριάζει καλά στη σκηνή. Στη συνέχεια αλλάξτε το isHidden με μη αυτόματο τρόπο ώστε το κουμπί να σβήσει από την οθόνη.


Σημείωση:Κατά καιρούς αντιμετώπιζα προβλήματα κατά τη διάρκεια της δοκιμής όταν έκανα χειροκίνητη εναλλαγή του isHidden - το κουμπί μεταπηδούσε στη θέση έναρξης/τελικής του θέση. Ωστόσο, όλα λειτουργούσαν καλά όταν άλλαξα την παράμετρο στον κώδικα. Αν λοιπόν αντιμετωπίζετε προβλήματα, μην χτυπάτε το ποντίκι σας στο τραπέζι και μην βρίζετε. Απλώς περιμένετε μέχρι να προσθέσουμε τον απαιτούμενο κωδικό.

Κινούμενα σχέδια κουμπιών ρυθμίσεων

Κουμπί Ρυθμίσειςθα πρέπει να σύρετε προς τα κάτω την οθόνη για να δημιουργήσετε χώρο στο κέντρο για διάλογο. Πιστεύετε ότι έχετε αρκετή ικανότητα για να κάνετε κίνηση σε ένα κουμπί; Ρυθμίσειςμόνος του; Το μόνο που χρειάζεται να γνωρίζετε είναι:

  • Η θέση Y εκτός οθόνης πρέπει να είναι -50
  • Δεν χρειάζεται να αλλάξετε τις αγκυρώσεις αφού το κουμπί είναι ήδη τοποθετημένο σε σχέση με το κάτω άκρο της οθόνης.

Δοκιμάστε το μόνοι σας. Για να δημιουργήσετε μια κινούμενη εικόνα ενός κουμπιού που κινείται πάνω και κάτω, ακολουθήστε αυτές τις οδηγίες:

  1. Επιλέξτε btn_settings στην Ιεραρχία.
  2. Ανοίξτε την καρτέλα Προβολή κινούμενης εικόνας.
  3. Ανοίξτε την αναπτυσσόμενη λίστα Κινούμενα σχέδια και επιλέξτε .
  4. Ονομάστε το animation btn_settings_slide_out και αποθηκεύστε το στο φάκελο Animations. Αυτό θα δημιουργήσει επίσης έναν ελεγκτή κινούμενης εικόνας και θα προσθέσει ένα στοιχείο animator στο btn_settings.
  5. Στην καρτέλα Κινούμενη εικόνα, κάντε κλικ στο σημάδι 1:00 στη γραμμή χρόνου και βεβαιωθείτε ότι η εγγραφή είναι ενεργοποιημένη. Η εγγραφή θα ξεκινήσει αυτόματα, αλλά μπορείτε να κάνετε κλικ στον κόκκινο κύκλο και να ξεκινήσετε την εγγραφή χειροκίνητα.
  6. Στο Inspector for btn_settings αλλάξτε το Pos Y σε -50. Αυτή τη φορά δεν χρειάζεται να αλλάξετε άγκυρες.
  7. Σταματήστε την εγγραφή κάνοντας κλικ στο κόκκινο κυκλικό κουμπί ή αποθηκεύοντας τη σκηνή.
  8. Ανοίξτε το φάκελο Animations στο πρόγραμμα περιήγησης Project. Επιλέξτε btn_settings_slide_out και καταργήστε την επιλογή του πλαισίου ελέγχου δίπλα στο Loop Time στο Inspector.
  9. Τώρα ανοίξτε την καρτέλα Animator.
  10. Αντιγράψτε και επικολλήστε την κατάσταση btn_settings_slide_out για να αντιγράψετε.
  11. Επιλέξτε την διπλή κατάσταση, η οποία ονομάζεται btn_settings_slide_out 0 . Στο Inspector, αλλάξτε το όνομα σε btn_settings_slide_in και αλλάξτε την Ταχύτητα σε -1.
  12. Κάντε δεξί κλικ στην κατάσταση btn_settings_slide_in και επιλέξτε Ορισμός ως προεπιλογή.
  13. Δημιουργήστε μια μετάβαση από btn_settings_slide_in σε btn_settings_slide_out και, στη συνέχεια, δημιουργήστε μια αντίστροφη μετάβαση.
  14. Προσθέστε μια νέα παράμετρο Bool που ονομάζεται isHidden.
  15. Επιλέξτε τη μετάβαση από btn_settings_slide_out σε btn_settings_slide_in, μεταβείτε στο Inspector και αλλάξτε τις Συνθήκες μεταβαίνοντας το isHidden σε false.
  16. Επιλέξτε τη μετάβαση από btn_settings_slide_in σε btn_settings_slide_out και αλλάξτε τις Συνθήκες για να αλλάξετε το isHidden σε true.

Αυτό είναι που πρέπει να πάρετε μετά από αυτό:


Λοιπόν, τώρα το κουμπί Ρυθμίσεις κινείται πάνω-κάτω, αλλά δεν πρέπει να κινούνται και τα δύο κουμπιά ταυτόχρονα, όπως στην αρχή, όταν εμφανίζονται στην οθόνη; Φυσικά ναι, και θα το φροντίσουμε τώρα.

Εκτέλεση κινούμενης εικόνας κουμπιών χρησιμοποιώντας σενάριο

Στο MonoDevelop, ανοίξτε το UImanagerScript που δημιουργήσαμε στο Μέρος 1 και προσθέστε τις ακόλουθες μεταβλητές παρουσίας ακριβώς μέσα στον ορισμό της κλάσης:

Public Animator startButton; Public Ρυθμίσεις AnimatorΚουμπί.

Μετά από αυτό, προσθέστε την ακόλουθη μέθοδο:

Public void OpenSettings() ( startButton.SetBool("isHidden", true); settingsButton.SetBool("isHidden", true); )

Αυτός είναι όλος ο κώδικας που χρειαζόμαστε. Αποθηκεύστε το σενάριο και επιστρέψτε στο Ενότητα. Στο Unity, επιλέξτε UImanager in Hierarchy. Σύρετε το btn_start από το Hierarchy στο πεδίο Start Button στον Inspector και btn_settings στο πεδίο Settings Button.


Τώρα επισημάνετε το btn_settings στην Ιεραρχία και κάντε κλικ στο πλήκτρο + στη λίστα On Click (Button). Σύρετε το UIManager από την ιεραρχία σε ένα νέο στοιχείο στη λίστα. Μετά από αυτό, ανοίξτε το μενού επιλογής συναρτήσεων και επιλέξτε UImanagerScript\OpenSettings().

Ξεκινήστε τη σκηνή. Περιμένετε να ολοκληρωθεί η μετακίνηση των κουμπιών και κάντε κλικ στο κουμπί Ρυθμίσεις. Θα πρέπει να δείτε και τα δύο κουμπιά να εκτείνονται από την οθόνη ταυτόχρονα προς αντίθετες κατευθύνσεις.


Τα κουμπιά εκτείνονται εκτός οθόνης προς αντίθετες κατευθύνσεις

Προσθήκη παραθύρου ρυθμίσεων

Δείτε πόσο ελεύθερο χώρο έχουμε τώρα! Ιδανικό για ένα αναδυόμενο παράθυρο διαλόγου. Εξάλλου, η φύση απεχθάνεται το κενό:] Συνήθως, τα παράθυρα διαλόγου περιέχουν κάποια άλλα στοιχεία ελέγχου που πρέπει να εμφανίζονται και να μετακινούνται με το διάλογο. Έτσι, ο πιο αποτελεσματικός τρόπος είναι να δημιουργήσετε το πλαίσιο διαλόγου ως πίνακα και να αντιστοιχίσετε άλλα στοιχεία διεπαφής ως θυγατρικά του αντικείμενα. Για να δημιουργήσετε έναν πίνακα, επιλέξτε GameObject\Create UI\Panel από το μενού. Αυτό θα δημιουργήσει ένα πλαίσιο πλήρους οθόνης με ημιδιαφανές λευκό φόντο.

Ωστόσο, το πλαίσιο διαλόγου μας δεν θα είναι σε πλήρη οθόνη, επομένως ακολουθήστε αυτά τα βήματα για να ορίσετε το μέγεθος και τη θέση του πλαισίου διαλόγου:

  1. Επιλέξτε Panel στην Ιεραρχία και μετονομάστε το σε dlg_settings .
  2. Ρυθμίστε τις αγκυρώσεις του στη μέση δεξιά, καθώς θα τοποθετήσετε το παράθυρο διαλόγου σε σχέση με τη δεξιά άκρη της οθόνης, ώστε να μην είναι ορατό όταν εκτελείτε τη σκηνή.
  3. Ρυθμίστε το Width στο 400 και το Height στο 150.
  4. Ρυθμίστε το Pos X σε 220 και το Pos Y στο 0.

Θα πρέπει να δείτε ένα ημιδιαφανές ορθογώνιο στα δεξιά του καμβά. Όλα τα στοιχεία διεπαφής χρήστη εκτός του καμβά είναι αόρατα στην οθόνη, αυτό ακριβώς που θέλετε!

Ορισμός εικόνας φόντου για διάλογο

Θα χρησιμοποιήσετε την 9η τομή εικόνας ως φόντο του πλαισίου διαλόγου, επομένως πρώτα από όλα θα πρέπει να ορίσετε το περίγραμμα στις ρυθμίσεις εισαγωγής. Ανοίξτε το φάκελο Μενού στο πρόγραμμα περιήγησης του έργου και επιλέξτε settings_panel_bg_9slice . Στο Inspector, κάντε κλικ στο Sprite Editor για να ανοίξετε την προβολή Sprite Editor. Ορίστε το πάχος περιγράμματος στο 20 και κάντε κλικ στο κουμπί Εφαρμογή στο επάνω μέρος.

Τώρα μπορείτε να χρησιμοποιήσετε αυτήν την εικόνα για το φόντο του πλαισίου διαλόγου. Επιλέξτε dlg_settings στο Hierarchy και σύρετε το settings_panel_bg_9slice στο πεδίο Source Image στο Inspector. Κάντε διπλό κλικ στο Color δίπλα στο πεδίο Image Source και ορίστε το A στο 255 για να αφαιρέσετε τη διαφάνεια.


Έτσι θα πρέπει να μοιάζει το παράθυρο διαλόγου μετά τη ρύθμιση της εικόνας φόντου:


Προσθήκη ετικέτας

Στην τρέχουσα κατάστασή του, είναι δύσκολο να υποστηρίξουμε ότι αυτό το πράσινο ορθογώνιο είναι κάτι περισσότερο από ένα παράθυρο διαλόγου ρυθμίσεων, αλλά υπάρχει ένας εύκολος τρόπος να το διορθώσετε. Το μόνο που έχετε να κάνετε είναι να γράψετε "Ρυθμίσεις" σε αυτό). Επιλέξτε GameObject\Create UI\Text για να δημιουργήσετε ένα νέο στοιχείο διεπαφής κειμένου. Επιλέξτε Κείμενο στην Ιεραρχία και μετονομάστε το σε lbl_settings. Τώρα μετακινήστε το lbl_settings στο dlg_settings για να το προσθέσετε ως θυγατρικό αντικείμενο.

Μετά από αυτό, επιλέξτε lbl_settings στην ιεραρχία και κάντε τις ακόλουθες αλλαγές:

  1. Ρυθμίστε τα Anchors Anchors στο επάνω κέντρο .
  2. Ορίστε το Pos X σε 0 και το Pos Y στο -40.
  3. Αλλάξτε το κείμενο σε Ρυθμίσεις.
  4. Ανοίξτε το φάκελο Fonts στο Project Browser και σύρετε τη γραμματοσειρά DCC – Dreamer στο πεδίο Font Inspector.
  5. ορίστε το μέγεθος γραμματοσειράς σε 30.
  6. Κέντρο, ορίστε το Alignment σε Center Align.
  7. Χρωματίστε το κείμενο λευκό ρυθμίζοντας την παλέτα χρωμάτων σε λευκό και ορίζοντας το A (Alpha) στο 255 για να αφαιρέσετε τη διαφάνεια.

Κινούμενη εικόνα του παραθύρου ρυθμίσεων

Τώρα έχετε ένα πραγματικό παράθυρο Επιλογών και το επόμενο βήμα μας θα είναι να διασφαλίσουμε ότι όταν ο χρήστης κάνει κλικ στο κουμπί Ρυθμίσεις, θα εμφανιστεί αυτό το παράθυρο. Θα κάνουμε το ίδιο πράγμα με τα συρόμενα κουμπιά, η μόνη διαφορά είναι ότι το πλαίσιο διαλόγου δεν θα ολισθαίνει αυτόματα μετά την έναρξη της σκηνής. Επιλέξτε dlg_settings στην Ιεραρχία και ανοίξτε την καρτέλα Κινούμενα σχέδια. Στη συνέχεια, δημιουργήστε μια νέα κινούμενη εικόνα κάνοντας κλικ στο (Δημιουργία νέου κλιπ) στην αναπτυσσόμενη λίστα.


Δημιουργήστε μια νέα κινούμενη εικόνα για το παράθυρο ρυθμίσεων

Ας ονομάσουμε το animation dlg_settings_slide_in και ας το αποθηκεύσουμε στο φάκελο Animations.


Στη συνέχεια, κάντε κλικ στο σημάδι 1:00 στη γραμμή χρόνου για να βεβαιωθείτε ότι η εγγραφή έχει ξεκινήσει ή ξεκινήστε την χειροκίνητα κάνοντας κλικ στο κουμπί εγγραφής.


Στον επιθεωρητή, ορίστε τα Anchors σε μεσαίο κέντρο και Pos X σε 0.

Κάντε κλικ στο Διακοπή εγγραφής για να σταματήσετε την εγγραφή.

Ανοίξτε το φάκελο Animations στο Project Browser και επιλέξτε dlg_settings_slide_in . Στο Inspector, καταργήστε την επιλογή του πλαισίου δίπλα στο Loop Time.

Τώρα μεταβείτε στην καρτέλα Animator. Αντιγράψτε και επικολλήστε την κατάσταση dlg_settings_slide_in για να την αντιγράψετε. Μετονομάστε το dlg_settings_slide_out, ορίστε την Ταχύτητά του σε -1.

Σημείωση:Αυτή τη φορά, μην αλλάξετε την προεπιλεγμένη κατάσταση! Η προεπιλεγμένη κατάσταση του πλαισίου διαλόγου θα πρέπει να παραμείνει ως εξής: dlg_settings_slide_in .

Κάντε κλικ στο κουμπί + και προσθέστε μια νέα παράμετρο Bool που ονομάζεται isHidden. Δημιουργήστε δύο μεταβάσεις μεταξύ καταστάσεων, όπως ακριβώς κάνατε με τα κουμπιά. Στη συνέχεια, προσθέστε την παράμετρο isHidden τύπου Bool. Αλλάξτε τις συνθήκες για τη μετάβαση dlg_settings_slide_out => dlg_settings_slide_in αλλάζοντας το isHidden σε false και για τη μετάβαση dlg_settings_slide_in => dlg_settings_slide_out διακόπτης isHidden σε true.


Εκτελέστε τη σκηνή και θα δείτε το πλαίσιο διαλόγου να ολισθαίνει στην αρχή και στη συνέχεια τα κουμπιά να επικαλύπτονται.

Είμαστε ένα βήμα πιο κοντά στον στόχο, αλλά δεν είναι αυτό που χρειαζόμαστε. Πρέπει να απενεργοποιήσουμε το στοιχείο Animator για να μην παίζει το animation στην αρχή. Επιλέξτε dlg_settings στην Ιεραρχία και απενεργοποιήστε το στοιχείο Animator.

Εμφανίστε ένα παράθυρο διαλόγου όταν πατάτε ένα κουμπί.

Όταν εκτελείτε μια σκηνή με μενού, το πλαίσιο διαλόγου δεν θα εμφανιστεί αμέσως. Αυτό είναι καλό. Ωστόσο, δεν θα εμφανίζεται ακόμη και όταν κάνετε κλικ στο κουμπί Ρυθμίσεις. Αλλά αυτό δεν είναι πλέον καλό. Ανοίξτε το UImanagerScript στο MonoDevelop και προσθέστε την ακόλουθη μεταβλητή παρουσίας:

Διάλογος Public Animator.

Στη συνέχεια, προσθέστε τον ακόλουθο κώδικα στο τέλος των OpenSettings:

Public void OpenSettings() ( //..skip.. dialog.enabled = true; dialog.SetBool("isHidden", false); )

Αυτό ενεργοποιεί το στοιχείο Animator και ορίζει την παράμετρο isHidden στη σωστή τιμή. Τέλος, ας προσθέσουμε μια νέα μέθοδο CloseSettings όπως αυτή:

Public void CloseSettings() ( startButton.SetBool("isHidden", false); settingsButton.SetBool("isHidden", false); dialog.SetBool("isHidden", true); )

Αυτό επαναφέρει τα κουμπιά και αποκρύπτει το παράθυρο διαλόγου. Τώρα θα προσθέσουμε ένα στοιχείο διεπαφής χρήστη που καλεί αυτήν τη μέθοδο. Αποθηκεύστε το UImanagerScript και επιστρέψτε στο Unity. Επιλέξτε UIManager στην Ιεραρχία και σύρετε το dlg_settings στο πεδίο Dialog στο Inspector.


Εκτελέστε τη σκηνή, κάντε κλικ στο κουμπί Ρυθμίσεις και παρακολουθήστε πώς τα κουμπιά απομακρύνονται από τη σκηνή καθώς το πλαίσιο διαλόγου μετακινείται σε αυτήν. Έχουμε κάνει μεγάλη πρόοδο, αλλά έχουμε ακόμα πολλά να κάνουμε γιατί δεν μπορούμε να κλείσουμε το παράθυρο διαλόγου. Για να το διορθώσετε, προσθέστε ένα κουμπί Κλείσιμο. Επιλέξτε GameObject\Create UI\Button . Μετονομάστε το νέο κουμπί btn_close και σύρετέ το στις dlg_settings στην Ιεραρχία για να προσθέσετε το κουμπί ως θυγατρικό αντικείμενο. Εφόσον αυτό το κουμπί δεν έχει κείμενο, αφαιρέστε το κείμενο από το btn_close . Εδώ είναι τι πρέπει να έχετε στην Ιεραρχία σας σε αυτό το σημείο:

Τώρα επιλέξτε btn_close και κάντε τα εξής:

  1. Ρυθμίστε τα Anchors Anchors στην επάνω δεξιά γωνία .
  2. Ορίστε τις τιμές Pos X και Pos Y σε 0.
  3. Ανοίξτε το φάκελο Menu στο Project Browser και σύρετε settings_btn_close στο πεδίο Source Image στο Inspector.
  4. Κάντε κλικ στο Ορισμός εγγενούς μεγέθους.

Το πλαίσιο διαλόγου μας στην καρτέλα Σκηνή θα πρέπει τώρα να μοιάζει με αυτό:

Σημείωση:Αυτή τη φορά χρησιμοποιούμε μια διαφορετική μέθοδο για να επισημάνουμε την εικόνα του κουμπιού (την ιδιότητα Transition στο σενάριο κουμπιού) που ονομάζεται ColorTint, που είναι ο προεπιλεγμένος τύπος μετάβασης. Αυτό είναι αντί της προσθήκης δύο εικόνων ταυτόχρονα, αντικατοπτρίζοντας την κατάσταση του κουμπιού όταν επιλεγεί και πατηθεί.

Το κουμπί φαίνεται κομψό, αλλά δεν κάνει τίποτα. Ευτυχώς, έχουμε ήδη προσθέσει μια μέθοδο που πρέπει να καλεί το κουμπί μας. Επιλέξτε btn_close στην Ιεραρχία, μετακινηθείτε προς τα κάτω στη λίστα στο On Click (Κουμπί) και κάντε κλικ στο +. Σύρετε το UIManager από την ιεραρχία στο νέο στοιχείο και, στη συνέχεια, επιλέξτε τη μέθοδο UImanagerScript\CloseSettings() από την αναπτυσσόμενη λίστα.

Ξεκινήστε τη σκηνή. Κάντε κλικ στο κουμπί Ρυθμίσεις και στη συνέχεια στο κουμπί Κλείσιμο όταν εμφανιστεί το πλαίσιο διαλόγου στη σκηνή.


Προσθήκη ρυθμίσεων ήχου

Δεν υπάρχει νόημα στο πλαίσιο διαλόγου μας αυτή τη στιγμή. Ήρθε η ώρα να προσθέσετε κάποιες ρυθμίσεις σε αυτό. Αφήστε το να ενεργοποιεί/απενεργοποιεί τη μουσική. ΜΟΥΣΙΚΗ; Ναι, τι διασκεδαστικό είναι να παίζεις ένα παιχνίδι χωρίς soundtrack;

Προσθήκη μουσικής σε μια σκηνή από το μενού

Μπορείτε να ψάξετε στη συλλογή σας για να βρείτε μια κατάλληλη μελωδία, αλλά αυτό δεν είναι απαραίτητο επειδή το έργο περιέχει ήδη ένα μουσικό κομμάτι. Το μόνο που έχετε να κάνετε είναι να το παίξετε. Επιλέξτε Κύρια κάμερα στην Ιεραρχία και προσθέστε το στοιχείο Πηγή ήχου. Στη συνέχεια, στο Project Browser, ανοίξτε το φάκελο Audio και σύρετε τη μουσική στο πεδίο Audio Clip στο Inspector. Επιλέξτε το πλαίσιο στα δεξιά του Play On Awake.

Ενεργοποιήστε και απενεργοποιήστε τη μουσική

Για να ενεργοποιήσετε και να απενεργοποιήσετε τη μουσική, θα χρησιμοποιήσετε ένα...περιμένετε...εναλλαγή ελέγχου. Επιλέξτε GameObect\Create UI\Toggle για να προσθέσετε μια εναλλαγή στη σκηνή.

Ένα στοιχείο ελέγχου εναλλαγής αποτελείται από ένα ριζικό αντικείμενο με ένα προσαρτημένο σενάριο Εναλλαγής και πολλά θυγατρικά αντικείμενα:

  • Φόντο: Εικόνα που είναι πάντα ορατή (δηλαδή σε κατάσταση ενεργοποίησης και απενεργοποίησης)
  • Σημάδι επιλογής: Μια εικόνα που εμφανίζεται μόνο όταν είναι ενεργοποιημένη.
  • Ετικέτα: Ετικέτες που εμφανίζονται δίπλα στο κουμπί επιλογής.

Δεν θα χρειαστούμε την ετικέτα, επομένως μπορείτε να διαγράψετε το θυγατρικό αντικείμενο Label. Μετονομάστε το Toggle σε tgl_sound και σύρετέ το στις dlg_settings για να το εισαγάγετε στο παράθυρο διαλόγου. Αυτό είναι που πρέπει να δείτε στην Ιεραρχία μετά από όλες αυτές τις ενέργειες:

Επιλέξτε tgl_sound στην Ιεραρχία. Ορίστε τα Anchors Anchors στη μέση-αριστερά, στη θέση X σε 115 και στη θέση Y σε -10.

Σημείωση:Θυμάστε πώς εδραιώνονται οι άγκυρες και η θέση σε σχέση με τον γονέα; Επομένως, είναι σημαντικό να προσθέσετε πρώτα το tgl_sound ως θυγατρικό αντικείμενο dlg_settings και μόνο στη συνέχεια να ορίσετε τη θέση του.

Θυμηθείτε, η αλλαγή των αγκυρώσεων και της προέλευσης δεν επηρεάζει τη θέση των στοιχείων διεπαφής χρήστη - αντίθετα, οι τιμές των Pos X, Pos Y, Left, Right κ.λπ. αλλάζουν, με αποτέλεσμα το στοιχείο να παραμένει στην ίδια θέση, αλλά χρησιμοποιώντας οι νέες άγκυρες και η αντίστροφη μέτρηση προέλευσης. Εγκαταστήστε τα πρώτα και παίξτε μαζί τους για να πάρετε τη σωστή θέση.

Ω ναι, κάτω από το στοιχείο Εναλλαγή (Σκριπτ) υπάρχει ένα πλαίσιο Ενεργό - πρέπει να το αποεπιλέξετε. Τώρα πρέπει να ρυθμίσετε την εικόνα για το φόντο και το σημάδι επιλογής, καθώς και τα παιδιά. Όπως και άλλες εικόνες, θα τις πάρουμε από το φάκελο Μενού στο πρόγραμμα περιήγησης έργου. Θα χρειαστούμε δύο εικόνες:

  • settings_btn_sound για φόντο
  • settings_btn_sound_checkmark για το Checkmark

Επιλέξτε Background από το tgl_sound στην ιεραρχία και σύρετε το settings_btn_sound από το Project Browser στο Source Image στο Inspector. Στη συνέχεια, κάντε κλικ στο Ορισμός εγγενούς μεγέθους.

Τώρα επιλέξτε Checkmark και επαναλάβετε τα προηγούμενα βήματα, αλλά αυτή τη φορά χρησιμοποιήστε την εικόνα settings_btn_sound_checkmark από το Project Browser.

Δείτε τι πρέπει να δείτε στην καρτέλα Σκηνή:


Σημείωση:Όπως μπορείτε να δείτε, το μέγεθος του ριζικού αντικειμένου (πλατύ ορθογώνιο) δεν ταιριάζει με την εικόνα φόντου. Μπορείτε να προσαρμόσετε το μέγεθός του, αλλά καταρχήν αυτό θα γίνει.

Απενεργοποιήστε τη μουσική

Η δύναμη των χειριστών συμβάντων στοιχείων διεπαφής χρήστη είναι ότι μερικές φορές μπορείτε να ξεφύγετε χωρίς να γράψετε κανέναν κώδικα. Αντίθετα, μπορείτε να ορίσετε ένα στοιχείο διεπαφής χρήστη για να αλλάξετε μια ιδιότητα ή να καλέσετε απευθείας μια συνάρτηση στοιχείου που είναι συνδεδεμένη σε ένα αντικείμενο. Δείτε πώς μπορείτε να αλλάξετε την ιδιότητα σίγασης του στοιχείου Πηγή ήχου που είναι συνδεδεμένο στην κύρια κάμερα. Επιλέξτε tgl_sound στην Ιεραρχία και στο Inspector, βρείτε την τιμή που άλλαξε (Boolean) στη λίστα. Κάντε κλικ στο + για να προσθέσετε ένα νέο στοιχείο.

Σύρετε την MainCamera από την ιεραρχία στο στοιχείο που προστέθηκε. Ανοίξτε το αναπτυσσόμενο μενού συναρτήσεων και επιλέξτε AudioSource\mute από την ενότητα Dynamic bool στο επάνω μέρος.


Σημείωση:Αν κοιτάξετε προσεκτικά τις επιλογές συναρτήσεων, θα δείτε δύο ιδιότητες σίγασης: μία κάτω από το Dynamic bool και την άλλη κάτω από τις Στατικές παράμετροι . Ας δούμε ποια είναι η διαφορά. Εάν απενεργοποιήσετε τον ήχο στην ενότητα Dynamic bool, η τιμή της συνάρτησης θα αλλάζει στην τρέχουσα τιμή της ιδιότητας Active του διακόπτη κάθε φορά που την αλλάζετε. Εάν απενεργοποιήσετε τον ήχο στην ενότητα Στατικές παράμετροι, θα ανοίξει ένα νέο πεδίο και μπορείτε να ορίσετε μια σταθερή τιμή για τη λειτουργία στο Inspector. Φυσικά, η ενότητα Dynamic bool περιέχει μόνο ιδιότητες και μεθόδους που βασίζονται σε τιμές Bool, επειδή Αυτός είναι ένας ενεργός τύπος διακόπτη. Αλλά επειδή μπορείτε να ορίσετε κάθε τιμή ως στατική παράμετρο, η ενότητα Στατικές παράμετροι είναι όπου θα βρείτε όλες τις δημόσιες ιδιότητες και μεθόδους.

Επομένως, όταν ένα κουμπί επιλογής έχει οριστεί σε Ενεργό, αλλάζει την ιδιότητα Σίγαση του AudioSource σε true και απενεργοποιεί τη μουσική. Εκκινήστε τη σκηνή, ανοίξτε το παράθυρο ρυθμίσεων και δοκιμάστε να απενεργοποιήσετε και στη συνέχεια να ενεργοποιήσετε τη μουσική.

Χρησιμοποιώντας το ρυθμιστικό για να ρυθμίσετε την ένταση του ήχου

Το γεγονός ότι ένας διακόπτης μπορεί να συγχρονίσει την ενεργή και την ανενεργή κατάστασή του με ένα πεδίο κάποιου άλλου αντικειμένου είναι, φυσικά, καλό, αλλά τι γίνεται αν έχετε ένα εύρος τιμών; Σε αυτήν την περίπτωση, μπορείτε να χρησιμοποιήσετε το στοιχείο διεπαφής χρήστη Slider. Επιλέξτε GameObject\Create UI\Slider για να προσθέσετε ένα ρυθμιστικό. Μετονομάστε το σε sdr_volume και βάλτε το στις dlg_settings.

Επιλέξτε sdr_volume στην Ιεραρχία και ορίστε τα Anchors του στη μέση δεξιά . Ρυθμίστε το Pivot του σε (1, 0,5) έτσι ώστε να μπορείτε να τοποθετήσετε το sdr_volume χρησιμοποιώντας το μέσο της δεξιάς άκρης του. Τέλος, ορίστε το Pos X στο -20, το Pos Y στο -10, το Width στο 270 και το Height στο 35.

Το παράθυρο διαλόγου Ρυθμίσεις θα πρέπει τώρα να μοιάζει με αυτό:


Αν κοιτάξετε τις Ιεραρχίες, θα δείτε ότι το ρυθμιστικό έχει περισσότερες λεπτομέρειες από την εναλλαγή για το κουμπί. Εδώ είναι τα κύρια μέρη:

  • Φόντο: Μια εικόνα που δείχνει το περίγραμμα του ρυθμιστικού και την εσωτερική του περιοχή όταν είναι άδειο (για παράδειγμα, όταν η λαβή βρίσκεται στα αριστερά).
  • Λαβή: Εικόνα για τη λαβή. Το σύρετε για να αλλάξετε την τιμή του ρυθμιστικού.
  • Γέμισμα: Μια εικόνα που εκτείνεται για να εμφανίσει την τιμή του ρυθμιστικού.

Στην πραγματικότητα, αυτή η εικόνα δεν είναι το μόνο τμήμα που μπορεί να τεντωθεί, επομένως είναι προτιμότερο να χρησιμοποιείτε εικόνες που μπορούν να μεγεθυνθούν τουλάχιστον 9 φορές και για τα τρία μέρη. Ανοίξτε το φάκελο Μενού στο πρόγραμμα περιήγησης έργου και βρείτε τρεις εικόνες που αντιστοιχούν σε κάθε τμήμα του ρυθμιστικού: slider_background, slider_fill και slider_handle.

Για κάθε εικόνα, ανοίξτε το Sprite Editor στο Inspector και ορίστε όλες τις τιμές Border σε οκτώ. Κάντε κλικ στο Εφαρμογή.

Τώρα πρέπει να ορίσετε μια αντίστοιχη εικόνα για κάθε τμήμα του ρυθμιστικού:

  1. Επιλέξτε sdr_volume και σύρετε το slider_background στην εικόνα πηγής στο Inspector.
  2. Επιλέξτε Γέμισμα (όχι Περιοχή γεμίσματος) και σύρετε το slider_fill στην Εικόνα πηγής.
  3. Επιλέξτε Handle και σύρετε το slider_handle στην εικόνα πηγής.

Εάν εκτελέσετε τη σκηνή τώρα και ανοίξετε το παράθυρο διαλόγου Ρυθμίσεις, θα πρέπει να δείτε κάτι σαν αυτό:

Αλλαγή επιπέδου έντασης

Η αλλαγή της έντασης της μουσικής με ένα ρυθμιστικό είναι παρόμοια με αυτήν που κάνατε με έναν διακόπτη. Επιλέξτε sdr_volume στην Ιεραρχία. Στον επιθεωρητή, κάντε κύλιση προς τα κάτω για να δείτε On Value Changed (Single) και κάντε κλικ στο + για να προσθέσετε ένα νέο στοιχείο. Σύρετε την MainCamera από την Ιεραρχία σε αυτό το νέο στοιχείο της λίστας, ανοίξτε την αναπτυσσόμενη λίστα Χαρακτηριστικά και επιλέξτε AudioSource\volume στην περιοχή Dynamic float .

Εκτελέστε τη σκηνή, ανοίξτε το παράθυρο διαλόγου Ρυθμίσεις και αλλάξτε την τιμή του ρυθμιστικού. Θα πρέπει να ακούσετε την ένταση του ήχου να αλλάζει καθώς σύρετε το ρυθμιστικό. Προσωπικά, νομίζω ότι αυτό είναι ένα πολύ ωραίο χαρακτηριστικό.

Τι θα συμβεί μετά;

Στο τελευταίο μέρος του νέου εκπαιδευτικού προγράμματος Unity GUI, θα μάθετε νέες βέλτιστες πρακτικές, συμπεριλαμβανομένου του στοιχείου μάσκας για τη δημιουργία συρόμενων μενού και πώς να μετεγκαταστήσετε το υπάρχον γραφικό περιβάλλον σας στη νέα διεπαφή χρήστη.



Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: