หลังจากที่เคยอัพเด็ตส่วนของการสร้าง VR หรือ Virtual Reality บน Unity และทำงานผ่าน Google Cardboard วันนี้เราจะมาทำ VR Entertainment บน Unity แบบทุนต่ำ ด้วย Fibrum SDK กัน
ทำไมรอบนี้ถึงเลือก Fibrum SDK แทน Cardboard SDK ในการทำงานบน Unity 3D ?
จริงๆ ไม่มีอะไรครับ เพราะเครื่องที่ทดสอบใช้ VR กับ Cardboard ที่รองรับมีอยู่จำกัดและสเปคสูงพอตัว และต้องใช้ Gyro ในการควบคุมมุมสำหรับหมุนแกนของระดับสายตา ก็เลยไปหา VR มาหลายๆ ตัวที่เข้าตาและใช้ได้ก็ Fibrum และ DiveSDK ที่รองรับ เครื่องรุ่นต่ำราคาถูกให้พอใช้งานได้ประมาณนึง (แค่จะขึ้น ข้อความเตือนว่า No Gyro สีแดงกวนเล็กน้อย) เครื่องที่ทดสอบคือ Samsung Galaxy J7, Oppo A33W ที่ไม่มีระบบ Gyro แต่ราคา 5,000 กว่าบาทที่ต้องการเล่น VR ได้ (เพราะแค่โหลด Google Cardboard SDK ก็โดนแจ้งว่าติดตั้งไม่ได้แล้ว) ส่วน เครื่องแพงๆ หรือ iOS รุ่น iPhone5S เป็นต้นไปไม่มีปัญหา ใช้ Library หรือ SDK ไหนก็ได้เลย
ทางเลือกของ Labs นี้ที่ลองดูคือ Fibrum ครับ
ตัว Fibrum เองก็มี Gear ของตัวเองนะครับ และมีแอพพลิเคชันปรากฏอยู่ประมาณนึง
ทีนี้เราจะมาสร้าง Entertainment Complex แบบ VR ที่ใช้ทุนต่ำกันหน่อยดีกว่า!
ให้เปิด Project ของ Unity แบบ 3D ขึ้นมารอไว้ครับ
ไปที่เว็บไซต์ fibrum.com ดาวน์โหลด SDK สำหรับ Unity มาไว้ในเครื่องคอมพิวเตอร์
ดาวน์โหลดที่ SDK เป็นอันเสร็จ
ออกแบบฉากบน Plane ตามทฤษฏี Level Design มาให้พร้อมด้วย Asset ทั้งจากทำเองหรือไม่ทำเองก็ได้ครับ ตกแต่งให้เสร็จสรรพ
ไปที่เมนู Assets -> Import Package -> Custom Package…
เลือกไฟล์ fibrum SDK ทำการ Import เข้า Project เป็นอันเสร็จครับ เราจะมี Prefab พร้อมใช้อยู่แล้ว
สิ่งที่เราจะใช้คือ Joystick_simple_FPS_Camera เป็น Prefab หลักในการวางลงไปในฉากของเราจะเป็นการจำลอง Player FPS และ กล้อง VR ทันที
ทดสอบโดยการ เปิด Play Mode แล้วใช้ Mouse Control มุมกล้อง มุมมอง คลิกเมาส์จะมีกระสุนเป็น Sphere (Clone) เด้งออกจากเราไปข้างหน้าให้พร้อม
ให้เราสร้าง ศัตรูของเราขึ้นมาใส่ Collider ให้เสร็จสรรพ สร้างไฟล์ชื่อ monster.cs ให้เรียบร้อย
using UnityEngine; using System.Collections; public class Monster : MonoBehaviour { public float objectSpeed = 0.003f; public ParticleEmitter ClearBullets; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.Translate(0, 0, objectSpeed); } void OnTriggerEnter(Collider other) { if(other.gameObject.name == "Sphere(Clone)") { Instantiate(ClearBullets, transform.position, transform.rotation); Destroy(other.gameObject); Destroy(gameObject); } } }
เป็นการเช็คให้ ศัตรูของเราวิ่งเข้ามาหา และเมื่อ Monster หรือศัตรูโดน GameObject ชื่อ Sphere(Clone) ก็จะระเบิด
void OnTriggerEnter(Collider other) { if(other.gameObject.name == "Sphere(Clone)") { Instantiate(ClearBullets, transform.position, transform.rotation); Destroy(other.gameObject); Destroy(gameObject); } }
โดยระเบิกใช้ SimpleParticle Pack เป็น Asset ง่ายๆ ไปโหลดมาครับ
Instantiate(ClearBullets, transform.position, transform.rotation);
หลังจากเสร็จแล้วให้ทำการ Clone ตัว monster เป็น Prefabs แล้วลบต้นแบบทิ้งซะ เราจะมาสร้าง DynamicPrefab เป็นจุดปล่อยให้ศัตรูวิ่งไปมาในฉาก ตามเวลาที่กำหนดก็จะออกมาเรื่อยๆ ให้สร้างไฟล์ DynamicPrefab.cs
using UnityEngine; using System.Collections; public class DynamicPrefab : MonoBehaviour { public GameObject monster; public GameObject items; float timeElapsed = 0; float ItemCycle = 3f; bool ItemPowerup = true; // Use this for initialization void Start () { } // Update is called once per frame void Update () { timeElapsed += Time.deltaTime; if(timeElapsed > ItemCycle) { GameObject temp; if(ItemPowerup) { temp = (GameObject)Instantiate(items); Vector3 pos = temp.transform.position; temp.transform.position = new Vector3(Random.Range(-3, 4), pos.y, pos.z); } else { temp = (GameObject)Instantiate(monster); Vector3 pos = temp.transform.position; temp.transform.position = new Vector3(Random.Range(-3, 4), pos.y, pos.z); } timeElapsed -= ItemCycle; ItemPowerup = !ItemPowerup; } } }
จริงๆ เป็น Code เก่าโบล่ำโบราณมาใช้นั่นแหละ สร้าง Empty Game Object ขึ้นมาแล้ว ใส่ DynamicPrefab.cs เข้าไปแล้ว ลาก Monster Prefab ไปวางใน ช่อง Public ซะตามรูป
หลังจากนั้นสร้างฟังก์ชัน Clear GameObject เมื่อมีการระเบิด ด้วยไฟล์ clear.cs วางใน Effect ระเบิด (ศึกษาเพิ่มเอง)
using UnityEngine; using System.Collections; public class Clear : MonoBehaviour { float SecondsUntilDestroy = 1.2f; float startTime; void Start () { startTime = Time.time; } // Update is called once per frame void Update () { if (Time.time - startTime >= SecondsUntilDestroy) { Destroy(this.gameObject); } } }
เมื่อพร้อมแล้วก็มาเล่นกันครับ ให้ทำการ Build เป็น APK ลง Android แล้วไปเล่นกับ Cardboard
Build Apk ของ Android แล้วไปใช้งานกับ Google CardBoard ซะ
จะเห็นว่า มันเดินไม่ได้ มันหมุนได้อย่างเดียว ทำไงดีศัตรูวิ่งเข้ามา ทางออกของการทำ entertainment complex บน VR วันนี้คือการใช้ อุปกรณ์ทุนต่ำครับ นั่นคือ
- OTA USB สำหรับ Android
- USB Mouse หรือ USB Wireless Mouse (สำหรับคลิกแล้วยิง แต่จะเดินไม่ได้)
- USB Joystick (สำหรับกดแล้วยิง และเดินไปมาได้)
นึกภาพไม่ออกก็คือสายนี้
และเมื่อประกอบก็จะเป็นแบบนี้
เสียบ OTA เปิด OTA Mode ใน Developer ของเครื่องโทรศัพท์ Android ทำการ Build APK เสียบลง Google Cardboard ใส่หูฟัง(ถ้ามีเสียง) เราก็จะได้ Low Cost Entertainment VR Complex ที่ทำได้ง่ายๆ แล้ว (อยู่ที่ ไอเดียล้วนๆ)
รีวิวเกมบน Unity
ว่างๆจะทำ คลิปรีวิวเล่นจริงกับ นักศึกษา สาขาการออกแบบเชิงโต้ตอบและการพัฒนาเกม คณะเทคโนโลสารสนเทศ มหาวิทยาลัยธุรกิจบัณฑิตย์ ให้ดูนะครับ
ระหว่างนี้ลองเริ่มต้นทำดูจะรู้ว่ามันง่ายมากๆ
One Comment