ARFaceManager.cs
4.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
using System;
using System.Collections.Generic;
using UnityEngine.XR.ARSubsystems;
namespace UnityEngine.XR.ARFoundation
{
/// <summary>
/// Creates, updates, and removes <c>GameObject</c>s with <see cref="ARFace"/> components under the <see cref="ARSessionOrigin"/>'s <see cref="ARSessionOrigin.trackablesParent"/>.
/// </summary>
/// <remarks>
/// When enabled, this component subscribes to <see cref="ARSubsystemManager.faceAdded"/>,
/// <see cref="ARSubsystemManager.faceUpdated"/>, and <see cref="ARSubsystemManager.faceRemoved"/>.
/// If this component is disabled, and there are no other subscribers to those events,
/// face detection will be disabled on the device.
/// </remarks>
[RequireComponent(typeof(ARSessionOrigin))]
[DisallowMultipleComponent]
[DefaultExecutionOrder(ARUpdateOrder.k_FaceManager)]
[HelpURL("https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@3.0/api/UnityEngine.XR.ARFoundation.ARFaceManager.html")]
public sealed class ARFaceManager : ARTrackableManager<
XRFaceSubsystem,
XRFaceSubsystemDescriptor,
XRFace,
ARFace>
{
[SerializeField]
[Tooltip("If not null, instantiates this prefab for each created face.")]
GameObject m_FacePrefab;
/// <summary>
/// Getter/setter for the Face Prefab.
/// </summary>
public GameObject facePrefab
{
get { return m_FacePrefab; }
set { m_FacePrefab = value; }
}
[SerializeField]
[Tooltip("The maximum number of faces to track simultaneously.")]
int m_MaximumFaceCount = 1;
/// <summary>
/// Get or set the maximum number of faces to track simultaneously
/// </summary>
public int maximumFaceCount
{
get
{
if (subsystem != null)
{
m_MaximumFaceCount = subsystem.maximumFaceCount;
}
return m_MaximumFaceCount;
}
set
{
if (subsystem != null)
{
m_MaximumFaceCount = subsystem.maximumFaceCount = value;
}
else
{
m_MaximumFaceCount = value;
}
}
}
/// <summary>
/// Get the supported number of faces that can be tracked simultaneously.
/// </summary>
public int supportedFaceCount => subsystem != null ? subsystem.supportedFaceCount : 0;
/// <summary>
/// Raised for each new <see cref="ARFace"/> detected in the environment.
/// </summary>
public event Action<ARFacesChangedEventArgs> facesChanged;
/// <summary>
/// Attempts to retrieve an <see cref="ARFace"/>.
/// </summary>
/// <param name="faceId">The <c>TrackableId</c> associated with the <see cref="ARFace"/>.</param>
/// <returns>The <see cref="ARFace"/>if found. <c>null</c> otherwise.</returns>
public ARFace TryGetFace(TrackableId faceId)
{
ARFace face;
m_Trackables.TryGetValue(faceId, out face);
return face;
}
protected override void OnBeforeStart()
{
subsystem.maximumFaceCount = m_MaximumFaceCount;
}
protected override void OnAfterSetSessionRelativeData(
ARFace face,
XRFace sessionRelativeData)
{
face.UpdateMesh(subsystem);
if (subsystem.SubsystemDescriptor.supportsEyeTracking)
face.UpdateEyes();
}
protected override void OnTrackablesChanged(
List<ARFace> added,
List<ARFace> updated,
List<ARFace> removed)
{
if (facesChanged != null)
{
facesChanged(
new ARFacesChangedEventArgs(
added,
updated,
removed));
}
}
protected override GameObject GetPrefab()
{
return m_FacePrefab;
}
protected override string gameObjectName
{
get { return "ARFace"; }
}
}
}