Javën e kaluar, prezantova KittenVR - një eksperiment zhvillimi i gjallë ku përpiqem të dokumentoj sa më shumë nga eksperimentet e mia të zhvillimit të realitetit virtual. Unë jam një vajzë fanse e Unity n00b dhe VR dhe shpresa ime me këtë projekt është të frymëzoj zhvilluesit e tjerë aspirantë që të ndihen të sigurt duke u futur në aplikacionet e tyre VR, pavarësisht nivelit të përvojës.

Mohim përgjegjësie: Përfundova duke mos përdorur Linecast-in për këtë, por doja të dokumentoja kurthet që hasa me këtë përpjekje. Mund të dokumentojë gjithashtu dështimet, si dhe sukseset, për pasardhësit dhe të gjitha! Zgjidhja me të cilën jam duke punuar aktualisht është e dokumentuar më poshtë.

Eksperimentimi me fizikën.Linecast

Javën e kaluar, kur prezantova këtë projekt, përmenda se kisha funksionuar kryesisht versionin jo-VR të KittenVR - por kisha ngecur për disa ditë në një problem me pajisjen e kamerës Oculus që ndërhynte në transmetimin tim me rreze OnClick(). U ula të martën mbrëma me TheNappingKat nga kaharri.com dhe kaluam ca kohë duke provuar teknika të ndryshme korrigjimi dhe patëm disa rezultate të çuditshme - pasi vizatuam Rrezin me korrigjuesin (SHTO FUNCTION) vumë re se po vizatohej në vende krejtësisht të çuditshme në skenë. Mora një copë kodi nga një prej mësimeve të saj të ardhshme, por gjithsesi kisha probleme që asgjë nuk përplasej siç duhet. Unë u përpoqa:

  • Transmetimi i rrezeve nga qendra spirancë e OVRCameraRig
  • Krijimi i një kamere boshe që u ul në mes të OVRCameraRig për t'u përdorur si Kamera kryesore në një përpjekje për të rivendosur kompensimin
  • Përdorimi i karakterit standard FPSController dhe shtimi i OVRCameraRig (kjo thjesht dukej se krijonte edhe më shumë probleme)
  • Duke qarkulluar nëpër objekte dhe duke etiketuar të gjitha objektet e tyre fëmijë në rast se transmetimi i rrezeve po godiste një komponent më të vogël rrjetë

Për shumë zhgënjimin tim, asnjë nga këto nuk funksionoi! Unë gërmova nëpër forumet Oculus dhe gjeta disa probleme të ngjashme, por asnjë nga zgjidhjet nuk funksionoi për mua. Natyra e SDK-ve të pazhvilluara është se shumë gjëra ndryshojnë me shpejtësi ndërmjet publikimeve, dhe unë kisha pothuajse gjithçka që funksiononte kundër meje: po zhvilloja në një Mac, për të cilin Oculus ka ndaluar që nga java e kaluar, unë po përdorja Versioni 0.4.4 i SDK-së dhe shtojcave, dhe unë kisha versionin 0.5.1 të kohës së funksionimit. Duke mos i rezistuar të gjitha gjërave të tjera potencialisht të thyera që i kisha bërë kodit tim duke u përpjekur të rregulloja transmetimin me rreze, nuk ishte befasi në këtë pikë që ende nuk po funksiononte!

Më pas vendosa që të hiqja dorë nga përpjekja ime për të transmetuar rreze nga kamera, dhe në vend të kësaj të përfshija një objektiv dhe objekt ankorimi në kontrolluesin e personazhit tim me rekomandimin e Kat. Ideja pas kësaj është se nuk më duhej të shqetësohesha më për transmetimin e rrezeve nga një pikë specifike në kamerë, dhe në vend të kësaj do të përpiqesha të zbuloja një përplasje midis një rrezeje nga objekti ankorues, i cili u ul pikërisht përballë personazhit, dhe objektivit. , e cila ishte ~4 njësi përballë karakterit tim. Nëse ata nuk do të lidheshin së bashku, do ta dija se kisha goditur diçka.

NUK PUNOI ENDESH.

Dukej se kishte ende një kompensim të çuditshëm, gjërat nuk u regjistruan si të qëndrueshme, pavarësisht se punonin në mënyrë perfekte me një kamerë normale në skenë, dhe në këtë pikë, unë u përplasa me Physics.Linecast, e cila ishte një zgjidhje më e mirë për të kontrolluar midis dy objekteve se sa ishte raycast në këtë rast të veçantë, sepse më në fund funksionoi! Isha në gjendje (në mënyrë të sikletshme) të mblidhja kotelet në skenën time, por nuk ishte pa disa kompromise. Për një, unë nuk e kisha të lidhur Rift-in tim në atë kohë, kështu që nuk mund të lëvizja drejtimin e kamerës (dhe më pas, ankorimin+objektet e synuara). Përfundimisht vendosa ta heq plotësisht Linecast-in, megjithatë, pasi Kat publikoi serinë e saj për krijimin e një FPS me Oculus Rift dhe pasi pashë një postim nga një takim i Unity në Boston rreth ndryshimeve të performancës midis Linecast dhe Raycast.

