Em relação às armadilhas de salvar variáveis serializadas, os dados com indexadores não podem ser serializados.

Eu estava trabalhando em um projeto recentemente. Ao alterar o inspetor em um editor personalizado, encontrei uma grande armadilha que foi difícil de detectar. Demorei quase um dia para resolver o problema. Para evitar que os retardatários cometessem o mesmo erro , vou falar sobre isso aqui.

Índice

Resumir


Geralmente, quando você deseja localizar dados, você pode encontrar algumas armadilhas no início. Depois de navegar no Baidu, você percebe que apenas dados serializados podem ser armazenados localmente. No entanto, é difícil encontrar uma resposta clara e fácil de entender no Internet sobre o que são dados serializados. Na verdade, a maioria das pessoas não precisa saber disso. Elas sabem que quando uma classe que não herda nenhuma classe pai deseja ser serializada, você precisa adicionar [Serializable] no topo e então você precisa marcar quais dados estão sujos, depois salvá-los e pronto.

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;

[Serializable]
public class T
{
    ;
}
    public void SaveData()
    {
        EditorUtility.SetDirty(this);
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }

De modo geral, isso é suficiente para garantir que não haja problemas de lógica. Quaisquer modificações feitas no painel do inspetor serão salvas e os dados ainda estarão lá mesmo se você sair do Unity e reabri-lo.

Sempre surgem vários problemas diversos nos projetos que podem ser realizados, o que evidencia plenamente a incerteza do destino. Após concluir as operações acima, fiz modificações nos dados e ainda não consegui salvá-los, ou seja, após sair do editor Unity e reabri-lo, todos os dados foram apagados.

Fiquei muito deprimido, fui para o Baidu como um louco, mas nenhuma das respostas resolveu meu problema. Quando eu estava prestes a desistir e pensar se deveria tentar usar XML ou JSON para salvar dados, percebi um ponto: ou seja, posso salvar alguns dados quando os modifico, mas os dados que desejo salvar são os mais importantes Se não for possível salvá-lo, o problema poderá ser resolvido a partir deste ponto.

A estrutura de dados naquela época era assim (com algum processamento):

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor;

[Serializable]
public class Data
{
    public Hashtable hashtable;
    [ShowOnly] public string AName;
    [ShowOnly] public string BName;
    private List<T> _TList = new List<T>();
    public List<T> TList
    {
        get{return _TList;}
        set{_TList = value;}
    }

    public Data(string AName, string BName)
    {
        this.AName = AName;
        this.BName = BName;
    }


    [Serializable]
    public class T
    {
        public int A;
        public int B;
        public int C;
        public int D;
    }
}

Os dados que quero focar são a variável TList . Somente esses dados não podem ser salvos. Outros dados neste script podem ser salvos após modificação, mas por que não podem ser salvos? Depois de pensar sobre isso, acho que tem algo a ver com serialização, mas adicionei [Serializable] , então não há razão para que não possa ser serializado. Na verdade, estava errado. Realmente não podia ser serializado. Eu não sabia qual era o problema na época, mas já conseguia ver o problema.

Para realizar esta etapa, precisei verificar minha ideia, então corri até a pasta do projeto e encontrei o arquivo Asset. Quando olhei para ele, de repente percebi que não havia dados TList nele, ou seja, não havia sido serializado em tudo !

Depois de um dia de tortura, depois de revisá-lo repetidas vezes, pude ver rapidamente a origem do erro, mesmo que não conseguisse ver o princípio do erro.

    private List<T> _TList = new List<T>();
    public List<T> TList
    {
        get{return _TList;}
        set{_TList = value;}
    }

O problema está aqui: adicionei um indexador a esses dados e os dados com o indexador não podem ser serializados! ! !

O problema foi resolvido quando removi o indexador.

    public List<T> TList;

Por que existe esse problema? Não tenho certeza e não verifiquei, mas tenho certeza de que caí em outra armadilha. Na verdade, esse problema foi previsto há muito tempo. Quando eu estava digitando o código antes, descobri que variáveis ​​com indexadores não seriam exibidas no painel.Naquela hora pensei que as variáveis ​​com indexadores ficariam ocultas, então não me preocupei com isso, mas acabei caindo em uma armadilha depois de amanhã. . .

Resumir

1. Os dados serializados podem ser salvos automaticamente ou através de código após modificação.

2. Variáveis ​​com indexadores não podem ser serializadas

3. Se você quiser saber quais dados são serializados, você pode ir diretamente para a pasta do projeto para encontrar o arquivo de ativo correspondente e abri-lo. Se não houver nenhum dado que você esteja procurando, provavelmente não será serializado (não é no painel, a menos que seja ocultado manualmente. , caso contrário, provavelmente não será serializado)

Como não consegui encontrar a resposta correspondente depois de muito tempo pesquisando no Baidu, sinto que é necessário anotá-la para que as pessoas necessitadas possam lê-la. Embora isso seja senso comum para algumas pessoas, para desenvolvedores como eu, que são autodidatas e cuja aquisição de conhecimento é fragmentada, terei que cair em uma armadilha por vários dias. Espero que mais pessoas que caíram nessa armadilha compartilhem seus experiências.(Doloroso), ajudando os retardatários a completar seus jogos mais rápido e melhor.

Acho que você gosta

Origin blog.csdn.net/weixin_49779414/article/details/125823167
Recomendado
Clasificación