Unity 2D สามารถใช้สร้างเกมพิกเซลได้หรือไม่?


16

ฉันกำลังดูคุณสมบัติ 2D ใหม่ที่นำมาใช้ใน Unity 4.3 และฉันคิดว่าฉันอาจพลาดอะไรบางอย่าง

สำหรับฉันดูเหมือนว่าพวกเขาได้รับการออกแบบมาสำหรับเกม 2D ความละเอียดสูงซึ่งการปรับสไปรต์นั้นโอเค แต่มันไม่เหมาะสมสำหรับเกมพิกเซลศิลปะ

เทพดาพิกเซลศิลปะถูกออกแบบมาเพื่อแสดงผล 1: 1 พิกเซลบนหน้าจอ: การปรับสเกลทำลายมัน (ยกเว้นการขยายสเกลเชิงเส้นเป็นข้อยกเว้นนั่นคือคุณอาจขยายเป็น 2x, 3x, 4x และอื่น ๆ )

อย่างไรก็ตามฉันไม่พบวิธี "เพียงแค่แสดงตามที่เป็น" เห็นได้ชัดว่า Unity ยืนยันในการปรับขนาดตามความละเอียดที่เหมาะสม: ฉันอาจควบคุมพารามิเตอร์ Camera.size และพารามิเตอร์ "pixels to units" ของ sprite แต่ฉันไม่ได้รับผลลัพธ์นี้


1
ถ้าฉันไม่ผิดเกม "Organ Trail" นั้นทำใน Unity3d ก่อนหน้า 4.3
felipe

คำตอบ:


19

บทความนี้ให้คำอธิบายที่เป็นประโยชน์แม้ว่าจะมาก่อน 4.3:

หากคุณกำลังมองหา“ ศิลปะภาพพิกเซล” ขนาดของกล้องของกล้องก็มีความสำคัญอย่างยิ่ง นี่เป็นส่วนที่ยากที่สุดในการตอกย้ำ 2D ใน Unity

ขนาดภาพ orthographic แสดงว่ามีหน่วยของโลกอยู่ในครึ่งบนของการฉายภาพของกล้อง ตัวอย่างเช่นหากคุณตั้งค่าขนาด orthographic เป็น 5 ขอบเขตของแนวตั้งของวิวพอร์ตจะมีพื้นที่โลก 10 หน่วย (ขอบเขตแนวนอนนั้นขึ้นอยู่กับอัตราส่วนภาพ)

จงจำไว้ว่ารูปสี่เหลี่ยมจตุรัสของคุณคือ 1 หน่วยข้างหนึ่ง นั่นหมายถึงขนาดภาพออโธแกรมบอกให้คุณทราบถึงจำนวนสไปรต์ที่คุณสามารถซ้อนในแนวตั้งในวิวพอร์ต (หารด้วย 2)

ในการแสดงภาพพิกเซลให้ดูสะอาดตาคุณต้องแน่ใจว่าแต่ละพิกเซลของแหล่งที่มาของสไปรต์แมป 1: 1 กับจอแสดงผลวิวพอร์ต คุณไม่ต้องการให้พิกเซลต้นทางถูกข้ามหรือเพิ่มเป็นสองเท่ามิเช่นนั้นสไปรต์ของคุณจะดูผิดเพี้ยนและ“ สกปรก” เคล็ดลับในการตรวจสอบอัตราส่วน 1: 1 นี้คือการตั้งค่าขนาดภาพแบบออโธกราฟที่ตรงกับความละเอียดหน้าจอแนวตั้งของคุณหารด้วยความสูงพิกเซลของสไปรต์

สมมติว่าคุณกำลังทำงานที่ 960x640 และคุณใช้สไปรต์ 64x64 การแบ่งความละเอียดหน้าจอแนวตั้ง (640) ด้วยความสูงพิกเซลของสไปรท์ (64) ให้ผลตอบแทนที่ 10 จำนวนของสไปรต์ 64x64 ที่สามารถวางซ้อนกันในแนวตั้งเป็น 640 พิกเซล โปรดจำไว้ว่าขนาดการันต์มีความสูงครึ่งหนึ่งดังนั้นขนาดออร์โทกราฟของคุณในกรณีนี้จะเท่ากับ 5 (ครึ่งหนึ่งของ 10) ควรมีลักษณะเช่นนี้:

