Difference between revisions of "Unity Sandbox"
From Wikicliki
(→Create An Augmented Reality App Webinar by Gen Infiniti Academy, 13 Aug 2020, 7.30pm-9.30pm) |
|||
| Line 25: | Line 25: | ||
* Project Settings > Player > Other setting > Identification > Minimum API Level > Set to Android 7.1 | * Project Settings > Player > Other setting > Identification > Minimum API Level > Set to Android 7.1 | ||
* Build and Run | * Build and Run | ||
| + | |||
| + | === PlaceOnPlace.cs == | ||
| + | |||
| + | <pre> | ||
| + | using System.Collections; | ||
| + | using System.Collections.Generic; | ||
| + | using UnityEngine; | ||
| + | using UnityEngine.XR.ARFoundation; | ||
| + | using UnityEngine.EventSystems; | ||
| + | |||
| + | public class PlaceOnPlane : MonoBehaviour | ||
| + | { | ||
| + | ARRaycastManager raycastManager; | ||
| + | List<ARRaycastHit> hits; | ||
| + | |||
| + | public GameObject model; | ||
| + | |||
| + | void Start() | ||
| + | { | ||
| + | raycastManager = GetComponent<ARRaycastManager>(); | ||
| + | hits = new List<ARRaycastHit>(); | ||
| + | } | ||
| + | |||
| + | // Update is called once per frame | ||
| + | void Update() | ||
| + | { | ||
| + | if (Input.touchCount == 0) | ||
| + | return; | ||
| + | |||
| + | Touch touch = Input.GetTouch(0); | ||
| + | |||
| + | if (IsPointerOverUIObject(touch.position)) | ||
| + | return; | ||
| + | |||
| + | if (raycastManager.Raycast(touch.position, hits)) | ||
| + | { | ||
| + | Pose pose = hits[0].pose; | ||
| + | |||
| + | Instantiate(model, pose.position, pose.rotation); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | bool IsPointerOverUIObject(Vector2 pos) | ||
| + | { | ||
| + | if (EventSystem.current == null) | ||
| + | return false; | ||
| + | PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current); | ||
| + | eventDataCurrentPosition.position = new Vector2(pos.x, pos.y); | ||
| + | List<RaycastResult> results = new List<RaycastResult>(); | ||
| + | EventSystem.current.RaycastAll(eventDataCurrentPosition, results); | ||
| + | return results.Count > 0; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </pre> | ||
Revision as of 13:25, 13 August 2020
Create An Augmented Reality App Webinar by Gen Infiniti Academy, 13 Aug 2020, 7.30pm-9.30pm
- Change build settings to Android/mobile
- Delete Main camera and Directional Light
- Window > Package Manager > AR Foundation > Install
- Window > Package Manager > ARCore XD Plugin > Install
- Window > Package Manager > ARkit Xr Plugin > Install
- Rightclick on Hierarchy Window > XR > AR Session origin
- Double click the tiny AR Session origin > look under inspector > tag: MainCamera
- Rightclick on Hierarchy Window > XR > AR Session (coordinates the real world)
- Rightclick on Hierarchy Window > XR > AR Default Plane
- Click on AR Session Origin in Hierarchy > Look in Inspector > Add Component > AR Raycast Manager (checks for floor)
- Click on AR Session Origin in Hierarchy > Look in Inspector > Add Component > AR Plane Manager (allows you to tag and project things)
- Now we want to add a plane prefab, first we create a folder in project called “prefabs”
- Drag the AR Default Plane into the Prefabs folder
- Drag the blue AR Default Prefab into inspector slot for AR Session Origin > plane manager > plane prefab
- Create in project a scripts folder
- Create a new C# script “PlaceOnPlane”
- Drag and drop this script into AR session origin
- Download free asset butterfly
- Double click on FBX
- Double click on Materials
- Select second sphere (blue metallic) butterfly_Albedo select the material in emissions
- Assets > Butterfly Animated > Prefab > left click on butterfly and drag it inside Place On Place Model (inside AR Session Origin)
- Project Settings > Player > Other setting > Identification > Minimum API Level > Set to Android 7.1
- Build and Run
= PlaceOnPlace.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.EventSystems;
public class PlaceOnPlane : MonoBehaviour
{
ARRaycastManager raycastManager;
List<ARRaycastHit> hits;
public GameObject model;
void Start()
{
raycastManager = GetComponent<ARRaycastManager>();
hits = new List<ARRaycastHit>();
}
// Update is called once per frame
void Update()
{
if (Input.touchCount == 0)
return;
Touch touch = Input.GetTouch(0);
if (IsPointerOverUIObject(touch.position))
return;
if (raycastManager.Raycast(touch.position, hits))
{
Pose pose = hits[0].pose;
Instantiate(model, pose.position, pose.rotation);
}
}
bool IsPointerOverUIObject(Vector2 pos)
{
if (EventSystem.current == null)
return false;
PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = new Vector2(pos.x, pos.y);
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);
return results.Count > 0;
}
}