Stap 8: Interactie en geluiden
De kartonnen besturingselementen + pakket, een paar stappen geleden, vermeld biedt een makkelijke manier van interfacing met de headset, en is een goede gelegenheid om te duiken in de code en maken sommige interactiviteit.
We maken een zwarte bol die, als je kijkt, verandert van grootte, begint deeltjes uitstoten en verandert de kleur van het licht afkomstig van de achterwand. Voor deze stap zal ook gebruiken we twee klanken tegelijk speelt, een gesampled uit een vrij lage rommelend geluid (de verdwijnt werden verwijderd) en een lus van de steekproef van de instrumentale versie van Hotline Bling.
Het toevoegen van de bol
- Een nieuw materiaal maken en toepassen op de achterwand ('Plane(4)' in de kamer prefab) en bepalen welke emissie sterkte u vindt werkt goed (Neem elke heldere kleur). Dit zal er niet toe veel later, als de waarde zal via programmacode worden ingesteld. Stel de emissie-intensiteit met een grey met 0.70 intensiteit.
- Verdopen Plane(4) voor 'achterwand' (deze exacte naam zal worden gebruikt in de code).
- Plaats een bol (GameObject > 3D-Object > bol) in het midden van de achterste muur duurzaame 2,2,2.
- Geef het een nieuw materiaal met 0 gladheid en een zwarte Albedo.
Geluiden toevoegen
- Maak een map 'Geluiden' in de bibliotheekweergave
- Importeren van de gedownloade / geselecteerde geluiden in deze map (hotline.ogg is bijgevoegd hieronder)
- Selecteer het gat van het plafond van de trap
- In het Inspector-venster, klikt u op 'onderdeel toevoegen' en typ Audio bron.
- Stel de eigenschap AudioClip op het ingevoerde geluid
- Selectievakje 'Loop' en 'Spelen op wakker'
- 'Ruimtelijke Blend' ingesteld op 1, om er een geluid met 3-dimensionale bron, het plafond-gat.
- Ergens rond 13 'Max afstand' instellen.
- Stel de volumecurve zoals geïllustreerd.
- Selecteer het zwarte gebied nu, en een audio-bron met de rumble-ruis als clip toepassen.
- Uncheck 'Loop' en 'Spelen op Awake' (we willen niet continu of willekeurige rumbles, het zal worden geactiveerd in de code)
- Laat de ruimtelijke mix op 0.
Particle systeem toevoegen
- Een nieuw materiaal maken
- In de inspecteur, wijzigt u de eigenschap van de Shader (op de top) van standaard aan deeltjes > additief (zacht). Dit is een optisch effect dat helderder elementen eronder alleen als het is lichter dan die elementen (vergelijkbaar met overvloeimodi van Photoshop).
- Selecteer het zwarte gebied en 'Particle systeem' een onderdeel toevoegen.
- Draai de bol een zodanig dat de emitter is gericht op de kamer.
- In het Particle systeem component Shape instellen > hoek tot en met 41, inzonderheid de Renderer sectie set
- Rendermodus: gaas
- Mesh: bol
- Materiaal: [Selecteer uw deeltje materiaal]
- Werpen schaduw: uit
- Ontvangen van schaduwen: uit
Code
Nu is het tijd om wat nieuwe code toevoegen. De 'Player' object selecteren en dubbelklik op het 'Object' script. Het zal openen in MonoDevelop, een code-editor voor de eenheid die is geïntegreerd. Voor het kopiëren van code, adviseer ik om te kopiëren van het uiteindelijke bestand op Github, omdat Instructables wat moeite met de opmaak heeft.
Voeg de volgende vóór de start functie ('ongeldig Start() {...}'), na "privé CapsuleCollider playerCollider;"
private GameObject backWall;private GameObject sphere;private AudioSource sphereSound;private Color desiredColor;
Toevoegen van het volgende binnen de start-functie:
cardboard.gaze.OnChange += CardboardFocusChanges; // Execute when focus changesbackWall = GameObject.Find ("backwall"); // define the back wall object sphere = GameObject.Find ("Sphere"); // define the black sphere sphereSound = sphere.GetComponent (); // define the sound player of the sphere desiredColor = new Color (0f, 0f, 0f); // define the starting color of the backWall (black)
De eerste regel van het vorige blok noemen de functie 'CardboardFocusChanges', maar die nog niet is gedefinieerd. Eerst laten we op die. Plaats het volgende onder de functie Start (dus na de afsluitende '}', voordat de FixedUpdate-functie)
private void CardboardFocusChanges(object sender){ CardboardControlGaze gaze = sender as CardboardControlGaze; //Cardboard camera gaze if (gaze.IsHeld() && gaze.Object() == sphere) { float redOrBlue = Random.value; //random value for color desiredColor= new Color(redOrBlue, Random.value, 1 - redOrBlue); // set desired color }}
Dus nu, vier dingen moeten gebeuren:
- Animeren de kleur en de uitstoot van de achterste muur op de gewenste kleur
- Vergroten van de omvang van de bol, wanneer het wordt gekeken naar
- Activeren / deactiveren van geluiden
- Activeren / deactiveren van het particle systeem
Aangezien deze dingen moeten dynamisch gebeuren, de eerste drie geanimeerde zelfs, zijn ze in een standaardfunctie die elk frame wordt genoemd: de updatefunctie. In dit geval is het als volgt:
void Update(){ if (backWall.GetComponent<Renderer>().material.color != desiredColor) { backWall.GetComponent<Renderer>().material.color = Color.Lerp(backWall.GetComponent<Renderer> ().material.color, desiredColor, Time.deltaTime); // Animate wall color DynamicGI.SetEmissive (backWall.GetComponent<renderer>(), backWall.GetComponent ().material.color * 1.5f); // Animate wall emission}if (cardboard.gaze.IsHeld () && cardboard.gaze.Object () == sphere) {sphere.transform.localScale = Vector3.Lerp (sphere.transform.localScale, new Vector3 (4, 4, 4), Time.deltaTime); // animate sphere scalesphere.GetComponent<ParticleSystem>().startColor = desiredColor; // set particle colorsphere.GetComponent<ParticleSystem>().enableEmission = true; // enable emission sphereSound.volume = Mathf.Lerp (sphereSound.volume, 1f, Time.deltaTime); // fade sound on if(!sphereSound.isPlaying){sphereSound.time = 0; // reset playback of soundsphereSound.Play(); // play sound }} else { sphere.transform.localScale = Vector3.Lerp (sphere.transform.localScale, new Vector3(2,2,2), Time.deltaTime); // animate scale back upon lost gaze sphere.GetComponent<ParticleSystem>().enableEmission = false; // disable particles sphereSound.volume = Mathf.Lerp (sphereSound.volume, 0f, Time.deltaTime); // fadeout}}