Unity ARで物体を投げる!

AR

Unity ARで物体を投げる!

UnityのARでスマホをタップすることで、
物体を投げる動作をします。

以下のコードを実行することで
スマホをタップすることで、
Cubeをランダムな色でなげることができます。


namespace GoogleARCore.Examples.HelloAR
{
    using System.Collections.Generic;
    using GoogleARCore;
    using GoogleARCore.Examples.Common;
    using UnityEngine;
    using UnityEngine.EventSystems;

#if UNITY_EDITOR
    using Input = InstantPreviewInput;
#endif

    public class HelloARController : MonoBehaviour
    {
        public Camera FirstPersonCamera;
        public GameObject GameObjectVerticalPlanePrefab;
        public GameObject GameObjectHorizontalPlanePrefab;
        public GameObject GameObjectPointPrefab;
        private const float k_PrefabRotation = 180.0f;
        private bool m_IsQuitting = false;
        public void Awake()
        {
            Application.targetFrameRate = 60;
        }

        public void Update()
        {
            _UpdateApplicationLifecycle();

            Touch touch;
            if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began)
            {
                return;
            }

            //CreatePrimitiveで動的にGameObjectであるCubeを生成する。
            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);

            //Cubeに適用するランダムな色を生成する。
            Material material = new Material(Shader.Find("Diffuse"))
            {
                color = new Color(Random.value, Random.value, Random.value)
            };

            //ランダムに変化する色をCubeに適用する。
            cube.GetComponent<Renderer>().material = material;

            //Android端末をタップして、ランダムな色のCubeを認識した平面上に投げ出すように追加する。
            //追加される、Cubeの大きさも0.2fとして指定する。
            cube.transform.position = FirstPersonCamera.transform.TransformPoint(0, 0, 0.5f);
            cube.transform.localScale = new Vector3(0.2f, 0.2f, 0.2f);

            //CubeにはRigidbodyを持たせて重力をあたえる。
            //RigidBodyで重力を与えないとCubeが宙に浮くため。
            cube.AddComponent<Rigidbody>();
            cube.GetComponent<Rigidbody>().AddForce(FirstPersonCamera.transform.TransformDirection(0, 1f, 2f), ForceMode.Impulse);

            if (EventSystem.current.IsPointerOverGameObject(touch.fingerId))
            {
                return;
            }
        }

        private void _UpdateApplicationLifecycle()
        {
            if (Input.GetKey(KeyCode.Escape))
            {
                Application.Quit();
            }

            if (Session.Status != SessionStatus.Tracking)
            {
                Screen.sleepTimeout = SleepTimeout.SystemSetting;
            }
            else
            {
                Screen.sleepTimeout = SleepTimeout.NeverSleep;
            }

            if (m_IsQuitting)
            {
                return;
            }

            if (Session.Status == SessionStatus.ErrorPermissionNotGranted)
            {
                _ShowAndroidToastMessage("Camera permission is needed to run this application.");
                m_IsQuitting = true;
                Invoke("_DoQuit", 0.5f);
            }
            else if (Session.Status.IsError())
            {
                _ShowAndroidToastMessage(
                    "ARCore encountered a problem connecting.  Please start the app again.");
                m_IsQuitting = true;
                Invoke("_DoQuit", 0.5f);
            }
        }

        private void _DoQuit()
        {
            Application.Quit();
        }

        private void _ShowAndroidToastMessage(string message)
        {
            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject unityActivity =
                unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");

            if (unityActivity != null)
            {
                AndroidJavaClass toastClass = new AndroidJavaClass("android.widget.Toast");
                unityActivity.Call("runOnUiThread", new AndroidJavaRunnable(() =>
                {
                    AndroidJavaObject toastObject =
                        toastClass.CallStatic<AndroidJavaObject>(
                            "makeText", unityActivity, message, 0);
                    toastObject.Call("show");
                }));
            }
        }
    }
}

Unity ARで物体を投げる実行

以下の様にCubeをタップで投げることが
できました。

しかし、投げたCubeが地の果てへと
消えてしまっています。
次回は、Cubeが積みあがるように
したいと思います。

コメント

タイトルとURLをコピーしました