团结:作为JSON保存/加载精灵



i正在遵循一个教程,我需要在其中保存属于对象的精灵。我正在创建一个项目数据库,当然希望正确的图像随附该项目。这就是我构建项目数据库的方式:

itemObject

[System.Serializable]
public class ItemObject{
    public int id;
    public string title;
    public int value;
    public string toolTip;
    public bool stackable;
    public string category;
    public string slug;
    public Sprite sprite;

    public ItemObject(int id, string title, int value, string toolTip, bool stackable, string category, string slug)
    {
        this.id = id;
        this.title = title;
        this.value = value;
        this.toolTip = toolTip;
        this.stackable = stackable;
        this.category = category;
        this.slug = slug;
        sprite = Resources.Load<Sprite>("items/" + slug);
    }

itemData

[System.Serializable]
public class ItemData {
    public List<ItemObject> itemList;
}

i然后保存/加载itemData.itemlist。效果很好。如您所见,我使用" slug"加载我的物品的精灵,Slug基本上是一个适合代码的名称(例如:Golden_hat(,然后我为我的Sprite提供了相同的名称。

这也效果很好,但是Unity节省了Sprite InstanceID,该Instance Instance Instance Instance Instance InstandID总是在开始时发生变化,因此,如果我退出Unity并加载数据,它将获得错误的图像。

我的JSON:

{
    "itemList": [
        {
            "id": 0,
            "title": "Golden Sword",
            "value": 111,
            "toolTip": "This is a golden sword",
            "stackable": false,
            "category": "weapon",
            "slug": "golden_sword",
            "sprite": {
                "instanceID": 13238
            }
        },
        {
            "id": 1,
            "title": "Steel Gloves",
            "value": 222,
            "toolTip": "This is steel gloves",
            "stackable": true,
            "category": "weapon",
            "slug": "steel_gloves",
            "sprite": {
                "instanceID": 13342
            }
        }
    ]
}

所以我猜想这样做不起作用,还有其他方法可以在JSON中保存精灵吗?还是我每次使用" slug"时都必须在运行时加载正确的精灵?

如果您使用JsonUtility进行序列化,则可以实现ISerializationCallbackReceiver以接收序列化回调。这样,在对象被启用后,您可以根据存储的路径加载正确的精灵。您还避免了资源重复。

[Serializable]
public class ItemObject : ISerializationCallbackReceiver
{
    public void OnAfterDeserialize()
    {
        sprite = Resources.Load<Sprite>("items/" + slug);
        Debug.Log(String.Format("Loaded {0} from {1}", sprite, slug));
    }
    public void OnBeforeSerialize() { }
    (...)
}

如果您真的想直接将精灵存储在JSON中,请考虑序列化从Sprite.texture.GetRawTextureData()获取的原始纹理数据(可能将二进制数据存储在base64字符串中(并在运行时重新创建Sprite.Create()ISerializationCallbackReceiver技巧也将在这里应用。

作为附加说明,如果它适合您的要求,请绝对考虑删除基于JSON的对象数据库,而有利于使用脚本化对象。这样,您可以轻松地引用UnityEngine对象而无需求助于使用资源文件夹(除非有必要,否则不建议使用(。

一种更合适的方法是将纹理保存为字节[],然后您的JSON包含字节的名称或URL []。

    {
        "id": 1,
        "title": "Steel Gloves",
        "value": 222,
        "toolTip": "This is steel gloves",
        "stackable": true,
        "category": "weapon",
        "slug": "steel_gloves",
        "sprite": "steelgloves"
    }

然后,当您抓住JSON时,您将转换为C#并查找字节数组。具有字节数组后,您可以重建精灵:

byte [] bytes = File.ReadAllBytes(path);
Texture2d tex = new Texture2D(4,4);
tex.LoadImage(bytes);
Sprite sp = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), new Vector2(0.5f,0.5f));

相关内容

  • 没有找到相关文章

最新更新