In deze tutorial leer je hoe je een mobiel 3D-spel maakt met C # en Unity. Het doel van het spel is om de versnellingsmeter te gebruiken om de bal te verplaatsen en de portal te bereiken.
In deze tutorial leer je over de volgende aspecten van Unity-game-ontwikkeling:
Open Unity en selecteer Nieuw project van de het dossier menu om het nieuwe projectdialoogvenster te openen. Vertel Unity waar u het project wilt opslaan en stel het inStandaardinstellingen instellen voor: menu naar 3D.
In de volgende stap krijgt u de gebruikersinterface van Unity te zien. Stel het project in voor mobiele ontwikkeling door te kiezen Bouw instellingen van de het dossier menu en het selecteren van uw platform naar keuze.
Het eerste dat we moeten doen nadat we het doelplatform hebben geselecteerd, is het kiezen van de grootte van de illustraties die we in het spel zullen gebruiken. Dit zal ons helpen een juiste grootte voor de 3D-texturen en 2D GUI te selecteren zonder de illustratie wazig te maken of texturen te gebruiken die te groot zijn voor het doelapparaat. De illustratie moet bijvoorbeeld een hogere resolutie hebben als u een iPad target met een retina-display dan een Lumia 520.
Omdat Android een open platform is, is er een breed scala aan apparaten, schermresoluties en pixeldichtheid. Een paar van de meest voorkomende staan hieronder vermeld.
Houd er rekening mee dat de code die we in deze zelfstudie schrijven, kan worden gebruikt om een van de platforms te targeten.
Afhankelijk van de apparaten die u target, moet u de illustratie mogelijk converteren naar de aanbevolen grootte en pixeldichtheid. U kunt dit doen in uw favoriete foto-editor. Ik heb de Grootte aanpassen ... functie onder de Hulpmiddelen menu in OS X's Voorbeeld toepassing.
U kunt de resolutie wijzigen die wordt weergegeven in de Spel paneel.
De interface van onze game is eenvoudig. De bovenstaande schermafbeelding geeft u een idee van de illustraties die we gaan gebruiken en hoe de uiteindelijke spelinterface eruit zal zien. Je vindt de illustraties en extra bronnen in de bronbestanden van de zelfstudie op GitHub.
U kunt een van de drie programmeertalen gebruiken wanneer u Unity gebruikt, C #, UnityScript, een variatie van JavaScript, en boe. Elke programmeertaal heeft zijn voors en tegens, en het is aan jou om te beslissen welke je voorkeur heeft. Mijn persoonlijke voorkeur gaat naar de programmeertaal C #, dus dat is de taal die ik in deze zelfstudie zal gebruiken.
Als u besluit een andere programmeertaal te gebruiken, moet u de voorbeelden van Unity's Script Reference raadplegen.
Ik zal een aantal geluiden gebruiken om de audiale ervaring van het spel te verbeteren. De geluidseffecten die in deze zelfstudie worden gebruikt, zijn verkregen van playonloop.com en Freesound.
Om onze game te maken, moeten we eerst onze 3D-modellen krijgen. Ik raad 3docean aan voor modellen, texturen en meer van hoge kwaliteit, maar als je aan het testen of leren bent, zijn een paar gratis modellen ook goed. De modellen in deze zelfstudie zijn gedownload van SketchUp 3D Warehouse, waar u een grote verscheidenheid aan allerhande modellen kunt vinden.
Omdat Unity het SketchUp-bestandsformaat niet herkent, moeten we het nu converteren naar iets dat Unity kan importeren. We moeten eerst de gratis versie van SketchUp downloaden, genaamd SketchUp Make.
Open uw 3D-model in SketchUp Make, selecteer Exporteren> 3D-model van de het dossier menu en kies Collada (* .dae).
Kies een naam en locatie en klik op de knop Opslaan. Hiermee wordt een bestand en een map voor het 3D-model gemaakt. Het bestand bevat de gegevens voor het 3D-object terwijl de map de texturen van het model bevat. U kunt het model dan in Unity importeren, zoals in de volgende stap wordt uitgelegd.
Voordat we beginnen met coderen, moeten we onze activa toevoegen aan het Unity-project. U kunt dit op verschillende manieren doen:
Nadat u deze stap hebt voltooid, ziet u de items in uw project Middelen map in de project paneel.
We zijn klaar om de scène van ons spel te maken door objecten naar de te slepen Hiërarchie of Tafereel paneel. We zullen ook Unity native 3D-primitieve objecten gebruiken om het niveau te creëren zoals weergegeven in de volgende stappen.
Laten we eerst onze positie bepalen Hoofdcamera een beetje hoger om het gewenste uitzicht te bereiken. Selecteer het van de Hiërarchie paneel en pas de Transformeren waarden in de Inspecteur om overeen te komen met degene die hieronder worden getoond.
Maak je geen zorgen als je geen wijzigingen ziet. We hebben nog niets gemaakt voor de camera om te zien. Gebruik vervolgens de Inspecteur om de Achtergrond kleur naar RGB: 0, 139, 252.
Ons platformniveau zweeft boven een achtergrond, die een weergave van een zee is. Het zal worden gemaakt met behulp van Unity primitives, een eenvoudige Vlak met een textuur erop.
Hoewel Unity kan werken met 3D-objecten van elk type dat door andere programma's is gemaakt, is het soms gemakkelijker en / of handiger om primitieven voor prototypen te gebruiken.
Als u bijvoorbeeld de zee wilt maken, selecteert u Maak een andere> Vliegtuig van de GameObject menu en pas de Transformeren waarden in de Inspecteur om overeen te komen met degene die hieronder worden getoond.
Je moet een vierkant in de Tafereel paneel. We gebruiken het om te detecteren wanneer de speler van het platform valt en het spel beëindigt.
Vermeldenswaard is dat deze primitieve objecten al een Mesh Collider verbonden, wat betekent dat ze automatisch botsingen zullen detecteren of gebeurtenissen zullen triggeren wanneer ze in contact komen met a star lichaam.
Om een textuur op het watervliegtuig toe te passen, moeten we een Materiaal. EEN Materiaal wordt gebruikt om te definiëren hoe a GameObject ziet er uit en het is essentieel om een textuur toe te voegen aan een GameObject.
kiezen Creëer> Materiaal van de Middelen menu om er een te maken, zoek het in de Middelen paneel en gebruik de Inspecteur om de textuur te selecteren die u wilt gebruiken als uw zee. Dit zijn de instellingen die ik heb gebruikt:
U ziet een bericht in het gedeelte Materiaal waarin staat dat het wordt aanbevolen om te gebruiken Mobile / Diffuse als een arcering, omdat de standaard witte kleur niets doet. Wijzigen in Mobile /Diffuus zal ook helpen met de prestaties.
Je hebt misschien gemerkt dat de zee een beetje donkerder is dan zou moeten. Om dit te verhelpen, moeten we een toevoegen Licht naar onze scène. kiezen Maak een ander van de GameObject menu en selecteer Directional Light. Hiermee wordt een object gemaakt dat een lichtstraal produceert. Verander zijn Transformeren waarden zoals weergegeven in de volgende schermafbeelding om het de zee te laten verlichten.
Dit ziet er veel beter uit.
De platforms zijn delen van ons niveau en worden door de speler gebruikt om de bal naar het portaal aan de andere kant van de zee te brengen.
Maak een Vlak zoals je deed voor de zee en de Transformeren waarden in de Inspecteur zoals hieronder getoond. Hiermee wordt het eerste platform gecreëerd en geplaatst.
We kunnen nu Unity's gebruiken verhuizing en omwenteling tools om de andere platforms te maken. Ze hebben allemaal dezelfde afmetingen, zodat we ze verticaal of horizontaal kunnen gebruiken door ze te dupliceren met Command + D op OS X en Control + D op Windows.
Maak een nieuw Materiaal zoals we deden in Stap 14 en pas de textuur erop toe. De mijne ziet er zo uit:
Pas de .... aan X en Y tegelwerk totdat je tevreden bent met het resultaat.
We moeten een rand maken om te voorkomen dat onze speler te gemakkelijk valt. Om dit te doen, zullen we een nieuw type primitief gebruiken, a Cilinder.
kiezen Maak anders> Cilinder aan van de GameObject menu en pas de Transformeren waarden in de Inspecteur zoals hieronder getoond.
Hiermee wordt een kleine rand aan de rand van het eerste platform toegevoegd. Maak een nieuw Materiaal en verander zijn kleur in de Inspecteur naar RGB: 255, 69, 0.
Het resultaat zou er als volgt uit moeten zien:
Gebruik Command + D (Control + D op Windows)om de grens en de Schaal hulpmiddel om de grootte te veranderen. Plaats de duplicaten aan de randen van de platforms met Unity's tools.
De portal is de doellijn van het spel. De speler gebruikt de versnellingsmeter om de bal te besturen en deze naar dit punt te brengen tijdens het oppakken van items en om te voorkomen dat hij van het platform valt. De portal is een 3D-model dat we hebben geïmporteerd Stap 10.
Sleep het naar de Tafereel of Hiërarchie paneel en verander zijn Transformeren waarden op de volgende:
Dit plaatst het aan het einde van de platforms.
Omdat geïmporteerde 3D-modellen standaard geen collider hebben, moeten we er een toevoegen. Omdat we alleen hoeven te testen of de bal het blauwe deel van de portal raakt, verbinden we de collider eraan.
Bekijk het portaalmodel in de Hiërarchie bekijken en je ziet een driehoekje links van de naam. Klik op het driehoekje om de groep van de portal uit te vouwen en het eerste item te selecteren. Ik heb de -Collider achtervoegsel voor verduidelijking.
Klik op de Component toevoegen knop in de Inspecteur en kies Natuurkunde> Mesh Collider. Hiermee wordt een collider toegevoegd met behulp van de vorm van het geselecteerde gebied van het model.
Om feedback aan de speler te geven, spelen we een geluidseffect als de bal de rijder van het portaal raakt. Omdat we de gebeurtenis activeren met de eerder gemaakte collider, moeten we de audiobron toevoegen aan datzelfde object.
Selecteer het van de Hiërarchie paneel, klik op de Component toevoegen knop in de Inspecteur paneel en selecteer Geluidsbron van de audio sectie.
Haal het vinkje weg Speel op Awake en klik op de kleine stip rechts, onder het tandwielpictogram, om het geluid te selecteren dat je wilt spelen.
De eilanden zijn niets meer dan decoratieve elementen om het niveau minder leeg te maken. Ik heb een geïmporteerd 3D-model en een Cilinder om ze te maken. Ik ga niet in detail in op het creëren van de eilanden, omdat ze niet essentieel zijn voor het spel. Met wat je tot nu toe hebt geleerd, zou je in staat moeten zijn om ze zelf te maken.
Net als bij Monkey Ball kan de speler tijdens het spel bananen verzamelen. Begin door het model van de te slepen Middelen paneel naar de Tafereel. Maak je nog geen zorgen over de locatie, want we zetten het om naar een prefab later omdat we het meerdere keren zullen hergebruiken.
Zoals eerder vermeld, geïmporteerde modellen hebben standaard geen collider, dus we moeten er een aan de banaan bevestigen. Klik op de Component toevoegen knop in de Inspecteur en kies Natuurkunde> Mesh Collider. Hiermee wordt een collider toegevoegd met behulp van de vorm van het model. Zorg ervoor dat u de Op gang brengen checkbox, omdat we botsingen willen detecteren, maar we willen niet dat de bal reageert met de banaan.
Het is tijd om ons gamekarakter te creëren, wat een simpel spel zal zijn Gebied primitief. kiezen Maak anders> bol van de GameObject menu om de primitieve te maken en de Transformeren waarden in de Inspecteur zoals hieronder getoond.
Hiermee wordt de bol gemaakt en geplaatst aan het begin van ons niveau.
Om de bol semi-transparant te maken, moeten we de sfeer veranderen Shader opties. Open de Inspecteur en verander de arcering in Transparant / Diffuse.
Om een botsing met de speler te detecteren, moeten we een star lichaam ernaar toe. Selecteer om een toe te voegen Component toevoegen van de Inspecteur paneel gevolgd door Fysica > star lichaam. U kunt de instellingen op hun standaardwaarden laten staan.
Om de gebruikersinterface van het spel weer te geven, gebruiken we de GUI-structuren van Unity. De documentatie van Unity biedt een duidelijke uitleg over GUI Textures:
GUI-texturen worden weergegeven als vlakke afbeeldingen in 2D. Ze zijn speciaal gemaakt voor elementen, knoppen of decoraties van de gebruikersinterface. Hun positionering en schaal worden alleen langs de x- en y-assen uitgevoerd en worden gemeten in schermcoördinaten in plaats van wereldcoördinaten.
Standaard worden afbeeldingen geïmporteerd naar de Middelen map worden geconverteerd naar textures die kan worden toegepast op 3D-objecten. We moeten dit veranderen in GUI-structuur voor de afbeeldingen die we willen gebruiken in de gebruikersinterface van het spel.
Selecteer de afbeeldingen die u wilt converteren in de Middelen paneel en open de Inspecteur, Klik op de Textuurtype vervolgkeuzemenu en selecteer GUI.
U kunt nu de afbeeldingen slepen en neerzetten naar de Tafereel. De afbeeldingen verschijnen altijd voor elk object op het werkgebied en worden behandeld als 2D-elementen.
Binnen elk GUI-element geven we een nummer weer dat het aantal bananen aangeeft dat de speler heeft verzameld en de tijd die de speler nog heeft.
kiezen Maak anders> GUI-tekst van de GameObject menu om een tekstobject te maken, plaats het in het midden van het GUI-element en wijzig de tekst in het Hiërarchie paneel naar 0. Doe hetzelfde voor de tijd aan de rechterkant. Ik heb de standaardtijd ingesteld op 30 seconden.
U kunt een aangepast lettertype voor de tekst gebruiken door het lettertype toe te voegen aan de Middelen map en vervolgens het wijzigen van de doopvont eigendom van de tekst in de Inspecteur.
Het is tijd om wat code te schrijven. Met de gebruikersinterface op zijn plaats, kunnen we beginnen met het schrijven van de benodigde code om functionaliteit aan onze game toe te voegen. We doen dit door middel van scripts. Scripts zijn gekoppeld aan verschillende game-objecten. Volg de volgende stappen om te leren hoe u interactie toevoegt aan het niveau dat we zojuist hebben gemaakt.
We zullen beginnen met het gebruik van de apparaten accelerometer. De speler verplaatsen met behulp van de versnellingsmeter is vrij eenvoudig in Unity. Er is niets om op te zetten en het is gemakkelijk te begrijpen.
Selecteer de fase, klik op de Component toevoegen knop in de Inspecteur paneel en kies Nieuw script. Geef het script een naam MoveScene
en vergeet niet om de taal in C # te veranderen. Open het nieuw gemaakte bestand en voeg het volgende codefragment toe.
gebruikmakend van UnityEngine; met behulp van System.Collections; public class MoveScene: MonoBehaviour void Update () transform.rotation * = Quaternion.Euler (Input.acceleration.y / 6, -Input.acceleration.x / 3, 0);
Wij gebruiken de Bijwerken
methode om gegevens van de versnellingsmeter in elk frame op te vragen met behulp van de Input.acceleration
eigenschap, die de beweging van het apparaat in een driedimensionale ruimte meet. Dit stelt ons in staat om de X, Y, en z waarden gebruiken en deze gebruiken om de positie van de speler te bepalen.
Vervolgens passen we de verkregen waarden toe op de transform.rotation
eigendom van het niveau door aan te roepen Quaternion.Euler
, die de rotatiewaarden retourneert. Merk op dat we de waarden van de versnellingsmeter verdelen om te voorkomen dat de speler te snel beweegt, wat het spelen van de game bemoeilijkt.
We passen alleen de niveau's aan X en Y waarden, omdat we het alleen nodig hebben om te kantelen en niet dichter bij of verder van de camera te komen.
Het volgende script is gekoppeld aan de Hoofdcamera. Het berekent de ruimte tussen de camera en de speler en handhaaft deze terwijl de bal beweegt.
gebruikmakend van UnityEngine; met behulp van System.Collections; public class FollowPlayer: MonoBehaviour public GameObject player; private Vector3 playerOffset; // Gebruik dit voor initialisatie void Start () playerOffset = transform.position - player.transform.position; // Update wordt eenmaal per frame ongeldig Update () transformation.LookAt (player.transform); transform.position = player.transform.position + playerOffset;
Het script gebruikt twee variabelen die de moeite van uitleg waard zijn:
speler
: Dit is een verwijzing naar de speler in de Tafereel. U kunt dit instellen in de Inspecteur.playerOffset
: Dit is de afstand tussen de camera en de speler. Omdat we dezelfde afstand tussen camera en speler behouden, volgt de camera de speler terwijl deze zich verplaatst. De offset wordt berekend in de Begin
methode.We richten de camera naar de speler en stellen zijn positie in op de positie van de speler plus de waarde van playerOffset
. Omdat we dit doen in de Bijwerken
methode wordt de camerapositie in elk frame berekend en bijgewerkt. Het gevolg is dat de camera de speler volgt. Dit is een eenvoudige maar effectieve strategie om een camera te maken die de speler volgt.
Het volgende script is aan de banaan bevestigd en handelt eventuele interacties ermee af. We beginnen met het krijgen van verwijzingen naar het corresponderende geluid en de tekst met het aantal verzamelde bananen, dat we nodig hebben om het geluid te spelen en de teller linksboven te verhogen wanneer de speler in botsing komt met een banaan. Nadat u de variabelen in het script hebt gedeclareerd, moet u deze verwijzingen instellen in de Inspecteur.
gebruikmakend van UnityEngine; met behulp van System.Collections; openbare klasse PickBanana: MonoBehaviour openbare AudioClip bananaSound; openbare GUIText bananaText; void OnTriggerEnter (Collider anders) AudioSource.PlayClipAtPoint (bananaSound, transform.position); int score = int.Parse (bananaText.text) + 1; bananaText.text = score.ToString (); Vernietigen (gameObject);
Vervolgens noemen we een methode die detecteert wanneer de bal botst met een banaan. Wanneer dit gebeurt, spelen we het geluid en verhogen we de teller.
Om de teller te wijzigen, maken we een variabele met de waarde van de GUI-tekst en gebruik de int.Parse
methode om de reeks naar een getal te converteren en het getal met te verhogen 1. Vervolgens stellen we de waarde in op de GUI-tekst, eerste converteren van het nummer naar een string door het aanroepen van de toString
methode. Ten slotte roepen we aan Vernietigen
om het bananen-spelobject te verwijderen.
De volgende klasse wordt gebruikt om te detecteren wanneer de speler van het platform in de zee valt. Koppel het script aan het game-object sea.
gebruikmakend van UnityEngine; met behulp van System.Collections; public class Lose: MonoBehaviour void OnCollisionEnter () audio.Play (); Invoke ("Herladen", 1.59f); void Reload () Application.LoadLevel (Application.loadedLevel);
Deze eenvoudige klasse gebruikt de OnCollisionEnter
methode om te detecteren wanneer de bal botst met de zee, wat betekent dat de speler van het platform is gevallen. Wanneer dit gebeurt, spelen we het geluid dat aan de zee is gehecht en gebruiken we het Beroep doen op
methode om het te bellen vernieuwen
methode, die het spel opnieuw start door de huidige scène opnieuw te laden.
De tweede parameter van de Beroep doen op
methode definieert de vertraging waarmee de vernieuwen
methode wordt aangeroepen. Dit is nodig omdat we eerst het geluid willen laten eindigen voordat we een nieuw spel beginnen.
De volgende klas, timer
, is rechtsboven aan de tijd-GUI gekoppeld. Het vermindert de tijd en eindigt het spel wanneer de teller bereikt 0.
gebruikmakend van UnityEngine; met behulp van System.Collections; public class Timer: MonoBehaviour public GUIText timeText; void Start () InvokeRepeating ("ReduceTime", 1, 1); void ReduceTime () int currentTime = int.Parse (timeText.text) - 1; timeText.text = currentTime.ToString (); if (currentTime == 0) audio.Play (); Invoke ("Reload", 1.59f); // wacht tot het geluid wordt afgespeeld om te herladen Destroy (timeText); void Reload () Application.LoadLevel (Application.loadedLevel);
We houden een verwijzing naar de tekst in de timeText
variabele om het wijzigen van de gebruikersinterface eenvoudig te maken. In de Begin
methode, noemen we de InvokeRepeating
methode, die herhaaldelijk de ReduceTime
methode herhaaldelijk.
Om de tekst in de gebruikersinterface bij te werken, maken we een variabele om de tekst naar een getal te converteren, net zoals we eerder deden, en één seconde af te trekken en de gebruikersinterface bij te werken met het resultaat.
Wanneer de teller bereikt 0, het juiste geluid wordt gespeeld en we vernietigen de tegen-tekst. We roepen het vernieuwen
methode met een vertraging om het spel opnieuw te starten wanneer het geluid klaar is met spelen.
De laatste klasse, EndLevel, wordt gebruikt om te detecteren wanneer de speler de portal bereikt. Wanneer de speler het portaal passeert, geven we een bericht op het scherm weer en vernietigen we de bal. We doen dit om te voorkomen dat de bal in de zee valt.
gebruikmakend van UnityEngine; met behulp van System.Collections; public class EndLevel: MonoBehaviour public GameObject complete; openbare GameObject-speler; void OnTriggerEnter (Collider anders) audio.Play (); Invoke ("Herstart", 2); GameObject alert = Instantiate (compleet, nieuw Vector3 (0.5f, 0.5f, 0), transform.rotation) als GameObject; Vernietigen (player.rigidbody); void Restart () Application.LoadLevel (Application.loadedLevel);
De Een exemplaar
methode wordt gebruikt om een exemplaar van het bericht te maken dat aan de speler wordt getoond. Hiermee kunnen we het GUI-element van het project gebruiken Middelen in plaats van het ter plaatse te hebben. Ten slotte starten we het spel opnieuw met een vertraging van twee seconden.
Het is tijd om de game te testen. druk op Command + P om het spel in Unity te spelen. Als alles naar behoren werkt, bent u klaar voor de laatste stappen.
Als je tevreden bent met je spel, is het tijd om te selecteren Bouw instellingen van de het dossier menu en klik op de Speler instellingen knop. Dit zou de Speler instellingen in de Inspecteur paneel waar u de parameters voor uw toepassing kunt instellen.
Deze instellingen zijn applicatiespecifieke gegevens die de maker of het bedrijf, app-resolutie en weergavemodus, weergavemodus (CPU, GPU), apparaat-compatibiliteit van het besturingssysteem, enz. Bevatten. Configureer de instellingen op basis van de apparaten die u target en de winkel of markt waar je bent van plan om de app te publiceren.
Met behulp van de afbeeldingen die u eerder hebt gemaakt, kunt u nu een leuk pictogram en een splash-afbeelding voor uw spel maken. Unity toont u de vereiste formaten, die afhankelijk zijn van het platform waarvoor u bouwt.
Zodra uw project correct is geconfigureerd, is het tijd om terug te gaan naar de Bouw instellingen en klik op de Bouwen Knop. Dat is alles wat nodig is om uw spel te bouwen voor testen en / of distributie.
In deze zelfstudie hebben we geleerd hoe je de versnellingsmeter kunt gebruiken om de beweging van de speler, GUI Textures, primitieven en andere aspecten van game-ontwikkeling in Unity te regelen. Ik moedig je aan om met het resultaat te experimenteren en het spel aan te passen zodat het je eigen spel wordt. Ik hoop dat je deze tutorial leuk vond en vond het nuttig.