ใช้พื้นผิวการแสดงผลเพื่อแสดงเนื้อหาของฉากอื่นเป็นพื้นผิว

ปรับปรุงหน้า :
วันที่สร้างเพจ :

สภาพแวดล้อมการตรวจสอบ

หน้าต่าง
  • หน้าต่าง 11
บรรณาธิการ Unity
  • ปี 2021.3.3f1
แพ็คเกจระบบอินพุต
  • 1.3.0

ข้อกําหนดเบื้องต้นสําหรับเคล็ดลับนี้

การตั้งค่าต่อไปนี้ได้ทําไว้ล่วงหน้าเพื่อเป็นหลักฐานสําหรับคําอธิบายของเคล็ดลับนี้

ทีแรก

การแสดงผลพื้นผิวช่วยให้คุณสามารถเขียนภาพวาดของคุณไปยังพื้นผิวแทนหน้าจอ สิ่งนี้ช่วยให้คุณสร้างพื้นผิวได้อย่างอิสระในระหว่างการดําเนินการเกมโดยไม่ต้องเตรียมภาพพื้นผิวล่วงหน้า

นอกจากนี้คุณยังสามารถเขียนไปยังพื้นผิวการแสดงผลที่เปลี่ยนแปลงแบบไดนามิกทุกเฟรมเช่นเพื่อฉายภาพที่แตกต่างจากกล้องหลักบนจอแสดงผลที่มีอยู่ในเกม

การเตรียมภาพ

เมื่อใช้พื้นผิวเรนเดอร์คุณไม่จําเป็นต้องเตรียมภาพ แต่คุณสามารถเตรียมเป็นตัวอย่างเพื่อให้เข้าใจผลการวาดภาพได้ง่ายขึ้น

การสร้างพื้นผิวการแสดงผล

สร้างเนื้อหาจากโครงการ จาก สร้าง ให้เลือก Render Texture

ชื่อสามารถโดยพลการ เนื่องจากไม่ได้ระบุชื่อโดยตรงจาก NewRenderTexture ภายนอกในเวลานี้ให้ปล่อยให้เป็น .

เลือกพื้นผิวการแสดงผลและระบุขนาดจากตัวตรวจสอบ เนื่องจากพื้นผิวการแสดงผลเป็นพื้นที่วาดภาพคุณต้องระบุขนาด คราวนี้ฉันต้องการเขียนฉากที่สร้างขึ้นแยกต่างหากดังนั้นฉันจึงตั้งค่าอัตราส่วนภาพเป็น 16:9

การตั้งค่าปลายทางการแสดงผลพื้นผิว

เลือก "UI" > "Raw Image" จากลําดับชั้นของฉากที่สร้างขึ้นในตอนแรก แสดงเนื้อหาของพื้นผิวการแสดงผลในวัตถุนี้ มันเป็นวัตถุของ UI แต่สิ่งที่คุณต้องการคือส่วนประกอบ "ภาพดิบ" ซึ่งสามารถตั้งค่าเป็นวัตถุอื่นได้

RawImage ถูกวางไว้แล้ว เนื่องจากเป็นวัตถุ UI จึงถูกวางไว้ใน Canvas ฉันยังไม่ได้ตั้งค่าอะไรดังนั้นฉันเพิ่งได้รับสี่เหลี่ยมผืนผ้าสีขาว

เราต้องการให้สเกลเท่ากันดังนั้นเราจึงกําหนดขนาดของวัตถุ RawImage ให้เหมือนกับพื้นผิวการแสดงผล ถ้าคุณรักษาอัตราส่วนกว้างยาวให้เท่าเดิม ผลลัพธ์การวาดจะถูกปรับขนาดแม้ว่าคุณจะเปลี่ยนขนาด แต่ถ้าคุณเปลี่ยนอัตราส่วนกว้างยาว ผลลัพธ์การวาดจะถูกบดขยี้ในแนวตั้งหรือแนวนอน

ส่วนประกอบ Raw Image ของวัตถุ RawImage มี "พื้นผิว" ดังนั้นให้ตั้งค่าพื้นผิวการแสดงผลที่คุณเพิ่งสร้างขึ้นที่นั่น เนื้อหาของพื้นผิวการแสดงผลยังคงว่างเปล่าดังนั้นจึงโปร่งใสในมุมมอง

การสร้างฉากของเนื้อหาการวาดภาพพื้นผิว

