Augmented RealityUnity 3D

การดึง Location Services ของ Unity ร่วมกับ Vuforia SDK

ห่างหายไปนานไม่ได้อัพเด็ตพอมีเวลาว่างก็เลยเขียนบทเรียนนี้ขึ้น พอดีมีโปรเจ็คทำ 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 นั้นไม่ใช่เรื่องยากอะไรเลย ทีนี้ก็อยู่ที่โครงงานโปรเจ็คจบ ตำนานผีในมหาวิทยาลัยธุรกิจบัณฑิตย์ที่มีผลเป็นที่ปรึกษาจะออกมาดีไหม และ มหาวิทยาลัยอื่นจะเอาไปเลียนแบบเปล่าก็อีกเรื่องนะครับ 🙂 ยินดีให้เลียนแบบถ้ามันทำให้เด็กนักศึกษาได้ความรู้

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน