ARコンテンツ作成勉強会:VuforiaでつくるスマホAR+VRアプリ

5f248ca41e876017e16453b4e3110337?s=47 shinjism
October 13, 2018

 ARコンテンツ作成勉強会:VuforiaでつくるスマホAR+VRアプリ

Unity Asset Storeで公開されているVuforia AR+VR Sampleを用いたスマホアプリ作成ハンズオンでのスライド

5f248ca41e876017e16453b4e3110337?s=128

shinjism

October 13, 2018
Tweet

Transcript

  1. 1.
  2. 2.
  3. 3.
  4. 4.
  5. 5.
  6. 6.
  7. 7.
  8. 8.
  9. 9.
  10. 10.
  11. 11.
  12. 12.
  13. 13.
  14. 16.
  15. 17.
  16. 18.
  17. 19.
  18. 20.
  19. 21.
  20. 22.
  21. 23.
  22. 24.
  23. 25.
  24. 26.
  25. 27.
  26. 28.
  27. 29.
  28. 31.
  29. 32.
  30. 34.

  31. 35.
  32. 36.
  33. 37.
  34. 38.
  35. 40.
  36. 41.
  37. 42.
  38. 43.
  39. 44.
  40. 45.
  41. 46.
  42. 47.
  43. 48.
  44. 49.
  45. 50.
  46. 51.
  47. 52.
  48. 53.
  49. 54.
  50. 55.
  51. 56.
  52. 57.
  53. 58.
  54. 59.
  55. 60.
  56. 61.
  57. 62.
  58. 63.
  59. 64.
  60. 65.
  61. 66.
  62. 67.
  63. 68.
  64. 69.
  65. 70.
  66. 71.
  67. 72.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { } }
  68. 73.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
  69. 74.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
  70. 75.
  71. 76.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
  72. 77.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
  73. 78.
  74. 79.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる } }
  75. 80.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる } }
  76. 81.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる transform.Rotate(x, y, 0); } }
  77. 82.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる transform.Rotate(x, y, 0); } }
  78. 83.

    /* 省略 */ public class UserHeadRotation : MonoBehaviour { //

    オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる transform.Rotate(x, y, 0); } }
  79. 84.
  80. 85.
  81. 86.
  82. 87.
  83. 88.
  84. 89.
  85. 90.
  86. 91.
  87. 92.
  88. 93.
  89. 94.
  90. 95.
  91. 96.
  92. 97.
  93. 98.
  94. 99.
  95. 100.
  96. 101.
  97. 102.
  98. 103.
  99. 104.
  100. 105.
  101. 106.
  102. 107.
  103. 108.
  104. 110.
  105. 111.
  106. 112.
  107. 113.
  108. 114.
  109. 115.
  110. 116.
  111. 117.
  112. 118.
  113. 119.
  114. 120.
  115. 121.
  116. 122.
  117. 123.
  118. 124.
  119. 125.
  120. 126.
  121. 127.
  122. 128.
  123. 129.
  124. 130.
  125. 131.
  126. 132.
  127. 133.
  128. 134.
  129. 135.
  130. 136.
  131. 137.
  132. 138.
  133. 139.
  134. 140.
  135. 141.
  136. 142.
  137. 143.
  138. 144.
  139. 145.
  140. 146.
  141. 147.
  142. 148.
  143. 149.
  144. 150.
  145. 151.
  146. 152.
  147. 153.
  148. 154.
  149. 155.
  150. 156.
  151. 157.
  152. 158.
  153. 159.
  154. 160.
  155. 161.
  156. 162.
  157. 163.
  158. 164.
  159. 165.
  160. 166.
  161. 167.
  162. 168.

    #region PUBLIC_MEMBER_VARIABLES static public bool isFullScreenMode = true; public GameObject[]

    AROnlyObjects; public GameObject[] VROnlyObjects; [Range(0.1f, 5.0f)] public float transitionDuration = 1.5f; // seconds public Canvas StereoViewDivider; public Animator m_Astronaut, m_Drone; public bool InAR { get { return mTransitionCursor <= 0.66f; } } #endregion PUBLIC_MEMBER_VARIABLES
  163. 169.

    #region PUBLIC_MEMBER_VARIABLES static public bool isFullScreenMode = true; public GameObject[]

    AROnlyObjects; public GameObject[] VROnlyObjects; [Range(0.1f, 5.0f)] public float transitionDuration = 1.5f; // seconds public Canvas StereoViewDivider; public Animator m_Astronaut, m_Drone; public bool InAR { get { return mTransitionCursor <= 0.66f; } } #endregion PUBLIC_MEMBER_VARIABLES
  164. 170.

    void UpdateVisibleObjects() { foreach (var go in VROnlyObjects) { go.SetActive(!InAR);

    } // Start Astronaut and Drone animations in VR mode if (!InAR) { if (m_Astronaut) { m_Astronaut.SetBool("IsDrilling", !InAR); } if (m_Drone != null) { m_Drone.SetBool("IsScanning", !InAR); m_Drone.SetBool("IsShowingLaser", !InAR); m_Drone.SetBool("IsFacingObject", !InAR); } } }
  165. 171.

    void UpdateVisibleObjects() { foreach (var go in VROnlyObjects) { go.SetActive(!InAR);

    } // Start Astronaut and Drone animations in VR mode if (!InAR) { if (m_Astronaut) { m_Astronaut.SetBool("IsDrilling", !InAR); } if (m_Drone != null) { m_Drone.SetBool("IsScanning", !InAR); m_Drone.SetBool("IsShowingLaser", !InAR); m_Drone.SetBool("IsFacingObject", !InAR); } } }
  166. 172.
  167. 173.
  168. 174.
  169. 175.
  170. 176.
  171. 177.
  172. 178.
  173. 179.
  174. 180.
  175. 181.
  176. 182.
  177. 183.
  178. 184.
  179. 185.
  180. 186.
  181. 187.
  182. 188.
  183. 189.
  184. 190.
  185. 191.
  186. 192.
  187. 193.
  188. 194.
  189. 195.
  190. 196.
  191. 197.
  192. 198.
  193. 199.
  194. 200.
  195. 201.
  196. 202.
  197. 203.
  198. 204.
  199. 205.

    /* 省略 */ public class SceneControllerScript : MonoBehaviour { /*

    省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 // ドアを閉める関数 }
  200. 206.

    /* 省略 */ public class SceneControllerScript : MonoBehaviour { /*

    省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 public void OpenDoor () { dt = 0f; doorFlag = true; } // ドアを閉める関数 public void CloseDoor () { dt = 1f; doorFlag = false; } }
  201. 207.
  202. 208.
  203. 209.
  204. 210.
  205. 211.
  206. 212.
  207. 213.

    #region PRIVATE_MEMBER_VARIABLES float mFocusedTime; bool mTriggered; TransitionManager mTransitionManager; Transform cameraTransform;

    #endregion // PRIVATE_MEMBER_VARIABLES /* 省略 */ // オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start() { cameraTransform = Camera.main.transform; mTransitionManager = FindObjectOfType<TransitionManager>(); GetComponent<Renderer>().material = nonFocusedMaterial; }
  208. 214.

    #region PRIVATE_MEMBER_VARIABLES float mFocusedTime; bool mTriggered; TransitionManager mTransitionManager; Transform cameraTransform;

    SceneControllerScript danbocchi; #endregion // PRIVATE_MEMBER_VARIABLES /* 省略 */ // オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start() { cameraTransform = Camera.main.transform; mTransitionManager = FindObjectOfType<TransitionManager>(); GetComponent<Renderer>().material = nonFocusedMaterial; danbocchi = GetComponent<SceneControllerScript>(); }
  209. 215.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  210. 216.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  211. 217.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  212. 218.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  213. 219.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  214. 220.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  215. 221.
  216. 222.
  217. 223.
  218. 224.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  219. 225.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  220. 226.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  221. 227.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  222. 228.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  223. 229.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  224. 230.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  225. 231.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  226. 232.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) yield return new WaitForSeconds(1.0f); // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  227. 233.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  228. 234.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
  229. 235.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // AR←→VR移行をコルーチンとして呼び出す }
  230. 236.

    // フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)

    { // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // AR←→VR移行をコルーチンとして呼び出す StartCoroutine(TransitionXRMode()); }
  231. 237.
  232. 238.
  233. 239.
  234. 240.

    #region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */

    } private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) yield return new WaitForSeconds(1.0f); // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
  235. 241.

    private IEnumerator ResetAfter(float seconds) { Debug.Log("Resetting View trigger after: "

    + seconds); yield return new WaitForSeconds(seconds); Debug.Log("Resetting View trigger: " + name); // Reset variables mTriggered = false; mFocusedTime = 0; Focused = false; UpdateMaterials(false); }
  236. 242.

    private IEnumerator ResetAfter(float seconds) { Debug.Log("Resetting View trigger after: "

    + seconds); yield return new WaitForSeconds(seconds); Debug.Log("Resetting View trigger: " + name); // ドアを閉じる // Reset variables mTriggered = false; mFocusedTime = 0; Focused = false; UpdateMaterials(false); }
  237. 243.

    private IEnumerator ResetAfter(float seconds) { Debug.Log("Resetting View trigger after: "

    + seconds); yield return new WaitForSeconds(seconds); Debug.Log("Resetting View trigger: " + name); // ドアを閉じる danbocchi.CloseDoor(); // Reset variables mTriggered = false; mFocusedTime = 0; Focused = false; UpdateMaterials(false); }
  238. 244.
  239. 245.
  240. 246.
  241. 247.
  242. 248.
  243. 249.
  244. 250.
  245. 251.
  246. 252.
  247. 253.
  248. 254.
  249. 255.
  250. 256.
  251. 257.

    /* 省略 */ public class SceneControllerScript : MonoBehaviour { /*

    省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 public void OpenDoor () { dt = 0f; doorFlag = true; } // ドアを閉める関数 public void CloseDoor () { dt = 1f; doorFlag = false; } }
  252. 258.

    /* 省略 */ public class SceneControllerScript : MonoBehaviour { /*

    省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 public void OpenDoor () { dt = 0f; doorFlag = true; GetComponent<AudioSource>().Play(); } // ドアを閉める関数 public void CloseDoor () { dt = 1f; doorFlag = false; } }
  253. 259.
  254. 260.
  255. 261.
  256. 262.
  257. 264.
  258. 265.
  259. 266.
  260. 267.
  261. 268.
  262. 269.
  263. 270.
  264. 271.
  265. 272.
  266. 273.
  267. 274.
  268. 275.
  269. 276.
  270. 277.
  271. 279.
  272. 280.
  273. 281.
  274. 282.
  275. 283.
  276. 284.
  277. 285.
  278. 286.
  279. 287.
  280. 288.
  281. 289.
  282. 290.
  283. 291.
  284. 292.