Στην άσκηση αυτή θα εξοικειωθείτε με τη βασική διαχείριση οντοτήτων μέσω εφαρμοζόμενων scripts στο περιβάλλον Unity 3D, ελέγχοντας την κίνηση των αντικειμένων της σκηνής και ρυθμίζοντας την εξέλιξη του παιχνιδιού μέσω της συλλογής "πόντων", ανάλογα με την είσοδο και την ικανότητα ανταπόκρισης του χρήστη. Ο στόχος είναι η υλοποίηση ενός δισδιάστατου, διαδραστικού παιχνιδιού τύπου "φιδάκι", το οποίο δυσκολεύει σε επίπεδο κατά την εξέλιξή του. Η λογική του παιχνιδιού είναι πως ξεκινώντας από μια μικρή γραμμήσώμα, το "φιδάκι" αρχίσει να "μεγαλώνει" καθώς συλλέγει μια μικρή "τελεία-τροφή", προσπαθώντας να την παραλάβει χωρίς να ακουμπήσει στα όρια κίνησης που του έχουν σχεδιαστεί. Ας ξεκινήσουμε λοιπόν την υλοποίηση! Πώς θα σχεδιάζατε τα αντικείμενα στη σκηνή; Χρειαζόμαστε: Τέσσερις γραμμές για να καθορίσουν τα όρια κίνησης (πάνω, κάτω, δεξιά, αριστερά) Μια μικρή γραμμή που θα αποτελέσει το σώμα του "φιδιού" Μια "τελεία" που θα αποτελεί την "τροφή" του φιδιού Επιγραμματικά, τα βήματα σχεδίασης είναι τα ακόλουθα: ΒΗΜΑ 1: Δημιουργήστε ένα νέο project στη Unity, ρυθμίζοντας προκαθορισμένα το περιβάλλον της για 2-D υλοποίηση. Μπορείτε να παρατηρήσετε ότι έχετε την επιλογή να χρησιμοποιήσετε "πακέτα" χαρακτηριστικών/αντικειμένων (packages), τα οποία, ανάλογα με την έκδοση της Unity, θα σας επιτρέπουν να χρησιμοποιήστε "έτοιμες" υλοποιήσεις όπως κώδικές ελέγχου, υφές, ιδιότητες υλικών, προκαθορισμένες σκηνές κλπ. Αν επιλέξετε κάποια από αυτά, στο κάτω μέρος του περιβάλλοντος εργασίας, στην εργαλειοθήκη Assets, θα εμφανιστούν οι φάκελοι που περιέχουν τη συγκεκριμένη λειτουργικότητα. Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 1
ΒΗΜΑ 2: Σχεδίαση διαδραστικών παιχνιδιών στο περιβάλλον Unity 3D Ορίστε το μέγεθος της κάμερας στην τιμή 40 και το χρώμα φόντου σε αυτό της επιλογής σας. Έχετε πατημένο το κουμπί 2Dπάνω από τη σκηνή ώστε να βρίσκεστε σε δισδιάστατη προβολή. Εισάγετε τα αρχεία εικόνων.png border_horizontal, border_vertical και food στο φάκελο Assets του project σας, οπότε και τα αρχεία θα εμφανιστούν στην εργαλειοθήκη Assets της Unity 3D. Πατήστε πάνω στα αρχεία εικόνων και αλλάξτε το μέγεθός του σύμφωνα με την υπόδειξη του σχήματος και εφαρμόστε τις αλλαγές μέσω του κουμπιού Apply. ΒΗΜΑ 3: Σύρετε τις εικόνες που αντιστοιχούν στα όρια στη σκηνή δύο φορές ώστε να δημιουργήσετε οτ ορθογώνιο πλαίσιο εντός του οποίου θα γίνεται η κίνηση.. Προσέξτε τις συντεταγμένες κάθε αντικειμένου σε σχέση με την κάμερα ώστε όλα τα αντικείμενα να είναι ορατά στη σκηνή! Ονομάστε τα αντικείμενα ως top_border, bottom_border, left_border, right_border. Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 2
ΒΗΜΑ 4: Σχεδίαση διαδραστικών παιχνιδιών στο περιβάλλον Unity 3D Σε κάθε ένα από τα αντικείμενα της σκηνής, από το μενού Component->Physics 2D εφαρμόστε την ιδιότητα Box Collider 2D και βεβαιωθείτε ότι η επιλογή IsTrigger δεν είναι ενεργοποιημένη. Εισάγετε την εικόνα food.png στη σκηνή, αφού αλλάξετε τις ρυθμίσεις εισαγωγής σύμφωνα με το διπλανό σχήμα κι ονομάστε το νέο αντικείμενο ως Food. Εφαρμόστε του την ιδιότητα Box Collider 2D και βεβαιωθείτε ότι η επιλογή IsTrigger είναι ενεργοποιημένη αυτή τη φορά. Μετονομάστε το αντικείμενο σε FoodPrefab, σύρετε το στην εργαλειοθήκη Assets->Project και διαγράψτε το από την εργαλειοθήκη Hierarchy, μιας και δε χρειάζεται να εμφανίζεται εξ'αρχής στη σκηνή. Εισάγετε την εικόνα Snake στο project και εφαρμόστε τις ίδιες ρυθμίσεις εισαγωγής του διπλανού σχήματος. Επειδή το αντικείμενο Snake θα κινείται και θα αλλάζει και μέγεθος πρέπει να του "αποδοθεί" η ανάλογη λειτουργικότητα. Επιλέξτε λοιπόν το αντικείμενο και από το μενού Component->Physics 2D εφαρμόστε την ιδιότητα Rigidbody 2D, με ενεργοποιημένη τη λειτουργία Is Kinematic. Στον κώδικα αργότερα, θα πρέπει να χρησιμοποιήσετε κίνηση με μικρή τιμή scale σε σχέση με το μέγεθος του αντικειμένου, ώστε το "φιδάκι" να μη "μεγαλώνει" υπερβολικά κάθε φορά που θα συλλέγει τροφή. Ορίστε την παράμετρο Gravity Scale στην τιμή 0. Εφαρμόστε στο αντικείμενο snake την ιδιότητα Box Collider 2D και βεβαιωθείτε ότι η επιλογή IsTrigger είναι απενεργοποιημένη. Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 3
Σύρετε το αντικείμενο snake στην εργαλειοθήκη Assets->Project και ονομάστε το αντικείμενο prefab ως TailPrefab. ΒΗΜΑ 5: Δημιουργήστε ένα C# script με όνομα Snake και "συνδέστε" το με το αντικείμενο snake, είτε σε λειτουργία Drag&Drop πάνω στο αντικείμενο είτε μέσω της επιλογής Add Component μέσω της εργαλειοθήκης Inspector. Το αρχείο αυτό θα περιέχει τον κώδικα "ελέγχου" του "φιδιού"! Η σχεδίαση ολοκληρώθηκε! Τι θα συμβεί αν πατήσουμε το κουμπί Play; Τίποτα! Απλά θα βλέπουμε τη σκηνή με τα αντικείμενα αλλά δεν θα υπάρχει αλληλεπίδραση αφού δεν έχουμε "προγραμματίσει" τη λειτουργία των αντικειμένων μέσω κώδικα! Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 4
Σύνδεση αντικειμένων με κώδικα Μόλις ολοκληρώσετε τη δημιουργία ενός script, αυτό θα εμφανιστεί στο περιβάλλον της καρτέλας Assets (στο κάτω μέρος) και κάνοντας διπλό κλικ στο όνομα του αρχείου που περιέχει τον κώδικα μεταφέρεστε αυτόματα στον ενσωματωμένο editor της Unity (Monodevelop). Οι λέξεις κλειδιά για τη γλώσσα προγραμματισμού εμφανίζονται με μπλε γράμματα και μέσω αυτού του editor μπορείτε να κάνετε όποιες αλλαγές θέλετε, να προσθέστε ή να αφαιρέστε λειτουργικότητα. Ας δούμε βήμα - βήμα τον κώδικα: Αρχικά δημιουργούμε public game objects, ορατά για όλες τις μεθόδους/συναρτήσεις που μελλοντικά θα υλοποιηθούν Στη συνέχεια, απαιτείται η κίνηση και ο έλεγχος του "φιδιού" μέσω του πληκτρολογίου, οπότε είναι αναγκαία η δημιουργία μιας συνάρτησης-κίνησης και των ανάλογων μεταβλητών της, όπως επίσης και η κατάλληλη κλήση της μεθόδου αρχικοποίησης μέσω της συνάρτησης-κλειδί "InvokeRepeating" στη διαδικασία "Start". Προφανώς, η αλλαγή διεύθυνσης θα γίνεται εντός της διαδικασίας "Update", η οποία λαμβάνει χώρα σε κάθε frame αναπαραγωγής του παιχνιδιού. Αυτή η πρώτη "έκδοση" του κώδικα ουσιαστικά επιτρέπει την κίνηση του φιδιού. Εφόσον έχουν δημιουργηθεί public variables θα πρέπει να αντιστοιχηθούν με τα κατάλληλα αντικείμενα εντός της σκηνής μέσω της εργαλειοθήκης Inspector! ΚΑΝΤΕ ΛΟΙΠΟΝ ΤΗΝ ΚΑΤΑΛΛΗΛΗ ΑΝΤΙΣΤΟΙΧΗΣΗ! Ελέγξτε τη λειτουργικότητα κίνησης μέσω των βελών του πληκτρολογίου πατώντας το κουμπί Play για να εκκινήσει το παιχνίδι! Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 5
Προγραμματισμός υπόλοιπης λειτουργικότητας του παιχνιδιού Για τον προγραμματισμό της υπόλοιπης λειτουργικότητας του παιχνιδιού, δηλαδή αύξηση μεγέθους όταν το φιδάκι λαμβάνει τροφή και τερματισμός παιχνιδιού όταν το φιδάκι "χτυπήσει" στα περιθώρια, χρειάζεται να εμπλουτίσετε τον υπάρχοντα κώδικα: Απαιτείται η δημιουργία της τροφής, οπότε θα επεξεργαστούμε το αντικείμενο Food. Στην εργαλειοθήκη Assets δημιουργήστε ένα στοιχείο Prefab όνομα Food (στην ουσία είναι ένα αντικείμενο με συγκεκριμένες ιδιότητες, το οποίο μπορείτε να το χρησιμοποιείτε ως πρότυπο σχεδίασης και σε άλλα projects). Από τη καρτέλα Hierarchy πάνω αριστερά σύρετε το αντικείμενο Food στο prefab που δημιουργήσατε, οπότε και το αντικείμενο θα επισημανθεί με μπλε χρώμα. Εφαρμόστε επίσης ένα Box Collider 2D (η επιλογή Istrigger να είναι ενεργή). Το αντικείμενο Food θα πρέπει να εμφανίζεται μόνο εντός των ορίων, οπότε πρέπει να κληθεί και η κατάλληλη μέθοδος στη διαδικασία Start(): Ελέγξτε τη λειτουργικότητα πάλι: δημιουργείται η τροφή και το φιδάκι μετακινείται με το πληκτρολόγιο! Τι απομένει; Απομένει να δημιουργηθεί η συνάρτηση που θα εμφανίζει τη νέα τροφή και η συνάρτηση που θα κάνει το φιδάκι να μεγαλώνει κάθε φορά που συλλέγει το αντικείμενο Food! Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 6
Ως ένα τελευταίο βήμα, χρειάζεται να μην επιτρέπουμε στο φιδάκι να κινείται αντίθετα προς την κατεύθυνση που πάει και να "μπαίνει" μέσα στο σώμα του. Αυτό γίνεται με την προσθήκη δύο 2 booleans μεταβλητών ώστε αυτή η "απαγόρευση" να "περνά" και στο πληκτρολόγιο! Τι δημιουργήσαμε λοιπόν στον κώδικα και τη σχεδίαση; Δημιουργήθηκαν τα αντικείμενα snake, food και borders. Το φιδάκι μετακινείται με τη μέθοδο InvokeRepeating(), η οποία περιλαμβάνει τη συνάρτηση Movement(). Η τροφή δημιουργείται με τη συνάρτηση SpawnFood() αντός των ορίων της σκηνής. Το φιδάκι συλλέγει την τροφή με τη μέθοδο OnTriggerEnter() η οποία "ανιχνεύει" τη "σύγκρουση" των αντικειμένων snake-food. Το score του παιχνιδιού επίσης θα μπορεί να ρυθμιστεί εντός αυτής της μεθόδου! Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 7
Building / Compiling Για να "τρέξει" το παιχνίδι απαιτείται ο κώδικας να μην περιέχει λάθη (συντακτικά αλλά και λογικά)! Για αυτό θα χρειαστεί να ελέγξετε τις συνθήκες ελέγχου if-else εντός του αρχείου κώδικα και να προσαρμόσετε τις αλλαγές θέσεων σύμφωνα με τις συντεταγμένες που έχετε τοποθετήσει τα αντικείμενα μέσα στη σκηνή. Μόλις αυτό εξασφαλιστεί επιλέγετε Build Settings από το μενού File ή πατάτε το συνδυασμό Ctrl-Shift-B, οπότε εμφανίζεται το ακόλουθο πλαίσιο διαλόγου ώστε να τρέξετε την υλοποίηση και να ορίσετε το φάκελο αποθήκευσης του εκτελέσιμου αρχείου και των απαιτούμενων δεδομένων! Εναλλακτικά, μπορείτε να πατήσετε το κουμπί Play στην καρτέλα Game. Ρυθμίστε τις παραμέτρους του κώδικα για να δυσκολέψετε το παιχνίδι! Δημιουργία διαδραστικού παιχνιδιού "Φιδάκι" - Έλεγχος κίνησης - Λιβανός Γ. Σελίδα 8