จากบทเรียน “สร้าง Virtual Reality บน Google Cardboard ด้วย Unity 3D” ที่แนะนำการสร้าง VR World ไปแล้วรอบนี้เราจะมาทำการเขียนฟังก์ชันการเดินไปข้างหน้า
ให้เราเปิดโครงงานตัวเก่าขึ้นมาครับ
ให้เรากดที่ GameObject ตัว CardboardMain ก่อนครับ แล้วสร้าง New C# Script ใหม่ขึ้นมาว่า Walk.cs ครับ
private const int RIGHT_ANGLE = 90; private bool isWalking = false; CardboardHead head = null; public float speed = 5.0f; public bool walkWhenTriggered; public bool walkWhenLookDown = true; public double thresholdAngle; public bool freezeYPosition; public float yOffset;
ตัวแปรที่ประกาศเป็นไว้หลักจะอยู่ที่
public float speed = 5.0f;
เป็นความเร็วในการเดินหน้าของตัวละครในเกมของ VR ครับ (ซึ่งจะเดินโดยอัตโนมัติ) การเดินอัตโนมัติเราจะเช็ตที่
public bool walkWhenLookDown = true;
ส่วน
public bool walkWhenTriggered;
จะเป็นการอีกวิธีคือเมื่อมีการหันหน้าจะหยุดแล้วหันอีกที หรือมีการเคลื่อนไหวซ้ำเล็กๆ น้อยๆจะเดิน (หัน, หัน หรือ ผงกหัวเล็กน้อย)
public double thresholdAngle; public bool freezeYPosition; public float yOffset;
ส่วนขององศาในการเช็คว่า เราจะเดินไปข้างหน้าคือ LookDown ใช้เส้นองศา หรือเส้นขอบฟ้าตรวจสอบ
เขียนตั้งค่า Camera Component ใน Start() ดังนี้
void Start () { head = Camera.main.GetComponent<StereoController>().Head; }
ส่วนของการทำงานเป็นการตรวจ Update() องศา และ State ของการเดิน หรือหยุด ด้วยการเทียบตัวแปรของ lookDown
void Update () { if (walkWhenTriggered && !walkWhenLookDown && !walkingPlayer && Cardboard.SDK.CardboardTriggered) { walkingPlayer = true; } else if (walkWhenTriggered && !walkWhenLookDown && walkingPlayer && Cardboard.SDK.CardboardTriggered) { walkingPlayer = false; } if (walkWhenLookDown && !walkWhenTriggered && !walkingPlayer && head.transform.eulerAngles.x >= thresholdAngle && head.transform.eulerAngles.x <= RIGHT_ANGLE) { walkingPlayer = true; } else if (walkWhenLookDown && !walkWhenTriggered && walkingPlayer && (head.transform.eulerAngles.x <= thresholdAngle || head.transform.eulerAngles.x >= RIGHT_ANGLE)) { walkingPlayer = false; } if (walkWhenLookDown && walkWhenTriggered && !walkingPlayer && head.transform.eulerAngles.x >= thresholdAngle && Cardboard.SDK.CardboardTriggered && head.transform.eulerAngles.x <= RIGHT_ANGLE) { walkingPlayer = true; } else if (walkWhenLookDown && walkWhenTriggered && walkingPlayer && head.transform.eulerAngles.x >= thresholdAngle && (Cardboard.SDK.CardboardTriggered || head.transform.eulerAngles.x >= RIGHT_ANGLE)) { walkingPlayer = false; } if (walkingPlayer) { Vector3 direction = new Vector3(head.transform.forward.x, 0, head.transform.forward.z).normalized * speed * Time.deltaTime; Quaternion rotation = Quaternion.Euler(new Vector3(0, -transform.rotation.eulerAngles.y, 0)); transform.Translate(rotation * direction); } if(freezeYPosition) { transform.position = new Vector3(transform.position.x, yOffset, transform.position.z); } }
พิจารณาในส่วนนี้ Trigger จะมีการตรวจสถานะตามนี้ครับ
if (walkWhenTriggered && !walkWhenLookDown && !walkingPlayer && Cardboard.SDK.CardboardTriggered) { walkingPlayer = true; } else if (walkWhenTriggered && !walkWhenLookDown && walkingPlayer && Cardboard.SDK.CardboardTriggered) { walkingPlayer = false; }
และ Lookdown ตรวจการเทียบการก้มหน้า กับองศาตามนี้
if (walkWhenLookDown && !walkWhenTriggered && !walkingPlayer && head.transform.eulerAngles.x >= thresholdAngle && head.transform.eulerAngles.x <= RIGHT_ANGLE) { walkingPlayer = true; } else if (walkWhenLookDown && !walkWhenTriggered && walkingPlayer && (head.transform.eulerAngles.x <= thresholdAngle || head.transform.eulerAngles.x >= RIGHT_ANGLE)) { walkingPlayer = false; } if (walkWhenLookDown && walkWhenTriggered && !walkingPlayer && head.transform.eulerAngles.x >= thresholdAngle && Cardboard.SDK.CardboardTriggered && head.transform.eulerAngles.x <= RIGHT_ANGLE) { walkingPlayer = true; } else if (walkWhenLookDown && walkWhenTriggered && walkingPlayer && head.transform.eulerAngles.x >= thresholdAngle && (Cardboard.SDK.CardboardTriggered || head.transform.eulerAngles.x >= RIGHT_ANGLE)) { walkingPlayer = false; }
ทดสอบเล็กน้อย
แบบอัดหน้าจอไว้ให้
น่าจะใช้สร้างเกม VR ได้ละ – Project ต่อไปทดสอบ Trigger เกม สยองขวัญ ตกใจกรี๊ดกร๊าดดดด
Ref: Jupp Otto, "Autowalk Script for the Google Cardboard Unity SDK",สืบค้นเมื่อ 07/2015