จากนั้นสร้างฉากใหม่เพื่อสร้างเนื้อหาที่จะวาดในพื้นผิวการแสดงผล เลือก ไฟล์ จากเมนูแล้วเลือก ฉากใหม่

เนื่องจากตัวอย่างนี้เป็นแบบ 2 มิติ คุณจะเลือกฉาก 2 มิติได้เช่นกัน

สร้างในโฟลเดอร์ Scene SampleSceneTexture ทิ้งชื่อไว้เป็น .

หลังจากสร้างฉากแล้วให้วางวัตถุอย่างเหมาะสม สิ่งที่คุณต้องทําคือตรวจสอบให้แน่ใจว่าคุณรู้เนื้อหาของพื้นผิวการแสดงผล เพื่อยืนยันว่าสิ่งที่ยื่นออกมานอกกล้องไม่ได้ถูกวาดสไปรท์จะถูกวางไว้ใกล้กับกรอบกล้องด้วย

หากวัตถุทับซ้อนกันบริบทของวัตถุจะไม่แน่นอนดังนั้นหากคุณมีพื้นหลังให้ลดลําดับของเลเยอร์พื้นหลัง

หลังจากเลือก "MainCamera" ให้ตั้งค่าพื้นผิวการแสดงผลใน "พื้นผิวเป้าหมาย" สิ่งนี้ทําให้ภาพวาดถูกวาดในพื้นผิวการแสดงผล

ถอดคอมโพเนนต์ Audio Listener ที่ตั้งค่าไว้เป็น MainCamera ออก สิ่งที่คุณต้องมีสําหรับพื้นผิวการแสดงผลคือการวาดภาพดังนั้นคุณไม่จําเป็นต้องมี Audio Listener คําเตือนจะปรากฏขึ้นหากมี "ผู้ฟังเสียง" หลายคนขณะรันไทม์

อย่างไรก็ตามหากคุณเรียกใช้ฉากสําหรับพื้นผิวการแสดงผลในสถานะนี้จะไม่มีอะไรปรากฏบนหน้าจอ นี่เป็นเพราะคุณกําลังวาดภาพบนพื้นผิวเรนเดอร์ หากคุณต้องการตรวจสอบบนหน้าจอให้ลบ "พื้นผิวเป้าหมาย" แล้วดําเนินการ

การตั้งค่าเลเยอร์

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

ขั้นแรกให้เลือก "แก้ไขเลเยอร์" จากเลเยอร์ที่มุมขวาบนของตัวแก้ไข

ชื่อและตําแหน่งเป็นไปตามอําเภอใจ แต่ที่นี่เราจะเพิ่มเลเยอร์ใหม่ RenderTarget ชื่อ .

หลังจากเพิ่มเลเยอร์แล้วให้เปิดฉากสําหรับพื้นผิวการแสดงผลเลือกวัตถุทั้งหมดที่คุณต้องการวาดและเปลี่ยนค่าเลเยอร์เป็นสิ่งที่คุณเพิ่งสร้างขึ้นRenderTarget

SampleSceneTextureการดําเนินการนี้จะสิ้นสุดการแก้ไขฉากดังนั้นโปรดบันทึก

การแสดงพื้นผิวการแสดงผล

SampleSceneเมื่อคุณเปิดฉากแล้ว ให้เพิ่มลงในลําดับชั้นSampleSceneTextureโดยการลากและวางฉาก จากนั้นควรมีสองฉากในลําดับชั้นและเนื้อหาของฉากควรแสดงบนหน้าจอSampleSceneTexture

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

อย่างไรก็ตามไอคอนซ่อนด้วยตาเป็นเพียงการตั้งค่าเพื่อให้มองไม่เห็นในตัวแก้ไขดังนั้นหากคุณเรียกใช้SampleSceneTextureเกมตามที่เป็นอยู่เนื้อหาของฉากจะปรากฏบนหน้าจอด้วย SampleSceneจากนั้นเลือกฉากMain Cameraและยกเลิกการเลือกจาก RenderTarget Culling Mask ในตัวCameraตรวจสอบ สิ่งนี้จะป้องกันไม่ให้วัตถุในเลเยอร์ปรากฏขึ้นเมื่อRenderTargetเกมทํางาน

ลองเล่นเกม มันควรจะปรากฏตามที่ตั้งใจไว้

ลองย้ายพื้นผิวการแสดงผล

อย่างไรก็ตามในสถานะนี้เป็นเรื่องยากที่จะทราบว่ามันทํางานเป็นพื้นผิวการแสดงผลจริงๆหรือเพียงแค่แสดงภาพเป็นพืชดังนั้นเรามาย้ายกัน

