Unity - สั่งซื้อในเลเยอร์ Z สำหรับวัตถุ


11

ขออภัยถ้าชื่อไม่ตรงกับคำถามของฉันฉันไม่รู้จะอธิบายได้อย่างไร

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

ปัญหาคือว่าถ้าผู้เล่นเดินไปข้างหน้ากำแพงเขาหายตัวไปเพราะลำดับชั้นของผนังอยู่เหนือคำสั่งของผู้เล่น:

ป้อนคำอธิบายรูปภาพที่นี่

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

คำตอบ:


17

เพื่อให้บรรลุผลนี้:

สร้างสองชั้นเรียงลำดับ : พื้นและวัตถุ

ให้ถนนหญ้าและเส้นทางสไปรต์ใช้เลเยอร์พื้นดิน

ให้ตัวละครกำแพงและสไปรท์เฮ้าส์ของคุณใช้เลเยอร์วัตถุ

Sprite บนเลเยอร์ Objects ของคุณต้องการให้ Sprite Mode Pivot Point เป็นด้านล่างซ้ายล่างหรือล่างขวา คุณสามารถเลือกนี้โดยการเลือกสไปรท์ภายในแท็บโครงการของคุณและเลือกจุดหมุนในสารวัตรแท็บเพื่อปรับเทพดาที่ตั้งค่าการนำเข้า

Sprite Import Settings

สำหรับพื้นสไปรต์คุณไม่ต้องกังวลกับการเปลี่ยนคำสั่งซื้อ

อย่างไรก็ตามสำหรับวัตถุคุณสามารถเปลี่ยนลำดับการเรียงของSprite Rendererหรือเปลี่ยนtransform.position.zค่า ฉันขอแนะนำให้เปลี่ยนการแปลงเนื่องจากการลอยตัวอาจจะง่ายกว่าที่จะมองและปรับเมื่อคุณย้ายตัวละครของคุณไปรอบ ๆ ในขณะที่การเปลี่ยนลำดับการเรียงอาจไม่แม่นยำในบางสถานการณ์ขึ้นอยู่กับการวัดและขนาดของวัตถุ ในฉาก

ไม่ว่าในกรณีใดจำเป็นต้องใช้รหัสบางส่วน

public class SpritePositionSetter : MonoBehaviour {

    void Awake () {
        SetPosition();
    }

    void Update () {
        SetPosition();
    }

    void SetPosition () {
        // If you want to change the transform, use this
        Vector3 newPosition = transform.position;
        newPosition.z = transform.position.y;
        transform.position = newPosition;

        // Or if you want to change the SpriteRenderer's sorting order, use this
        GetComponent<SpriteRenderer>().sortingOrder = (int)transform.position.y;
    }

}

สำหรับวิธีการทำเช่นนี้คุณกำลังบอก Sprite ว่าให้ดัชนี Z ตรงกับตำแหน่ง Y

หากคุณแนบสคริปต์นี้กับวัตถุแบบสแตติก (เช่นกำแพง) คุณจะต้องล้างส่วนประกอบในตัวตรวจสอบเพื่อไม่ให้Updateวิธีการนั้นเรียกว่าทุกเฟรม AwakeวิธีการของมันจะโทรSetPositionหนึ่งครั้งและนั่นคือทั้งหมดที่คุณต้องการ

แต่สำหรับตัวละครของคุณปล่อยให้องค์ประกอบถูกทำเครื่องหมายไว้ซึ่งUpdateจะเรียกSetPositionทุกเฟรมซึ่งจะเปลี่ยนลำดับ Z ของตัวละครเมื่อคุณเลื่อนไปรอบ ๆ และในขณะที่คุณเคลื่อนไหวตราบใดที่เทพดาทุกชั้นวัตถุใช้จุดหมุนด้านล่างการเปลี่ยนดัชนี Z ขณะที่คุณเคลื่อนที่จะทำให้แน่ใจว่าตัวละครของคุณปรากฏอยู่ด้านหน้าหรือด้านหลังวัตถุอื่นอย่างเหมาะสม

ขึ้นอยู่กับการตั้งค่ากล้องของคุณคุณอาจต้องคูณตำแหน่ง Z ใหม่ด้วย-1หากดูเหมือนว่าย้อนกลับ

หากคุณต้องการที่จะปรับดัชนี Z ในขณะที่การแก้ไขฉากของคุณตรวจสอบExecuteInEditMode


ฉันค่อนข้างแน่ใจว่าถ้าส่วนประกอบนั้นไม่ถูกต้อง Start () จะไม่ทำงานหรือไม่ทำงาน Awake () ทำงานบนส่วนประกอบที่ไม่ได้ใช้งาน แต่การเริ่มต้นไม่ได้
Uri Popov

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