หากคุณตั้งค่าขนาด orthographic ของคุณเป็นครึ่งหนึ่งหรือสองเท่าของเป้าหมายคุณยังอาจได้รับผลลัพธ์ที่ใช้ได้เนื่องจากขนาดแนวตั้งของสไปรท์จะยังคงแบ่งเท่า ๆ กันตามขนาดแนวตั้งของวิวพอร์ต แต่ถ้าคุณตั้งค่าขนาด orthographic ไม่ถูกต้องคุณจะเห็นบางพิกเซลถูกข้ามหรือเพิ่มเป็นสองเท่าและมันจะดูไม่ดีอย่างแน่นอน:

ความละเอียดตัวแปร

คุณไม่จำเป็นต้อง จำกัด อยู่ที่ความละเอียดคงที่เดียวเพื่อให้ภาพพิกเซลสะอาด วิธีที่ง่ายที่สุดในการจัดการความละเอียดของตัวแปรคือการแนบสคริปต์ที่กำหนดเองกับกล้องของคุณซึ่งตั้งค่าขนาด orthographic ตามความละเอียดแนวตั้งในปัจจุบันและขนาดสไปรท์ที่รู้จัก (คงที่) :

// set the camera to the correct orthographic size
// (so scene pixels are 1:1)
s_baseOrthographicSize = Screen.height / 64.0f / 2.0f;
Camera.main.orthographicSize = s_baseOrthographicSize;

แม้ว่าจะเป็นการแก้ไขที่ง่าย แต่ก็มีข้อเสียคือเมื่อความละเอียดหน้าจอลดลงคุณจะเห็นโลกน้อยลงเรื่อย ๆ และสไปรต์จะใช้หน้าจอมากขึ้นเรื่อย ๆ นั่นเป็นผลมาจากการรักษาอัตราส่วน 1: 1 ระหว่างพิกเซลต้นทางและพิกเซลหน้าจอ: สไปรท์ 64x64 ใช้พื้นที่ที่ชัดเจนมากขึ้นที่ 640x480 มากกว่าที่ 1920x1200 ไม่ว่าจะเป็นปัญหาหรือไม่นั้นขึ้นอยู่กับความต้องการของเกมเฉพาะของคุณ

หากคุณต้องการให้สไปรต์ของคุณยังคงมีขนาดที่ชัดเจนโดยไม่คำนึงถึงความละเอียดของหน้าจอให้ตั้งค่าขนาดภาพเป็นค่าคงที่และคงไว้โดยไม่คำนึงถึงความละเอียดของหน้าจอ ข้อเสียคือสไปรต์ของคุณจะไม่มีอัตราส่วนพิกเซลต่อแหล่ง 1: 1 อีกต่อไป คุณสามารถลดผลกระทบที่ไม่ดีของสิ่งนั้นได้โดยอนุญาตให้ใช้ความละเอียดเพียงครึ่งเดียวหรือสองเท่าของความละเอียดเป้าหมายของคุณ

(เน้นบางอย่างเพิ่ม)

เห็นได้ชัดว่าใช้งานได้ดีกว่าถ้าความละเอียดสูงสามารถหารได้ด้วยขนาดของสไปรต์ แต่แม้ว่าจะไม่เป็นเช่นนั้นมันก็ยังให้การประมาณที่ดีของผลลัพธ์ที่ดี


TL; DR :cameraSelf.orthographicSize = screenH / (float)spriteSize / 2f;


5
สิ่งที่มีประโยชน์อีกอย่างคือการตั้งค่าการกรองพื้นผิวเป็น 'จุด'
felipe

@Felipe จุดที่ดี: ฉันลืมเรื่องนี้เพราะฉันคิดออกแล้ว
o0 '
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.