เนื้อหาสามารถเป็นอะไรก็ได้ แต่ที่นี่เราจะตั้งค่าการเคลื่อนไหวให้หมุนสไปรท์โดยอัตโนมัติ SelfRotate สร้างสคริปต์และสร้างเป็น .

ที่นี่เราจะรวมกระบวนการง่ายๆในการหมุนตัวเองทีละเล็กทีละน้อย

using UnityEngine;

public class SelfRotate : MonoBehaviour
{
  // 更新はフレームごとに 1 回呼び出されます
  void Update()
  {
    transform.Rotate(0, 0, 0.1f);
  }
}

หลังจากสร้างสคริปต์แล้ว ให้แนบกับวัตถุที่คุณต้องการหมุนมากขึ้นเรื่อยๆ

จากนั้นเรียกใช้เกมและดูว่ามันหมุนหรือไม่ ฉันคิดว่าคุณจะเห็นว่าวัตถุกําลังเคลื่อนที่ในพื้นผิวการแสดงผล

วิธีย้ายหลายฉากพร้อมกัน

ที่นี่เราได้สร้างตัวอย่างง่ายๆเพื่อให้เรามีสองฉากที่ทํางานตั้งแต่เริ่มต้น แต่ในเกมจริงมีหลายกรณีที่คุณต้องเริ่มต้นด้วยฉากเดียว ในกรณีนี้ฉันคิดว่าคุณจะต้องเพิ่มฉากแบบไดนามิกที่จุดเริ่มต้นของฉากเพื่อให้มีหลายฉาก

โปรดดู "การเพิ่มฉาก" สําหรับคําอธิบายวิธีการเพิ่มฉาก SceneManager.LoadScene("<シーン名>", LoadSceneMode.Additive); โดยทั่วไปการโทรควรแก้ปัญหาส่วนใหญ่

วิธีป้องกันไม่ให้เนื้อหาของพื้นผิวการแสดงผลปรากฏบนหน้าจอหลักโดยไม่ต้องใช้เลเยอร์

เนื้อหาของพื้นผิวการแสดงผลจะแสดงบนหน้าจอหลักเนื่องจากฉากหลักและฉากพื้นผิวการแสดงผลอยู่ในที่เดียวกัน ดังนั้นหากคุณย้ายเนื้อหาของพื้นผิวการแสดงผลไปยังสถานที่ที่ไม่เคยแสดงในฉากหลักจะไม่แสดงบนหน้าจอหลัก ตัวอย่างเช่น คุณสามารถย้ายวัตถุพื้นผิวหรือกล้องเรนเดอร์ไปยังตําแหน่ง (-10000, -10000) ได้ วิธีนี้ไม่จําเป็นต้องตั้งค่าเลเยอร์

เมื่อคุณต้องการทําให้เนื้อหาของพื้นผิวการแสดงผลเสร็จสมบูรณ์ในฉากเดียวโดยไม่ต้องแบ่งออกเป็นฉากต่างๆ

สิ่งนี้ทําได้โดยใช้เทคนิคเดียวกับวิธีการก่อนหน้านี้โดยไม่มีเลเยอร์ คุณสามารถย้ายเนื้อหาที่แสดงโดยพื้นผิวการแสดงผลไปยังตําแหน่งที่จะไม่แสดงบนกล้องหลัก ความแตกต่างจากวิธีการแยกฉากคือคุณต้องวางกล้องสองตัว แต่นอกเหนือจากนั้นโดยทั่วไปคุณจะมีการตั้งค่าเดียวกันกับวิธีการแยกฉาก

หากคุณต้องการจับภาพเนื้อหาที่ถ่ายจากมุมมองที่แตกต่างในเกม 3 มิติเป็นพื้นผิวเรนเดอร์

เคล็ดลับนี้ไม่ได้พูดถึง 3D มากนักเพราะเน้นที่ 2D แต่โดยพื้นฐานแล้ววิธีการนั้นเหมือนกัน เนื่องจากคุณกําลังฉายพื้นที่ 3 มิติเดียวจากหลายมุมมองคุณไม่จําเป็นต้องมีฉากมากกว่าสองฉาก สิ่งที่คุณต้องทําคือวางกล้องได้มากเท่าที่คุณต้องการตั้งค่าปลายทางการวาดภาพเป็นพื้นผิวการแสดงผลและตั้งค่าตําแหน่งที่จะแสดงพื้นผิวการแสดงผล