ไอเดียจากหนังสยองขวัญ Lights Out (2016) เกี่ยวกับวิญญาณร้าย ที่จะปรากฏกายเวลาที่ไฟดับลงเพราะอยู่ในแสงไฟไม่ได้ บทความนี้เราจะมาทำเทคนิคเกมแนวนี้กันบน Unity 3D
หากใครนึกไม่ออกว่าเกมหรือหนังเรื่องนี้เป็นยังไง แนะนำให้ไปดูหนังสั้นเรื่องนี้ก่อน
และพอมันดึงมากมันก็ถูกสร้างเป็นหนังใหญ่ปี 2016 ครับ ชื่อ Lights Out เหมือนกัน
ไอเดียเกมก็คงทำตามหนังเลย คือกดปิดไฟผีก็จะปรากฏตัว เปิดไฟก็จะหายไป พอปิดอีกทีผีก็จะใกล้เข้ามา เหมาะกับการทำเกม VR เลยทีเดียว (ทำบุญปิดทองหลังพระมาบ่อยละ)
เริ่มพัฒนาเกมครับเปิด Unity 3D ขึ้นมาสร้าง Project ใหม่
สร้างฉากของเราอย่าใช้เวลามากนะครับ แค่ฉากเป็นห้องใส่ cube กันตำแหน่งหลังคาและพื้นเล็กน้อย
ไปที่เมนู Assets เลือก Import Package เลือก Characters เพื่อนำตัวละครสำเร็จรูปของ Unity นั่นคือ First Person เข้ามาใช้งาน
นำมาแค่ First Person นะครับ Ball และ Third Person ไม่จำเป็นเท่าไร ก็ไม่ต้องเอาเข้ามา
ลบ Main Camera ออกนำ First Person ลงไปวางในฉากให้เรียบร้อย
ไปที่ Inspector ส่วนของ Direction Lights ให้ Rotate แกน x เป็น -190 หรือเท่าไรก็ได้เพื่อให้ฉากมันมืดครับ
สร้าง Empty GameObject ขึ้นมาตั้งชื่อว่า “GameSystem” สร้าง C# ขึ้นมาชื่อว่า Lightout.cs ยังไม่ต้องเขียน Code
นำโมเดลผีจากที่ไหนก็ได้ลงไป ถ้าจะให้สมจริงทำ Animator Controller ท่ายืน Idle ให้น่ากลัวจะดีมากวางลงไปในฉากของเกมของเราครับ
มุมกล้องของตัวละครเราจะเห็นดังนี้
ต่อมาสร้าง PointLight ขึ้นมาวางตำแหน่งเป็นดวงไฟ นีออน บนเพดานให้สว่างทั่วห้องประมาณหนึ่ง
เขียนโปรแกรมครับเปิดไฟล์ Lightout.cs ขึ้นมาเขียนคำสั่ง ชิลๆ สบายๆ ตามนี้เลย
using UnityEngine; using System.Collections; public class Lightout : MonoBehaviour { public GameObject theLight; public GameObject Ghost; public bool light = true; public float objectSpeed = 1f; void Start () { Ghost.SetActive(false); } void Update () { if (Input.GetButtonDown("Fire1")){ Debug.Log("Off"); Ghost.SetActive(true); theLight.SetActive(false); Ghost.transform.Translate(0, 0, objectSpeed); } if (Input.GetButtonUp("Fire1")){ Debug.Log("On"); Ghost.SetActive(false); theLight.SetActive(true); Ghost.transform.Translate(0, 0, 0); } } }
ส่วนของการประกาศ GameObject คือเราจะควบคุม GameObject ของแสง และผีในบรรทัดนี้
public GameObject theLight; public GameObject Ghost;
ลาก PointLight ไปวางที่ the Light ได้เลย และลาก Model ผี ของเราไปวางที่ Ghost ทีนี้มาดูคำสั่งควบคุมครับ เปิดเกมมากำหนดให้ผีมองไม่เห็นก่อน
void Start () { Ghost.SetActive(false); }
เมื่อเริ่มเกม คลิกเมาส์ซ้ายค้างจะปิดไฟ การทำงานคือ
if (Input.GetButtonDown("Fire1")){ Debug.Log("Off"); Ghost.SetActive(true); theLight.SetActive(false); Ghost.transform.Translate(0, 0, objectSpeed); }
ผีจะปรากฏ
Ghost.SetActive(true);
พร้อมการเคลื่อนที่เข้ามาเรื่อยๆ ตาม objectSpeed กำหนดไว้แล้วคือ
public float objectSpeed = 1f;
Ghost.transform.Translate(0, 0, objectSpeed);
ไฟจะดับโดยการ SetActive ของ Point Light ให้เป็น False
theLight.SetActive(false);
และถ้ายกนิ้วออกจากเมาส์ไฟจะเปิด ผีจะหายไป และกำหนดให้มันไม่เคลื่อนที่ตามคำสั่ง
if (Input.GetButtonUp("Fire1")){ Debug.Log("On"); Ghost.SetActive(false); theLight.SetActive(true); Ghost.transform.Translate(0, 0, 0); }
ทดสอบดูสิ
Script ขำๆ นั่งดูหนังเสร็จก็ลองเอามาเขียนดู 15 นาทีเสร็จ สบายๆ ให้เด็กๆ เอาไปทำโปรเจ็คเกม VR สบายๆ ได้เลยครับ ตัวอย่าง Video นะครับ
Source Code ดาวน์โหลดที่นี่เลย: https://drive.google.com/file/d/0B08PZSOd4UmObmQ4NXZxVWoxZWM/view?usp=sharing