Raycasting: Më në fund po funksionon!

Ishte koha për t'u zhytur përsëri në problem dhe për të gjetur një zgjidhje të duhur! Përfundoi duke qenë një hibrid i përpjekjeve të mëparshme dhe pjesërisht asaj që Kat diskutoi në tutorialin e saj - por jam i emocionuar të them se rreth dy orë më parë, kotelet mund të mblidhen nga brenda Rift!

Kur postova fillimisht kodin tim të mostrës për versionin jo-VR të aplikacionit në postimin tim të mëparshëm, kisha skriptin PlayerController të bashkangjitur me vetë karakterin. Bëra disa ndryshime në projekt: për një, kam kaluar mjedisin tim të zhvillimit në Windows dhe kam përditësuar versionin e SDK-së dhe kohën e funksionimit që po përdor. Kam hasur në probleme me atë të fundit, kështu që po përdor versionet 0.5.1 dhe po funksionon mjaft mirë në këtë pikë.

Çfarë përfundoi duke funksionuar:

  • E hoqa plotësisht paketën e aseteve Oculus nga projekti im dhe e riimportova atë të freskët - versioni më i ri i paketës UnityIntegration nga faqja e zhvilluesve të Oculus
  • Duke u bazuar në hierarkinë time nga udhëzuesi i Kat-it, unë krijova një GameObject 'ankorues' nga një sferë dhe e vendosa nën CenterEyeAnchor nga OVRPlayerController -› OVRCameraRig. Ai vendosi 3 njësi në boshtin Z përpara personazhit, e cila është një distancë mjaft e rehatshme për t'u përdorur si një objektiv i shikimit
  • Më pas e lidha PlayerController-in tim në spirancë, në vend të vetë PlayerController - kjo ndoshta mund të bëhej pak më e pastër me një rifaktorim të vogël, por tani për tani po funksionon. Meqenëse OVRPlayerController nuk ka një kërcim të vendosur, nuk më duhej të kontrolloja më pozicionin, por kjo mund të ndryshojë në të ardhmen.

Kodi i ri për PlayerController:

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class PlayerController : MonoBehaviour {
public int kittens_collected = 0;
	public bool isVisible = false;
	private float timer = 0.0f;
	private string message;
/**
	 * Use this for initialization
	 **/
	void Start () {
}
	
	/**
	 * Update is called once per frame.
	 * Check for various game play components. 
	 **/
	void Update () {
		MouseClickListener ();
	}
/**
	 * A function to check if the player has clicked on a kitten.
	 * Eventually update this with a different, more interactive input type.
	 **/
	void MouseClickListener()
	{
		if (Input.GetMouseButtonDown(0)) {
			RaycastHit hit;
			if (Physics.Raycast(transform.position, transform.forward, out hit, 10))
			{
				Collider _hit = hit.collider;
				GameObject _VICTIM = hit.collider.gameObject;
				if(_VICTIM.tag.Equals("kitten"))
				{
					kittens_collected++;
					Destroy(hit.transform.transform.gameObject);
					Debug.Log("You've collected " + kittens_collected + " kittens!");
				}
				else if (_VICTIM.tag.Equals("leader")) {
					Debug.Log("Hit Leader");
					if(kittens_collected == 0)
					{
						message = "Help! My kittens have gone missing! Can you help collect all 7 of them?";
						isVisible = true;
					}
					else if(kittens_collected == 1)
					{
						message = "You've found one kitten so far! Just 6 more to go!";
						isVisible = true;
					}
					else if(kittens_collected < 7) 					{ 						message = "You've found " + kittens_collected + " kittens so far! Just " + (7 - kittens_collected) + " left to go!"; 						isVisible = true; 					} 					else 					{ 						message = "You've found them all! Thank you so meouch!"; 						isVisible = true; 						System.Threading.Thread.Sleep(2000); 						Application.LoadLevel(Application.loadedLevel); 					} 			 				} 			} 		} 		GUIFunction(); 	} 	void GUIFunction() 	{ 		if (isVisible) { 			timer++; 		} 		 		if (timer > 300f) {
			isVisible = false;
			timer = 0f;
		}
		Display ();
	}
void Display()
	{
		if (isVisible) {
}
	}
}

There's still some empty code blocks in the PlayerController, since I'm working on getting the GUI functional with the VR headset. From my precursory experiments, it looks like OnGUI() and the old drawing functionality isn't idea for VR displays, so that's next on my list to tackle. Once the basic UI is in place, version 0.1 of KittenVR will be available for play testing!
Note: all of the code from the KittenController file has been integrated into the PlayerController script, so the updated source code may look different from last time around!
An extra big thanks to Kat (TheNappingKat) for her help sorting out the raycast problems. She's working on a VR-enabled infinite runner!