În acest tutorial ne vom arunca înapoi în biblioteca Vuforia Augmented Reality (AR), explorând una dintre cele mai interesante resurse - Image Target. Vom extinde jocul Shoot the Cubes pe care l-am creat în lecțiile anterioare, adăugând un nou nivel în care jucătorul trebuie să-și apere baza de la atacarea cuburilor.
Acest tutorial poate fi completat singur, deși dacă doriți o introducere în AR cu Vuforia și Unity3D, verificați posturile anterioare din serie.
Orice tip de imagine poate fi un Vuforia Image Target. Cu toate acestea, cu cât este mai detaliată și mai complexă imaginea, cu atât mai bine va fi recunoscută de algoritm.
O multitudine de factori vor face parte din calculul recunoașterii, dar în esență imaginea trebuie să aibă un nivel rezonabil de contrast, rezoluție și elemente distinctive. O fotografie albastră a cerului nu ar funcționa foarte bine, dar o fotografie a unor iarbă ar lucra cu grație. Obiectivele pentru imagini pot fi livrate împreună cu aplicația, încărcate în aplicație prin cloud sau create direct în aplicație de către utilizator.
Să începem prin adăugarea unui ImageTarget
element pentru proiectul nostru Unitate.
Mai întâi, descărcați activele cursului de la butonul din bara laterală. Apoi, în proiectul dvs. Unitate, creați o nouă scenă numită DefendTheBase: în Proiect fereastră, selectați scene și faceți clic pe Crea > Scenă. Acum deschideți acea scenă și eliminați toate obiectele scena implicite din ierarhie.
Apoi vom adăuga o lumină și o cameră foto. Click pe Adăuga > Ușoară > Lumină direcțională pentru a adăuga o lumină direcțională. Selectați această lumină nouă și setați Umbra moale dupa cum Tip de umbra opțiune.
După aceea, glisați și fixați un ARCamera obiect de la Vuforia > prefabricate. Selectează ARCamera obiect și în panoul de inspecție, setați Cheie de licență pentru aplicații create pe pagina dezvoltatorului Vuforia (consultați primul tutorial pentru instrucțiuni). Selectați DEVICE_TRACKING pentru Centrul mondial Mod.
În cele din urmă, trageți și fixați un ImageTargetla ierarhia de la Vuforia > prefabricate.
Acum trebuie să adăugăm o bază de date Vuforia. Mai întâi, navigați la https://developer.vuforia.com/target-manager. Click pe Adăugați baza de date și alegeți un nume.
Există trei tipuri de bază de date pentru a alege:
În acest caz, alegeți Dispozitiv și faceți clic pe crea.
Selectați noua bază de date pentru a putea începe să adăugați ținte la ea. Acum este momentul să adăugați ținte la baza de date. Pentru moment, vom folosi doar Imagine unică opțiune.
Navigați la fișierele descărcate anterior, alegeți ImageTarget1, și setați-o Lăţime la 1 și faceți clic pe Adăuga. (Notă: Dacă preferați să creați propriul dvs. obiectiv de imagine, citiți mai întâi ghidul.)
Acum puteți descărca baza de date, selectând Editor unitate ca platformă aleasă. Deschideți fișierul și selectați toate elementele de importat. De asemenea, trebuie să ne pregătim scena Unității să recunoaștem ImageTarget cu această bază de date pe care am creat-o.
În editorul Unity, faceți clic pe eumageTarget obiect. Mai întâi, găsiți și extindeți-vă Imagine țintă Comportament în inspectorul de obiect. Alege o Tip de predefinită. Alegeți ținta de imagine pe care am creat-o mai devreme Bază de date. În cele din urmă, asigurați-vă că Activați urmărirea extinsă și Activați Terrain inteligent opțiunile sunt dezactivate.
ImageTarget prefab este făcut dintr-o serie de componente, inclusiv unele scripturi Imagine țintă Comportament, Turn Off Comportament, și Implicit Tracker Event Handler. Dacă doriți să înțelegeți cum funcționează sistemul, citiți aceste scripturi și încercați să înțelegeți relația acestora cu alte componente.
Pentru acest tutorial, nu vom sătura prea adânc. Trebuie doar să ne concentrăm asupra Implicit Tracker Event Handler, care primește apeluri când se schimbă starea de urmărire a imaginii țintă. Deci, să folosim acest script ca bază pentru a crea propriul nostru comportament de script.
Creați o copie a acestui script pe care o putem extinde. Selectați mai întâi Implicit Tracker Event Handler, Click pe Opțiuni și selectați Editați Script. Acum, faceți o copie a scenariului. Dacă utilizați MonoDevelop, faceți clic pe Fişier > Salvează ca și salvați ca ImageTargetBehavior, salvarea lui în Scripturi pliant.
Nu vom avea nevoie de asta Vuforia
namespace în scriptul nostru. Scoateți linia "namespace Vuforia
"Și parantezele. Asta înseamnă că va trebui să menționăm explicit Vuforia
spațiul de nume când vrem să accesăm clasele sale:
utilizând UnityEngine; utilizând System.Collections; clasa publica BaseScript: MonoBehavior, Vuforia.ITrackableEventHandler // cod aici
Cea mai importantă metodă din această clasă va fi OnTrackableStateChanged
care primește apeluri atunci când obiectivul imaginii este găsit sau pierdut de aparatul foto. În funcție de starea țintă, solicită OnTrackingFound
sau OnTrackingLost
, și va trebui să editați și aceste metode. Dar, mai întâi, să ne gândim cum vrem să se comporte obiectivul imaginii.
În acest joc, utilizatorul va apăra o bază care apare într-o țintă imagine. Să luăm în considerare următoarea mecanică a jocului:
Așadar, va trebui să adaptăm acele mecanisme de joc peste cele pe care le-am construit în ultimul tutorial. Vom crea logica inimii de reproducere în următoarea secțiune cu un obiect gol numit _SpawnController, folosind aceeași logică adoptată în prima parte a jocului.
Pentru moment, să ne uităm la logica descoperită.
private void OnTrackingFound () EnableRendererAndCollider (); // Informați sistemul că obiectivul a fost găsit StartCoroutine (InformSpawnCtr (true)); void private OnTrackingLost () DisableRendererAndCollider (); // Informați sistemul că obiectivul a fost pierdut StartCoroutine (InformSpawnCtr (false)); // informează SpanController că baza a fost fondată privat IEnumerator InformSpawnCtr (bool isOn) // mutați poziția de reproducere GameObject spawn = GameObject.FindGameObjectWithTag ("_SpawnController"); randamentul randament nou WaitForSeconds (0.2f); // informează SpanController dacă (isOn) spawn.GetComponent() .BaseOn (transformare); altceva spawn.GetComponent (); .BaseOff ();
Înapoi în editorul Unity, putem crea obiectul de bază care va fi generat de controlerul spawn.
În primul rând, pe ImageTarget obiect, dezactivați Implicit Trackerable Event Handler scenariu.
Apoi, faceți clic pe Adăugați componenta și selectați Scenariu de comportament țintă. De la Ierarhie panou, faceți clic dreapta pe ImageTarget și să creeze un nou cub numit "BazaAcest cub ar trebui inserat în interiorul lui ImageTarget obiect.
Asigurați-vă că Baza are Box Collider și Mesh Renderer activat.
Opțional, puteți introduce și a Avion obiect în interiorul ImageTarget folosind ImageTarget prezentat mai devreme în Vuforia ca o textura. Acest lucru ar crea un efect interesant, proiectând umbre din țintă și creând o experiență mai bogată.
Acum ne vom adapta _SpawnController utilizate în ultimul tutorial. Salvați scena curentă și deschideți-o ShootTheCubesMain din ultimul tutorial. În Ierarhie panou, selectați _SpawnController și trageți-l în prefabricate dosarul pentru a face o Unitatea Prefab.
Salvați această nouă scenă și redeschideți DefendTheBase. Trage _SpawnController din dosarul prefabricatelor la Ierarhie panou. Cu _SpawnController selectat, faceți clic pe Adaugă etichetă pe Inspector panou. Denumiți noua etichetă _SpawnController și aplicați-o la obiect.
În fereastra Project, selectați cub element în prefabricat dosarul și setați-l Etichetă, înapoi la inspectorul său, la "Enemy".
În cele din urmă, deschideți Scripturi dosar și deschis SpawnScript. Trebuie să facem acest script să se adapteze scenei încărcate.
utilizând UnityEngine; folosind UnityEngine.SceneManagement; utilizând System.Collections; folosind System.Collections.Generic; folosind Vuforia; clasa publica SpawnScript: MonoBehavior #region VARIABLES private bool mSpawningStarted = false; // Elementul Cub pentru a da naștere jocului GameObject mCubeObj; // Qtd de cuburi care urmează să fie răspândite public int mTotalCubes = 10; private int mCurrentCubes = 0; // Timpul pentru a da naștere cuburilor public float mTimeToSpawn = 1f; private int mDistanceFromBase = 5; Lista privatămCubes; bool privat mIsBaseOn; scenă privată mScene; #endregion // VARIABLES #regiune UNITY_METHODS // Folosiți acest lucru pentru inițializare void Start () mScene = SceneManager.GetActiveScene (); mCubes = Listă nouă (); dacă (mScene.name == "ShootTheCubesMain") StartSpawn (); // Actualizarea se numește o singură dată pentru fiecare cadru de la nulă Update () #endregion // UNITY_METHODS
Apoi, trebuie să creați două metode publice pentru a primi apeluri de la TargetBehaviorScript
când obiectivul este găsit sau pierdut:
BaseOn (Vector3 basePosition)
va fi apelat atunci când obiectivul este găsit de aparatul de fotografiat și de Baza obiect este afișat. Acesta va schimba poziția de reproducere, va începe procesul și va informa toate cuburile care au fost adăugate anterior la etapa pe care baza este vizibilă.
BaseOff ()
metoda va fi utilizată atunci când obiectivul este pierdut. Acesta va opri procesul de staționare și va informa toate elementele cubului că baza a fost pierdută.
#region PUBLIC_METHODS // Baza a fost găsită de publicul void tracker public BaseOn (Vector3 basePosition) Debug.Log ("SpawnScript2: BaseOn"); mIsBaseOn = adevărat; // schimba pozitia SetPosition (basePosition); // începe procesul de reproducere dacă este necesar StartSpawn (); // informează toate cuburile pe ecran pe care le-a apărut baza InformBaseOnToCubes (); // Baza pierdută de voia publicului tracker BaseOff () mIsBaseOn = false; mSpawningStarted = false; // informează toate cuburile de pe ecran că baza este pierdută InformBaseOffToCubes (); #regiunea_regiunea // PUBLIC_METHODS
SetPosition (System.Nullable
utilizează poziția curentă a țintă pentru a modifica axele obiectului x, y și z și poate primi, de asemenea, a nul
când scena este încărcată ShootTheCubesMain.
#region PRIVATE_METHODS // Vom folosi un Coroutine pentru a da puțin // întârziere înainte de a seta poziția privată IEnumerator ChangePosition () Debug.Log ("ChangePosition"); randamentul randament nou WaitForSeconds (0.2f); // Definiți poziția Spawn o singură dată // modificați poziția numai dacă Vuforia este activă dacă (VuforiaBehavior.Instance.enabled) SetPosition (null); // Setați poziția privată void SetPosition (System.Nullablepos) if (mScene.name == "ShootTheCubesMain") // obțineți poziția camerei Transformați cam = Camera.main.transform; // setați poziția 10 unități înaintea poziției camerei transform.position = cam.forward * 10; altfel dacă (mScene.name == "DefendTheBase") if (pos! = null) Vector3 basePosition = (Vector3) pos; transform.position = Vector3 nou (basePosition.x, basePosition.y + mDistanceFromBase, basePosition.z);
InformBaseOnToCubes ()
și InformBaseOffToCubes ()
sunt responsabili pentru informarea tuturor cuburilor etapizate cu starea actuală de bază.
// Informați toate cuburile spawned ale poziției de bază private void InformBaseOnToCubes () // Debug.Log ("InformBaseOnToCubes"); foreach (cubul GameObject în mCubes) cube.GetComponent() .SwitchBaseStatus (mIsBaseOn); // Informează tuturor cuburilor că baza este închisă privată InformBaseOffToCubes () // Debug.Log ("InformBaseOffToCubes"); foreach (cubul GameObject în mCubes) cube.GetComponent () .SwitchBaseStatus (mIsBaseOn);
SpawnLoop ()
și SpawnElement ()
metodele folosesc aproape aceeași logică ca ultimul tutorial.
// Începe procesul de reproducere privat void StartSpawn () if (! MSpawningStarted) // începe spawn mSpawningStarted = true; StartCoroutine (SpawnLoop ()); // Loop Cub Elemente private IEnumerator SpawnLoop () if (mScene.name == "ShootTheCubesMain") // Definirea poziției de reproducere StartCoroutine (ChangePosition ()); randament randament nou WaitForSeconds (0.2f); // Înmulțirea elementelor în timp ce (mCurrentCubes <= (mTotalCubes - 1)) // Start the process with different conditions // depending on the current stage name if (mScene.name == "ShootTheCubesMain" || (mScene.name == "DefendTheBase" && mIsBaseOn)) mCubes.Add (SpawnElement ()); mCubes [mCurrentCubes].GetComponent() .SwitchBaseStatus (mIsBaseOn); mCurrentCubes ++; randament randament nou WaitForSeconds (Random.Range (mTimeToSpawn, mTimeToSpawn * 3)); // Spawn un cub privat GameObject SpawnElement () // spaționează elementul într-o poziție aleatorie, într-o sferă imaginară GameObject cube = Instanțiate (mCubeObj, (Random.insideUnitSphere * 4) + transform.position, transform.rotation) ca GameObject; // definiți o scală aleatorie pentru scara float cub = Random.Range (0.5f, 2f); // modificați scara cubului cube.transform.localScale = Vector3 nou (scară, scală, scală); cub retur; #endregion // PRIVATE_METHODS
Acum va trebui să creăm niște dușmani. Vom folosi cub obiect pe care l-am creat în ultimul tutorial, făcând unele modificări în scenariul său.
În prefabricate dosar, adăugați o cub obiectează la ierarhie. Apoi selectați obiectul și editați CubeBehaviorScript.
Vom păstra aproape aceeași logică în acest scenariu, dar cu următoarele diferențe:
utilizând UnityEngine; folosind UnityEngine.SceneManagement; utilizând System.Collections; clasa publică CubeBehaviorScript: MonoBehavior #region VARIABLES public float mScaleMax = 1f; public float mScaleMin = 0.2f; public int mCubeHealth = 100; // Orbit max Viteză publică flotantă mOrbitMaxSpeed = 30f; viteza floatului publicToBase = 0.4f; daune public int = 10; // viteza orbită privată float mOrbitSpeed; // direcția orbită privată Vector3 mOrbitDirection; // Max Cube Scale privat Vector3 mCubeMaxScale; // Mărirea vitezei publice float mGrowingSpeed = 10f; bool privat mIsCubeScaled = false; bool privat mIsAlive = adevărat; AudioSource privat mExplosionFx; privat GameObject mBase; bool privat mIsBaseVisible = false; privat Vector3 mRotationDirection; scenă privată mScene; #endregion
Dacă numele scenei este DefendTheBase
, trebuie să găsească Baza obiect și începe să se deplaseze spre el.
#region UNITY_METHODS void Start () // Obține numele scenei mScene = SceneManager.GetActiveScene (); CubeSettings (); void Update () // face orbita cubului si roteste RotateCube (); dacă (mScene.name == "DefendTheBase") // mutați cubul spre bază, când este vizibil MoveToBase (); // cub de scară dacă este necesar dacă (! mIsCubeScaled) ScaleObj (); #endregion
CubeSettings ()
trebuie, de asemenea, să se adapteze în funcție de scenă încărcată. cub numai orbite pe axa y pentru DefendTheBase
scenă.
#region PRIVATE_METHODS privat void CubeSettings () // definirea direcției orbite float x = Random.Range (-1f, 1f); float y = Random.Range (-1f, 1f); float z = Random.Range (-1f, 1f); // TODO actualizați tutorial cu cod nou // definiți setările în funcție de numele scenei dacă (mScene.name == "ShootTheCubesMain") mOrbitDirection = nou Vector3 (x, y, z); altfel dacă (mScene.name == "DefendTheBase") // orbită numai pe axa y mOrbitDirection = new Vector3 (0, y, 0); // dimensiunea scării trebuie să fie limitată mScaleMin = 0.05f; mScaleMax = 0.2f; velocityToBase = 0.2f; // se rotește în jurul axei plutitoare rx = Random.Range (-1f, 1f); float ry = Random.Range (-1f, 1f); float rz = Random.Range (-1f, 1f); mRotationDirection = Vector3 nou (rx, ry, rz); // definirea vitezei mOrbitSpeed = Random.Range (5f, mOrbitMaxSpeed); // definește scale scară float = Random.Range (mScaleMin, mScaleMax); mCubeMaxScale = Vector3 nou (scară, scală, scală); // set cub scară la 0, să crească mai târziu transform.localScale = Vector3.zero; // obținerea efectului sonor al exploziei mExplosionFx = GetComponent();
Vom adăuga o nouă logică la RotateCube ()
metodă. Obiectele cubului se vor roti în jurul bazei în timp ce țintă este vizibilă. Atunci când ținta nu este vizibilă, ei vor continua să se rotească în jurul valorii de aparat foto, folosind aceeași logică ca și în ultimul tutorial.
// Rotiți cubul în jurul valorii de void private RotateCube () // rotiți în jurul bazei sau al camerei dacă (mIsBaseVisible && mBase! = Null && mIsAlive) // rotiți cubul în jurul valorii de transform.RotateAround (mBase.transform.position, mOrbitDirection , mOrbitSpeed * Time.deltaTime); altceva transform.RotateAround (Camera.main.transform.position, mOrbitDirection, mOrbitSpeed * Time.deltaTime); transform.Rotați (mRotationDirection * 100 * Time.deltaTime); // Scalare obiect de la 0 la 1 void privat ScaleObj () // cresterea vol if (transform.localScale! = MCubeMaxScale) transform.localScale = Vector3.Lerp (transform.localScale, mCubeMaxScale, Time.deltaTime * mGrowingSpeed); altfel mIsCubeScaled = true;
Pentru a muta obiectul spre bază, va trebui să verificăm mai întâi dacă baza este prezentă și apoi să aplicăm pașii de poziție asupra obiectului.
// Muta cubul spre vointa privata void MoveToBase () // face cubul sa se miste spre baza numai daca baza este prezenta daca (mIsBaseVisible && mIsAlive && gameObject! = Null && mBase! = Null) float step = vitezaToBase * Time.deltaTime; transform.position = Vector3.MoveTowards (transform.position, mBase.transform.position, step);
DestroyCube ()
metoda este aceeași ca înainte, dar acum vom adăuga o nouă metodă - TargetHit (GameObject)
metodă - care va fi apelată atunci când baza este lovită. Rețineți că BaseHealthScript menționată în TargetHit ()
încă nu a fost creată.
// a face o pagubă la țintă privată void TargetHit (GameObject țintă) Debug.Log ("TargetHit:" + target.name); dacă (target.name == "Base") // face daune pe bază MyBase baseCtr = target.GetComponent(); baseCtr.TakeHit (daune); StartCoroutine (DestroyCube ()); // Distruge Cube privat IEnumerator DestroyCube () mIsAlive = false; mExplosionFx.Play (); GetComponent () .enabled = false; randamentul randament nou WaitForSeconds (mExplosionFx.clip.length); Distruge (gameObject); #endregion
În cele din urmă, vom adăuga metodele publice care trebuie apelate atunci când cubul face o lovitură, atunci când se ciocnește cu baza sau când starea modifică starea.
#region PUBLIC_METHODS // Cub gor Hit // return 'false' când cubul a fost distrus public bool Hit (int hitDamage) mCubeHealth - = hitDamage; dacă (mCubeHealth> = 0 && mIsAlive) StartCoroutine (DestroyCube ()); return true; return false; void public OnCollisionEnter (coliziune col) TargetHit (col.gameObject); // Primeste starea de baza curenta void public SwitchBaseStatus (bool isOn) // opri cubul pe miscare spre baza mIsBaseVisible = isOn; dacă (isOn) mBase = GameObject.Find ("Base"); altceva mBase = null; #endregion
Inamicii sunt înșiși și zboară spre bază, dar nu provoacă daune atunci când se ciocnesc - nici la bază, nici la inamic. Trebuie să creați un script pentru a răspunde la coliziuni și, de asemenea, să adăugați o bară de sănătate pe ecran, astfel încât utilizatorul să știe cât de bine se face.
Să începem să adăugăm bara de sănătate. În Ierarhie panou în editorul Unity, faceți clic pe Crea > UI > cursor. Un nou pânză elementul va fi adăugat la ierarhie. Acesta conține elemente UI, inclusiv noul cursor. Extindeți pânză și selectați cursor.
Schimbați numele elementului glisant la UIHealth. În Inspector panou, extindeți Rect Transform și stabilit Lăţime la 400 și Înălţime la 40. A stabilit Pos X la -220, Pos Y la 30, și Pos Z la 0.
Extindeți acum sliderul în ierarhie. Deselectați Interactable opțiune. Pentru Grafic țintă, faceți clic pe micul "punct" din partea dreaptă și selectați fundal imagine.
Acum, extindeți cursor pentru a expune elementele copilului: fundal, Zona de umplere, și Manipulați aria de culori.
# 12F568FF
.# 7FEA89FF
.Acesta este modul în care Fereastră de joc ar trebui să se uite cu bara de sănătate.
Codul este foarte simplu; doar scade daunele produse de inamici din suma totală a sănătății bazei. Odată ce sănătatea ajunge la zero, jucătorul pierde jocul. Acesta va adăuga, de asemenea, o animație de rotație la baza. Creați un nou script C # numit MyBase.
utilizând UnityEngine; utilizând UnityEngine.UI; utilizând System.Collections; clasa publica MyBase: MonoBehavior #region VARIABLE public float rotationSpeed = 10f; public health = 100; public AudioClip explosionSoundFx; public AudioClip hitSoundFx; // TODO alege un sunet diferit pentru boot-ul private Hit mIsAlive = true; privat AudioSource mAudioSource; public Slider mHealthSlider; #endregion // VARIABLES #regiune UNITY_METHODS // Folosiți acest lucru pentru inițializare void Start () mAudioSource = GetComponent(); mHealthSlider.maxValue = sănătate; mHealthSlider.value = health; // Actualizarea se numește o singură dată pentru fiecare cadru. Update () RotateBase (); #endregion // UNITY_REGION #regiunea PRIVATE_METHODS privat void RotateBase () if (mIsAlive && gameObject! = null) // implementează rotația obiectului transform.Rotate (Vector3.up, rotationSpeed * Time.deltaTime); // Distruge baza IEnumerator privată DestroyBase () mIsAlive = false; mAudioSource.clip = explozieSoundFx; mAudioSource.Play (); GetComponent () .enabled = false; // informează toți dușmanii că baza este Lost GameObject [] enemies = GameObject.FindGameObjectsWithTag ("Enemy"); foreach (GameObject e în dușmani) egnameObject.GetComponent () .SwitchBaseStatus (false); randamentul randament nou WaitForSeconds (mAudioSource.clip.length); Distruge (gameObject); #endregion // PRIVATE_METHODS #regiunea PUBLIC_METHODS // primi daune publice void TakeHit (int damage) health - = damage; mHealthSlider.value = health; dacă (sănătate <= 0) StartCoroutine (DestroyBase ()); else mAudioSource.clip = hitSoundFx; mAudioSource.Play (); #endregion // PUBLIC_METHODS
Acum trebuie să adăugăm și să configuram scriptul.
Selectează Baza în ierarhie, faceți clic pe Adăugați componenta, și adăugați un Sursă audio. Trageți acum MyBase la Baza element și, în Inspector panou, extindeți MyBase. Selectați un efect sonor pentru explozie și apăsați. Am folosit-o explozie clipul folosit în ultimul tutorial, dar nu ezitați să vă adăugați propriul. În cele din urmă, în Săgeată pentru sănătate, selectează UISlider element.
Noua noastră experiență de joc este aproape finalizată. Trebuie doar să tragem niște lase pentru a începe să ne apărăm baza. Să creăm un script pentru laser!
Mai întâi trageți _PlayerController de la prefabricat dosarului la ierarhie. Extinde _PlayerController și selectați _LaserController. În Inspector panou, găsiți Laser Script și faceți clic pe Editați | ×.
Singurul lucru pe care trebuie să-l schimbăm în acest script este poziția laserului.
// Shot laser privat void Fire () // Obțineți ARCamera Transform Transform cam = Camera.main.transform; // Definirea timpului următorului incendiu mNextFire = Time.time + mFireRate; // Setați originea RayCast Vector3 rayOrigin = locație; // Arătați laserul utilizând un Coroutine StartCoroutine (LaserFx ()); // Susține informațiile despre hit Hitcast; // Setați poziția de origine a liniei laser // Se va adăuga 10 unități în jos de la ARCamera // Am adoptat această logică pentru simplitate Vector3 laserStartPos = Vector3 nou (cam.position.x, cam.position.y -2f, cam .position.z); mLaserLine.SetPoziție (0, laserStartPos); // Verifică dacă RayCast a lovit ceva dacă (Physics.Raycast (rayOrigin, cam.forward, out hit, mFireRange)) // Setați sfârșitul liniei laser la obiectul loves mLaserLine.SetPosition (1, hit.point) ; // verificați tipul de destinație dacă (hit.collider.tag == "Enemy") CubeBehaviorScript cubeCtr = hit.collider.GetComponent(); dacă (cubeCtr! = null) dacă (hit.rigidbody! = null) hit.rigidbody.AddForce (-hit.normal * mHitForce); cubeCtr.Hit (mLaserDamage); altfel // Setați enfo-ul liniei laser pentru a avansa camera // folosind gama laserului mLaserLine.SetPosition (1, cam.forward * mFireRange);
A fost o mulțime de lucruri, dar acum este timpul să jucăm jocul! Imprimați imaginea țintă și încercați să rulați jocul pe telefon sau pe tabletă. Distrează-te și vezi dacă poți să faci niște modalități de îmbunătățire a jocului!
În acest moment, aveți o bună înțelegere a modului în care funcționează sistemul Vuforia și cum să îl utilizați cu Unitatea. Mă aștept să vă bucurați de această călătorie cât am eu. Ne vedem în curând!
Pentru a afla mai multe despre Realitatea Augmented cu Vuforia și Unitate, vizitați cursul nostru video aici pe Envato Tuts+!