Làm cách nào để chỉnh sửa các cặp khóa-giá trị (như Từ điển) trong trình kiểm tra của Unity?


18

Tôi có một hệ thống chính tả tôi đang tạo, nguyên tắc như sau:

  • Mỗi câu thần chú là một prefab tự trị. Nó chứa một tập lệnh với một số thuộc tính (sát thương cơ bản, thời lượng ...) có thể được sửa đổi trong trình kiểm tra.
  • Tôi có một phép thuật liệt kê tất cả các phép thuật có thể có trong mã, được sử dụng trong logic trò chơi
  • Khi tôi muốn sử dụng một câu thần chú, tôi cần có khả năng lấy prefab của câu thần chú này để khởi tạo nó và đọc thông tin của nó
  • Mỗi diễn viên (có thể là người chơi hoặc kẻ thù) cần có một danh sách các hình ảnh động có thể có cho các phép thuật

Các vấn đề với cách tôi đang cố gắng thực hiện là:

  • Để liệt kê hoạt hình của từng diễn viên, tôi có thể sử dụng một Dictionary<Spell, Animation>, nhưng từ điển không được thanh tra hỗ trợ, điều này khiến cho việc chỉnh sửa nhiều loại diễn viên trở nên khó khăn.
  • Tôi cần một số cách để dễ dàng truy cập một prefab chính tả từ enum tương ứng. Ở đây tôi cũng có thể sử dụng một từ điển nhưng tôi chỉ có thể tham khảo các prefab trong thanh tra, không phải trong mã, có nghĩa là tôi sẽ không thể điền từ điển này

Tôi đang tìm kiếm một cách dễ dàng liên kết các phép thuật của mình với các prefab và hoạt hình tương ứng


1
Tôi có thể đề nghị thay đổi tiêu đề của câu hỏi này để đề cập đến việc có hành vi giống từ điển (ánh xạ các cặp giá trị khóa) trong thanh tra của Unity không? Điều này sẽ giúp làm cho câu hỏi dễ tìm hơn đối với những người dùng khác đang hoặc đang tìm kiếm ý tưởng để giải quyết loại vấn đề này. Mặc dù trường hợp cụ thể này là về phép thuật, các kỹ thuật tương tự được áp dụng rộng rãi hơn.
DMGregory

@DM Tôi không biết Unity, nhưng lý luận chung của bạn nghe có vẻ hợp lý. Hãy mạnh dạn và chỉnh sửa; rollback là giá rẻ.
Anko

Câu trả lời:


24

Một cách nhanh chóng để có được các cặp khóa-giá trị trong trình kiểm tra của Unity là xác định lớp mục nhập tuần tự hóa, sau đó sử dụng một mảng hoặc Danh sách <> của chúng. ví dụ...

public class SpellAnimationMap : ScriptableObject
{
   [System.Serializable]
   public class SpellAnimationEntry
   {
       public Spell spell;
       public AnimationClip animation;
   }

   public SpellAnimationEntry[] spellAnimations;    
}

Tự động, điều này sẽ cung cấp cho bạn một danh sách có thể thay đổi trong thanh tra, nơi bạn có thể nhập khóa và giá trị, mà không cần phải viết một thanh tra tùy chỉnh.

Kết quả trông như thế này:

thanh tra tự động tạo

(Một mẹo: nếu lớp mục nhập được tuần tự hóa chứa trường "Tên", chuỗi đó sẽ được hiển thị thay vì tiêu đề "Phần tử 0" nhạt nhẽo. Hữu ích nếu bạn có dữ liệu phức tạp hơn mà bạn muốn có thể điều hướng hiệu quả.)

Biến điều này thành ScriptableObject cho phép bạn coi nó như một Tài sản được chia sẻ giữa các loại thực thể / trường hợp cần cùng một bộ hoạt hình, tránh chi phí trùng lặp danh sách cho mỗi loại. (Các lớp khác có xu hướng được tuần tự hóa theo từng thể hiện trong Unity). Để đi theo tuyến đường này, bạn sẽ cần thêm một tập lệnh biên tập nhỏ để cho phép bạn tạo các phiên bản này trong thư mục Tài sản của mình .


Chỉnh sửa: bây giờ thậm chí còn dễ dàng hơn - bạn chỉ có thể thêm thuộc tính này phía trên ScriptableObject:

[CreateAssetMenu(fileName = "fileName.asset", menuName = "Some Folder/Menu Label")]

Điều này đặt ScriptableObject vào menu Tạo của bạn, như vậy: Ảnh chụp màn hình hiển thị menu Tạo tùy chỉnh trong Unity


Bạn có thể tùy ý đặt mảng riêng tư và tuần tự hóa để nó vẫn hiển thị trong thanh tra, nhưng thêm Từ điển công cộng (hoặc từ điển riêng với phương thức GetAnimation (chính tả) công khai) để khách hàng sử dụng để tra cứu hiệu quả hơn. Trong phương thức OnEnable () của nó, SpellAnimationMap có thể lặp qua mảng dân số thanh tra để xây dựng từ điển này một lần nữa, chia sẻ lợi ích giữa tất cả các trường hợp máy khách. (Lưu ý rằng OnEnable () cũng được gọi trong trình chỉnh sửa khi nội dung được tạo lần đầu tiên, vì vậy hãy chắc chắn kiểm tra xem mảng của bạn có phải là null trước khi bạn cố đọc nó không)

Cuối cùng, bạn có thể thêm bao nhiêu vào kiểu dữ liệu mục nhập này khi bạn cần. Nó cũng có thể bao gồm prefab, hoặc bất kỳ số bit dữ liệu nào khác mà bạn muốn liên kết với khóa chính tả.

Bạn cũng có thể viết các thanh tra tùy chỉnh để điền trực tiếp các trường Từ điển <,>, nhưng ấn tượng mà tôi nhận được là nó rất khó để hoạt động trơn tru.


Chính xác những gì tôi đã làm trong khi chờ đợi một câu trả lời, vì vậy, tôi sẽ chấp nhận điều này
Malharhak

0

Đọc phần giải thích được cung cấp bởi @DMGregory

Để những người thích ví dụ:

public class SpellHandler : ScriptableObject
{
    public Spell[] keys;
    public Animation[] values;

    private Dictionary<Spell, Animation> dic;

    void Awake()
    {
        int length = keys.Length;
        this.dic= new Dictionary<Spell, Animation>(length);
        for (int i = 0; i < length; i++)
        {
            this.dic.Add(keys[i], values[i]);
        } 
    }    
}
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.