ห่างหายไปนานไม่ได้อัพเด็ตพอมีเวลาว่างก็เลยเขียนบทเรียนนี้ขึ้น พอดีมีโปรเจ็คทำ AR เกมผีเลยหยิบ Vuforia SDK มาเขียนร่วมกับ Location Services ง่ายๆ
นักศึกษาในที่ปรึกษาโครงงานโปรเจ็คจบ อยากจะทำ AR แนะนำสถานที่พร้อมตำนานเรื่องผีในมหาวิทยาลัยธุรกิจบัณฑิตย์ ก็เลยมาปรึกษาโครงงานดู เลยให้ลองทำ Prototype ขึ้นมาง่ายๆ ไอเดียคือ AR ที่เน้นเรื่องของ Floor Detection หรือ Ground Detection เหมือน ARKit หรือ ARCore แต่พอจะพัฒนาจริงๆ นักศึกษาบอกว่า Prototype ลองใช้เจ้า Vuforia SDK ดูดีกว่าทำทีเดียวไปเลยก็เลยได้ ต้นแบบ แอพพลิเคชัน AR ตามนี้ที่หยิบเอา Location Based Services มาใช้งานควบคู่ไปด้วย
เริ่มต้นพัฒนา: หลังจากที่ให้คำปรึกษา และประเมินความเป็นไปได้ เราได้เลือก Assets Vuforia เบื้องต้นมาใช้งานนั่นคือ Ground Detection ของ Vuforia ที่รองรับ Unity เป็นที่เรียบร้อย (ระวังเรื่อง License กันสักนิด)
ติดตั้ง Unity 2018 และหา Asset Store “Vuforia Ground Plane” (https://assetstore.unity.com/packages/templates/packs/vuforia-ground-plane-107216) เป็นตัวตั้งต้น:
หากลอง Import ตัว Assets เข้าไปจะเห็นว่าการทำงานไม่ได้ยากเย็นอะไร มี Video Tutorial ให้ดูวิธีการทำด้วยอีกต่างๆ หากดังนั้นผมจะข้ามขั้นตอนนี้ไป เราจะทำ Prototype ผีขึ้นมาแทนตัวนักบินอวกาศ ให้เราใส่ผีเข้าไป แล้ว Set Active เป็น False ก่อน
ลากโมเดลผี (จากเกม Ju-On ไว้ปั้นเสร็จค่อยทำ) ไปไว้ตำแหน่งเดียวกับนักบินอวกาศ แล้วลบตัวเก่าออก หลังจากนั้น Set Active เจ้าผีของเราเป็น False เพื่อซ่อนมันก่อน
ไปที่ Hierarchy ของ Unity คลิกที่ GameObject “PlaneManager”
นำเจ้า Ghost ของเราใส่เข้าไปที่ ช่อง Plane Augmentation แทนนักบินอวกาศที่ลบออกไปแล้ว
สร้าง Game Object ใหม่ขึ้นมาเป็น Empty GameObject ตั้งชื่อว่า “Location” บน Hierarchy เพิ่ม New Script C# เข้าไปชื่อ Class ว่า LocationGPS.cs ใส่ code ดังนี้:
public static LocationGPS Instance{set; get;} public float latitude,longitude; public GameObject ui_ground;
สร้าง Instance ของ LocationGPS Class ตัวเอง พร้อมประกาศตัวแปร latitude และ longitude พร้อมฟังก์ชันในการซ่อน ui_ground หรือปุ่ม เวลาที่ไม่อยู่ใน Location ที่กำหนด
ต่อมาคือ Code สำหรับรับค่าตำแหน่ง GPS พร้อมตรวจสอบว่าระบบปิดอยู่หรือไม่?
private void Start () { Instance = this; DontDestroyOnLoad(gameObject); StartCoroutine(StartLocationService()); } private IEnumerator StartLocationService () { if(!Input.location.isEnabledByUser){ Debug.Log("User has not enabled GPS"); yield break; } Input.location.Start(); int maxWait = 20; while(Input.location.status == LocationServiceStatus.Initializing && maxWait >0){ yield return new WaitForSeconds(1); maxWait--; } if(maxWait <= 0){ Debug.Log("Timed Out!"); yield break; } if(Input.location.status == LocationServiceStatus.Failed){ Debug.Log("Failed to Loaded!"); yield break; } latitude = Input.location.lastData.latitude; longitude = Input.location.lastData.longitude; if(latitude <= 13.9f && longitude <= 100.56){ ui_ground.SetActive(true); }else{ ui_ground.SetActive(false); } yield break; }
พิจารณาส่วนต่อไปนี้:
latitude = Input.location.lastData.latitude; longitude = Input.location.lastData.longitude; if(latitude <= 13.9f && longitude <= 100.56){ ui_ground.SetActive(true); }else{ ui_ground.SetActive(false); } yield break;
เป็นการ กำหนด Area ให้ปุ่ม toggle ตัว AR ปรากฏขึ้นถ้าพิกัดอยู่ในตำแหน่งไม่เกินที่กำหนดไว้
สร้าง New Script ขึ้นมาใน Location เช่นกันเพื่อทำการแสดงผลของ Text โดยเราจะเอา Text บน Tool Bar มาแสดงพิกัด ตั้ง Class ชื่อ: GetGPSText.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class GetGPSText : MonoBehaviour { public Text coordinates; void Update () { coordinates.text = "Lat:"+LocationGPS.Instance.latitude.ToString()+" Long:"+LocationGPS.Instance.longitude.ToString()+""; } }
ไปที่ Hierarchy คลิกที่ Location แล้วลากตามภาพประกอบ
ทดสอบเสียบสาย USB แล้ว Build ลง Android ลองเล่นดู
จะเห็นว่าการดึงพิกัด Location นั้นไม่ใช่เรื่องยากอะไรเลย ทีนี้ก็อยู่ที่โครงงานโปรเจ็คจบ ตำนานผีในมหาวิทยาลัยธุรกิจบัณฑิตย์ที่มีผลเป็นที่ปรึกษาจะออกมาดีไหม และ มหาวิทยาลัยอื่นจะเอาไปเลียนแบบเปล่าก็อีกเรื่องนะครับ 🙂 ยินดีให้เลียนแบบถ้ามันทำให้เด็กนักศึกษาได้ความรู้