
ตัวอย่างการปรับมุมกล้อง และสร้าง Camera Control ให้วิ่งตามตัวละครของเราในแนบระนาบ 2.5D ด้วย Unity 3D กับแนวเกม Beat Em Up อีกวิธีหนึ่งที่น่าจะปรับใช้ได้ง่าย
ตัวอย่างก่อนหน้า Unity 2.5D สร้างเกมเดินต่อสู้ Beat Em Up ตอนที่ 1 เราจะใช้งานการหมุนกล้องให้เห็นแนวระนาบเดียว แต่เมื่อทำ Camera วิ่งตามตัวละครจะพบปัญหาคือการ หันข้างซ้ายขวา ตัดปัญหาคือเอากล้องออกมาให้เห็น ฉากกว้างๆ
แต่ถ้าต้องการทำเกมแนว Side Scrolling ที่เป็น 2.5D ล่ะจะทำยังไงดี แบบว่าต้องการให้กล้องวิ่งตามตัวละครไปด้วย บทเรียนนี้จึงได้ปรับแต่งให้ลองทำตามกันดูครับ
สิ่งที่ต้องมี
1. คือตัวละครที่มีการ Rigged กระดูกให้รองรับ Unity ครับ

2. คือฉากสวยๆจาก Asset Store แนะนำให้ลองโหลดตัวนี้ดูครับ https://www.assetstore.unity3d.com/en/#!/content/8312

3. คืออาวุธเท่ และ Animation การต่อสู้การวิ่งการเดินให้ไปหาเตรียมพร้อมไว้ครับ

ต่อไปนี้ผมจะไม่อธิบายเรื่องการ ติดตั้งตัวละครแบบ Humanoid และการสร้าง Animator แล้วนะครับ เพราะคิดว่าน่าจะเป็นกันแล้วจากหลายๆ บทเรียน ศึกษาที่:
- เขียนเกม Unity การทำ Humanoid ให้กับ โมเดลตัวละคร 3 มิติ
- เขียนเกม 3 มิติด้วย Unity การใช้ Animator Controller
ให้ออกแบบฉากให้เรียบร้อย

ทำการเซ็ต Animator กับ Animation ให้เสร็จสรรพ ณ ที่นี้ผมใช้ Parameter ต่อไปนี้
- IsRunning – สำหรับการวิ่ง
- IsAttack – สำหรับการโจมตี
- IsAttack2 – สำหรับการโจมตีแบบสอง
- IsJumping – สำหรับการกระโดด
ทั้งหมดเป็น Bool ครับ

ต่อมาให้เราสร้าง C# Script ขึ้นมาว่า character.cs ครับ ใส่ code ต่อไปนี้ลงไป พร้อมทั้งใส่ Inspector ตามนี้ครับ
Code ไฟล์ character.cs ให้ประกาศ ตัวแปรต่อไปนี้
Animator anim; public float speed = 5F; public float jumpSpeed = 11.0F; public float gravity = 22.0F; private Vector3 moveDirection = Vector3.zero; private Quaternion lookLeft; private Quaternion lookRight;
เมธอด Start() และ Update()
void Start(){
anim = GetComponent <Animator> ();
Time.timeScale = 1;
lookRight = transform.rotation;
lookLeft = lookRight * Quaternion.Euler(0, 180, 0);
}
void Update() {
CharacterController controller = GetComponent<CharacterController>();
if (controller.isGrounded) {
anim.SetBool ("IsRunning", false);
anim.SetBool ("IsAttack", false);
anim.SetBool ("IsAttack2", false);
anim.SetBool ("IsJumping", false);
moveDirection = new Vector3(0, 0, Input.GetAxis("Horizontal"));
moveDirection *= speed;
if (Input.GetKey(KeyCode.A)){
transform.rotation = lookLeft;
moveDirection = transform.TransformDirection(-moveDirection);
moveDirection *= speed;
anim.SetBool ("IsRunning", true);
}
if (Input.GetKey(KeyCode.D)){
transform.rotation = lookRight;
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
anim.SetBool ("IsRunning", true);
}
if (Input.GetKey(KeyCode.P)){
anim.SetBool ("IsAttack", true);
}
if (Input.GetKey(KeyCode.O)){
anim.SetBool ("IsAttack2", true);
}
if (Input.GetButton("Jump")){
moveDirection.y = jumpSpeed;
anim.SetBool ("IsJumping", true);
}
}
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
สังเกตจะเหมือนตัวอย่างก่อนหน้าเลย การบังคับควบคุมตัวละครคือ กด A วิ่งไปซ้าย กด D วิ่งไปขวา กด Space Bar กระโดด กด O,P เป็นการโจมตี
ไปที่ MainCamera บน Scene View สร้าง C# Script ขึ้นมาเช่นกันตั้งชื่อว่า CameraX.cs ครับ ใส่ Code ต่อไปนี้
using UnityEngine;
using System.Collections;
public class CameraX : MonoBehaviour {
public GameObject playerObject;
public float cameraOffset = 2.0F;
void Update(){
Vector3 cameraPosition = new Vector3(playerObject.transform.position.x+ (cameraOffset*3),
playerObject.transform.position.y+ (cameraOffset-1),
playerObject.transform.position.z);
GetComponent<Camera>().transform.position = cameraPosition;
}
}
การกำหนดระยะของกล้องสามารถปรับที่การเพิ่มลดค่าส่วนนี้ตามความเหมาะสมของผู้พัฒนาครับ
playerObject.transform.position.x+ (cameraOffset*3), playerObject.transform.position.y+ (cameraOffset-1),
playerObject.transform.position.z
เป็นการกำหนดค่าให้กล้องวิ่งตามตัวละครของเรา แบบ 2.5D ครับ โดยการหันซ้าย หรือ ขวา นั้นไม่มีผลกับแกนของกล้อง
ทดสอบ ลองวิ่งไปมาในฉากดู จะเห็นว่าโอเคแล้ว
ดูวีดีโอกันหน่อยดีกว่า ว่ามัน Smooth แค่ไหน
ถ้าพัฒนาเกมเป็น Demo เกมแนวนี้ก็จะเหมือนวีดีโอตัวนี้ครับ ยังมี Bug เล็กน้อยคงไม่ว่าอะไรกันนะครับ






