This project leverages Unity 2022.3.6f1 and MRTK3.
After cloning this project to your local machine, you should be able to open it, set the build target to Android,
and include the |
|
|
After launching the application, a 3D model of a concept car will appear rotating above a circular stage.
A near menu will appear within the reach of the user, with the upper half displaying a number of buttons to perform the basic indirect interactions available to control the 3D car model. The lower portion of the menu contains a Shared Experience
button that toggles the display of the WiFi Direct control window.
The circular stage has been designed as a simple way to estatablish a main reference point or origin in this AR experience.
Each participant should select, move, and orient the stage in their application to an agreed point in their physical space.
By moving the stage to an agreed upon location in the shared physical world, such as a corner of a table, and rotating the stage so that the green indicator points to an agreed particular wall or location in the local physical space, this sample demonstrates one way to create a common origin between all devices so that the central 3D objects, like the car in this sample, can be rendered into the real world and appear at the same physical location and orientation as seen from each of the devices in the shared experience.
Other options for establishing a common shared origin, such as having each device scan a staticly placed printed Aruco marker into the physical scene, are not demostrated in this sample but are left as potential experiments or explorations to extend or enhance this sample.
The WiFi Direct control window provides the option to either:
Host Service
- Establish and broadcast a WiFi Direct Service for other devices to discover and connect to.
or to
Discover
- Search for available and compatible WiFi Direct services in the local area.
Any one of the devices running the sample application that are going to participate in a shared experience can act as the service session host. To start a shared session, one of the users first needs to press the Host Service
button on their device, then the other users can click the Discover
button on their devices, and the host service should appear in the list of available services shortly thereafter.
📝Note: It can sometimes take a few minutes for the service to appear depending on a number of factors, including the previous state and activity of the devices being used.
Clicking on the service in the list of available services (from the device doing Discovery
) will initiate a connection. Like Discovery, connecting can also be almost instant, or take a minute or two, depending on the previous state of the devices.
The session host will initially receive, and need to confirm, an Invitation to connect
to authorize that the peer is trusted, prior to the connection being established.
📝Note: After the first time connecting, the authorization gets cached, but occassionally may appear on future connection attempts depending on elapsed time and device state.
The host device will list each peer that is connected under the Host Service
button with a connection icon to the right.
The peer will show the connected icon on the right end of the associated Discovered service button.
The near menu on both devices should update the WiFi Direct Service section with the appropriate connection information and highlight the section in green to indicate an active connection.
Something as simple as deleting the ConceptCar
model, importing a new 3D model into the project, and placing it under the 3DModel
gameobject in the scene Hierachy
can be an easy and quick way to generate a new and different Shared Experience. Adjust the postion of your new model on the presentation stage and fit the box colider on the 3DModel
to the new shape. If your new 3D model consists of a number of distinct parts, you could drag and drop certain parts into the Model Controller
's Hideable Parts List
and adjust the text and symbol displayed for the Action Button Windows
, or just remove or change the functionality of the button accordingly, and continue to customize or modify the experience as you see fit.
When using this sample project as a form of template or as a starting point to create a new shared experience project, it is recommended that after cloning or copying the initial project files to a local machine, and before starting to edit/change the project, to first change the application name in the Project Settings:
Edit|Project Settings...|Player|Product Name
And it also helps to adjust the Package Name of the project to be different and unique to avoid conflicting with applications with the same package name.
Edit|Project Settings...|Player|Other|Identification|Package Name
This sample uses the Application.productName string as the Wi-Fi Direct Service name that will get broadcast and discovered by the application. Having a unique package name and service name for each new shared experience application will help avoid issues with different projects trying to install over top of each other, as well as unintended compatibility issues that could occur with users of different shared experience applications making inadvertent or unsupported connections between unrelated applications due to them having the same service name.
📝Note: It is also possible to adjust the
SetServiceName
call and pass something other thanApplication.productName
in order to create a new and appropriate Wi-Fi Direct Service name for a new application.
This is the main virtual content that is the focus of the sample shared experience. The attached Object Manipulator
and Bounds Control
components provide a simple way for the user to interact with and manipulate the 3DModel
.
This virtual stage serves as a location that the virtual 3DModel
is presented on top of, or in relationship to. The location of the stage also serves as a common origin between devices during connected experiences.
If each user initially moves and aligns the stage to an agreed upon common location in the real world (for example the corner of an actual particular table top that happens to be in the physical surroundings) that will result in all users in the shared experience seeing the virtual 3DModel located at and or moving through the same location in the physical space that they share.
A NearMenuBase
virtual UI element will follow the user as they move about. It is not a shared element of this sample experience, and can be dragged by the drag bar to pin it to a convenient location in each user's personal environment. Serving as the main menu for the experience, it consists of two fundamental rows.
- The first row contains four buttons that trigger indirect interactions with the
3DModel
toReset
position and orientation, toggle on/off modelRotation
, toggle on/off elements (Windows Open
) of the 3DModel, and trigger the 3DModel to scale to itsFullsize
. - The second row displays summary WiFi Direct Service details and contains a button to toggle on/off
Shared Experience
WiFiDirectMenu
for establishing WiFi Direct connections with other devices that are running this same sample application in your local area.
Although each user will see their own independant view of their own virtual NearMenuBase
menu, the state of toggle buttons on the first row (and only those indirect interaction buttons) will get updated during a shared experience based on the other user's interactions with the same buttons on their own menus.
Another virtual UI element that is not shared in this sample experience is the WiFiDirectMenu
. It can be toggled on/off from the right-hand side of the second row of the NearMenuBase
.
This virtual WiFi Direct window displays the device name identity that will be shared with other peers beside the window heading.
The Host Service
section provides a way to establish and brodcast a WiFi Direct Service that other devices can discover and connect to. Typically, only one of the users in the shared experience would volunteer or be designated to host a service. As other devices sucessfully connect to the service, their device names will appear in the list in the Host Service portion of the window.
The remaining participants involved in the shared experience would wait until after the designated host has started their service and then use their Discover
button to discover that service. It can take a moment or two, but once the service is discovered, it will appear on a button with the name of the service displayed on it in a list in the Discover portion of the window, and clicking the button will initiate a connection request with the the host service. After the host accepts the invite to connect and the connection is established, a small icon indicating the connection will appear on the button.
Unlike the previously listed objects in the scene hierachy that display some form of visual virtual content to the user, manager objects like the WifiDirectPluginManager
mostly act as a container for a script component that manages some aspect of application logic in the scene. In this case, this manager contains the WifiDirectPluginScript.cs
component mentioned below.
Similar to the manager component mentioned above, the SharedExperienceManager
does not display any visual virtual content to the user and is a simple container for the SharedExperienceScript.cs
components described below.
Attached as a component of the 3DModel
object.
This component implements the button-based, indirect interaction, functionality to Reset
, Rotate
, make Fullsize
, and to show/hide the togglable 3D model elements (Windows Open
). The associated buttons on the NearMenuBase
trigger methods from this script.
Attached as a component of the SharedExperienceManager
object.
This component manages the sharing and processing of user interactions with and from other connected devices and connects to the NearMenuBase
and the main 3DModel
in the user interface to monitor and invoke shared interactions. Communication of this shared information to and from other devices is handled via the referenced WiFiDirectPluginManager
. All shared positional information is calculated as relative to the Stage
, which acts as a common world origin.
Attached as a component of the WifiDirectPluginManager
object.
This component manages communication with the WiFi Direct Plugin and connects to the WiFiDirectMenu
and WiFi Direct Service portion of the NearMenuBase
in the user interface to display information to the user and to respond to user input.
If you have questions that are not covered here, please check the Magic Leap 2 Developer Forum: https://forum.magicleap.cloud/
This sample application contains the 3D model ConceptCar 051 by Unity Fan licensed under CC BY 4.0
Copyright (c) (2023) Magic Leap, Inc. All Rights Reserved. Use of this file is governed by the Developer Agreement, located here: https://www.magicleap.com/software-license-agreement-ml2