วิธีการของฉันส่วนใหญ่จะคล้ายกับวิธีแก้ปัญหาที่ผู้อื่นให้ :) ฉันจะพยายามอธิบายรายละเอียดเกี่ยวกับวิธีการที่ฉันใช้เพื่อทำให้เกมเป็นอิสระจากขนาดหน้าจอ
การวางแนวหน้าจอ
ขึ้นอยู่กับการวางแนวหน้าจอ (แนวนอนหรือแนวตั้ง) คุณต้องพิจารณาว่ากล้องจะปรับขนาดด้วยความสูงคงที่หรือความกว้างคงที่หรือไม่ ส่วนใหญ่ฉันเลือกความกว้างคงที่สำหรับเกมแนวนอนและความสูงคงที่สำหรับเกมแนวตั้ง
การปรับขนาดกล้อง
ตามที่กล่าวไว้นี้อาจเป็นความสูงคงที่หรือความกว้างคงที่
ความสูงคงที่ : พื้นที่แนวตั้งของเกมจะพอดีกับความสูงของหน้าจอ และเมื่อการเปลี่ยนแปลงอัตราส่วนหน้าจอจะมีการเพิ่มพื้นที่พิเศษทางด้านซ้ายและขวาของหน้าจอ ในการใช้สิ่งนี้คุณไม่จำเป็นต้องใช้รหัสอะไรเลยมันเป็นพฤติกรรมเริ่มต้นของกล้องเอกภาพ
ความกว้างคงที่ : พื้นที่แนวนอนของเกมจะพอดีกับความกว้างของหน้าจอเสมอ และจะมีการเพิ่มพื้นที่พิเศษที่ด้านบนและด้านล่างเมื่ออัตราส่วนภาพของหน้าจอเปลี่ยนไป ในการดำเนินการนี้คุณต้องเขียนโค้ดขนาดเล็ก ในภายหลังให้แน่ใจว่าคุณลบฟังก์ชั่นการอัพเดทฟอร์มโค้ดและวางไว้ในโหมดตื่น
using UnityEngine;
[ExecuteInEditMode]
public class ScaleWidthCamera : MonoBehaviour {
public int targetWidth = 640;
public float pixelsToUnits = 100;
void Update() {
int height = Mathf.RoundToInt(targetWidth / (float)Screen.width * Screen.height);
camera.orthographicSize = height / pixelsToUnits / 2;
}
}
ในโปรแกรมแก้ไขคุณสามารถเปลี่ยน targetWidth เพื่อกำหนดพื้นที่โลกที่คุณต้องการแสดง รหัสนี้มีการอธิบายในวิดีโอต่อไปนี้พร้อมกับแนวทางปฏิบัติอื่น ๆ อีกมากมายสำหรับเกม 2D :)
Unite 2014 - แนวทางปฏิบัติ 2 มิติที่ดีที่สุดในความสามัคคี
อัตราส่วนภาพ
อัตราส่วนภาพต่อไปนี้แสดงจากที่กว้างที่สุดถึงแคบที่สุดครอบคลุมขนาดหน้าจอเกือบทั้งหมดสำหรับทั้ง Android และ iOS
- 5: 4
- 4: 3
- 3: 2
- 16:10
- 16: 9
ฉันมักจะตั้งค่าอัตราส่วนภาพทั้งหมดเหล่านี้ตามลำดับที่กำหนดภายใต้หน้าต่างเกมเนื่องจากสะดวกในขณะทดสอบขนาดหน้าจอที่แตกต่างกัน :)
พื้นที่ที่สามารถใช้ได้
นี่คือพื้นที่ที่เพิ่มลงในหน้าจอไปทางด้านข้างหรือด้านบน / ล่างขึ้นอยู่กับการปรับขนาดกล้องที่คุณเลือก
สำหรับความสูงคงที่องค์ประกอบของเกมทั้งหมดควรจะพอดีกับอัตราส่วน 16: 9 ซึ่งแคบที่สุด และพื้นหลังควรขยายจนครอบคลุมอัตราส่วน 5: 4 ซึ่งทำให้แน่ใจได้ว่าเกมของคุณจะไม่มีแถบสีดำด้านข้าง
สำหรับความกว้างคงที่มันเกือบจะเหมือนกัน แต่ที่นี่องค์ประกอบควรมีอัตราส่วน 5: 4 และ BG ควรขยายจนถึง 16: 9
ขอบเขต
บางครั้งเราไม่สามารถใช้วิธีการใช้พื้นที่ได้เนื่องจากเราจำเป็นต้องใช้หน้าจอทั้งหมดที่มีสำหรับการเล่นเกม
ตัวอย่างเช่นพิจารณาเกมแนวตั้งที่มีความสูงคงที่จับเหรียญที่ตกลงมาจากท้องฟ้า ในเรื่องนี้เราต้องให้ความสามารถของผู้เล่นในการเลื่อนในแนวนอนเหนือความกว้างของหน้าจอที่มีอยู่
ดังนั้นเราจึงต้องการขอบเขตของกล้องในแง่ของพิกัดโลกเพื่อที่จะรู้ว่าคลิปซ้าย, ขวา, บนหรือล่างของตำแหน่งกล้องอยู่ที่ตำแหน่งใดของโลก
นอกจากนี้เรายังสามารถใช้ขอบเขตเหล่านี้เพื่อยึดองค์ประกอบเกมหรือ UI ไปยังด้านที่ต้องการของกล้อง
การใช้ Camera.ViewportToWorldPoint เราสามารถรับขอบเขตพื้นที่การแสดงผลได้ถูกทำให้เป็นมาตรฐานและสัมพันธ์กับกล้อง ด้านล่างซ้ายของกล้องคือ (0,0); ด้านบนขวาคือ (1,1) ตำแหน่ง z อยู่ในหน่วยโลกจากกล้อง สำหรับ 2D / orthographic z ไม่สำคัญ
Vector3 leftBottom = camera.ViewportToWorldPoint(new Vector3(0, 0, camera.nearClipPlane));
Vector3 rightTop = camera.ViewportToWorldPoint(new Vector3(1, 1, camera.nearClipPlane));
float left = leftBottom.x;
float bottom = leftBottom.y;
float right = rightTop.x;
float top = rightTop.y;
UI
สำหรับ UI เราสามารถใช้แนวคิดเดียวกันกับที่เราใช้สำหรับองค์ประกอบเกม หลังจากแนะนำ Unity5 UI และความพร้อมใช้งานของปลั๊กอินเช่น NGUI สิ่งนี้จะไม่เป็นปัญหามาก :)