Unity - Thứ tự trong lớp Z cho các đối tượng


11

Xin lỗi nếu tiêu đề không chính xác câu hỏi của tôi là gì, tôi thực sự không biết làm thế nào để mô tả nó.

Tôi có một hình ảnh cho sàn thành phố của tôi và một hình ảnh (cùng kích thước) cho tất cả các bức tường hoặc cây mà người chơi được cho là bị ẩn đằng sau, nếu anh ta đi qua phía sau nó. Kết quả của tôi thậm chí trông không tệ lắm:

Vấn đề là nếu người chơi đi trước bức tường, anh ta sẽ biến mất, bởi vì lớp thứ tự của bức tường nằm trên thứ tự của người chơi:

nhập mô tả hình ảnh ở đây

Có một cách khá đơn giản để khắc phục điều này, hoặc tôi phải thêm tất cả các đối tượng đó bằng tay và kết nối chúng với một số tập lệnh?

Câu trả lời:


17

Để đạt được hiệu quả này:

Tạo hai lớp sắp xếp : GroundObject .

Có con đường, cỏ và con đường của bạn sử dụng lớp Ground.

Yêu cầu nhân vật, tường và nhà của bạn sử dụng lớp Đối tượng.

Sprites trên lớp Đối tượng của bạn sẽ muốn có Điểm xoay chế độ Sprite của chúng ở dưới cùng bên trái, dưới cùng hoặc dưới cùng bên phải. Bạn có thể chọn điều này bằng cách chọn Sprite trong tab Dự án của bạn và chọn điểm xoay trong tab Thanh tra để điều chỉnh cài đặt nhập của sprite .

Cài đặt nhập Sprite

Đối với các sprite mặt đất, bạn sẽ không phải lo lắng về việc thay đổi thứ tự của chúng.

Tuy nhiên, đối với các đối tượng, bạn có thể thay đổi thứ tự sắp xếp Sprite Renderer của chúng hoặc thay đổi transform.position.zgiá trị của chúng . Tôi khuyên bạn nên thay đổi biến đổi, vì phao có thể sẽ dễ nhìn và điều chỉnh hơn khi bạn di chuyển nhân vật của mình, trong khi thay đổi thứ tự sắp xếp có thể trông không chính xác trong các tình huống nhất định, tùy thuộc vào số đo và kích thước của các đối tượng của bạn trong hiện trường.

Trong cả hai trường hợp, một số mã sẽ cần thiết.

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;
    }

}

Đối với bất kỳ cách nào để làm điều này, về cơ bản, bạn đang nói với sprite có chỉ số Z của nó khớp với vị trí Y của nó.

Nếu bạn đính kèm tập lệnh này vào một đối tượng tĩnh (như tường), bạn sẽ muốn bỏ chọn thành phần trong Thanh tra để Updatephương thức của nó không được gọi là mọi khung; Awakephương pháp của nó sẽ gọi SetPositionmột lần và đó là tất cả những gì bạn cần.

Nhưng đối với nhân vật của bạn, hãy để thành phần được đánh dấu để Updatesẽ gọi SetPositionmọi khung hình, điều này sẽ thay đổi thứ tự Z của nhân vật khi bạn di chuyển xung quanh. Và khi bạn di chuyển, miễn là mọi sprite trên lớp Đối tượng đang sử dụng điểm Trục dưới cùng, việc thay đổi chỉ số Z khi bạn di chuyển sẽ đảm bảo nhân vật của bạn xuất hiện trước hoặc sau các đối tượng khác một cách thích hợp.

Tùy thuộc vào thiết lập máy ảnh của bạn, bạn có thể cần nhân vị trí Z mới -1nếu mọi thứ có vẻ ngược.

Nếu bạn muốn điều chỉnh chỉ số Z trong khi chỉnh sửa Cảnh của mình, hãy xem ExecuteInEditMode .


Tôi khá chắc chắn rằng nếu thành phần chưa được sử dụng Start () sẽ không chạy. Awake () chạy trên một thành phần không hoạt động, nhưng bắt đầu thì không.
Uri Popov

Mới kiểm tra; bạn hoàn toàn đúng. Tôi đã cập nhật ví dụ để sử dụng Awakethay thế. Cảm ơn
Chris McFarland
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.