Create Scriptable Objects with Unity

O seguinte post do blog, a menos que de outra forma indicado, foi escrito por um membro da comunidade Gamasutra.
Os pensamentos e opiniões expressos são do escritor e não do Gamasutra ou de sua empresa mãe.

Objectivo

O principal objectivo deste post de blog é dar-lhe uma ideia sobre ScriptableObject in Unity.

O que é ScriptableObject?

Qual é a diferença entre ScriptableObject e Monobehaviour class?

Quais são os prós e contras do Scriptableobject?

Como usar ScriptableObject?

>

Deixe-nos todas as questões, dando uma volta neste blog sobre ScriptableObject

De acordo com a documentação da Unity API,

“ScriptableObject é uma classe da qual você pode derivar se você quiser criar objetos que não precisam ser anexados a objetos de jogo…”

Confuesed…?

Não se preocupe, se você não conseguiu. Aqui, vou explicar o que significa.

Como sabemos, com Unidade, tudo é um Objeto.

Tipos de Objeto

Monobehaviours são um dos Objetos.

GameObjetos: Em sua cena, você pode se mover com transform.

ScriptableObject é um tipo de Objeto mas, ele só pode conter dados.

Então, eles não se envolvem no jogo real.

Espero que você tenha entendido a definição de ScriptableObject.

Vamos discutir os prós e contras do ScriptableObject.

Prose of ScriptableObject:

  1. Construído em Unity
    • São muito bem mantidos por Unity.
    • Pode interagir com eles muito facilmente em Unity inspector.
  2. Pode ser guardado como Assets
    • Pode criá-lo como um mini ficheiro dentro do seu projecto.
    • Você pode atualizar isso e salvar de acordo com seus requisitos de jogo.
  3. Pode salvar durante a execução
    • Se você mudar alguma coisa durante a execução, ele realmente vai lembrar disso.
  4. Solução Interna
    • Quando você está tentando obter os dados durante o tempo de execução do jogo, você não se preocupa em analisar arquivos externos que entrarão em jogo mais.
  5. Grandes quantidades de dados
    • Você pode salvar milhões de inteiros dentro de um ScriptableObject.
    • Então, há muito espaço (função sem limite de tamanho).
  6. Adicione à estrutura enquanto vai
    • Como você está construindo um objeto com scriptable e cria poucas instâncias dele e percebe, ohhh eu preciso de uma nova configuração para ‘moveSpeed’ ou qualquer variável adicional que você precisa você pode adicionar, não vai perturbar a sua variável.
    • Variável de eliminação pode ter um pouco de impacto negativo.

Cons do ScriptableObject:

  1. Requer um scripting de editor
    • Se você quer fazer recursos do scripting então você tem que saber um pouco sobre isso.
  2. Não pode editar fora do Unity
    • Se você está trabalhando estritamente com o Unity isso não é realmente um grande problema.
    • Mas se você tem como base uma solução em equipe, onde você quer enviar arquivos para alguém e fazer com que ele edite, então não vai funcionar.
  3. Não pode salvar uma vez implantado
    • Não pode salvar durante o tempo de execução, uma vez que você construiu o jogo, o que significa que esta não é a solução para salvar os dados de um jogador.

Vamos dar um exemplo para entender como usar ScriptableObject no jogo.

Deixe me dar uma tarefa primeiro.

Suponha, temos 10 níveis de jogo e a cada nível o comportamento do inimigo irá mudar.

Any Ideas, como você vai fazer isso??

Ahh, Você pode pensar que fazer 10 pré-fabricados de 10 inimigos diferentes e atribuí-los a cada nível. Certo??

Tem a certeza, é realmente uma boa prática?

Atualmente, a resposta é No.

“Porque um objecto inimigo pode ter 4 variáveis e a função Update() com ele, e suponha que usa 4 Mb de memória, por isso 10 níveis inimigos podem requerer 40 Mb de quantidade de memória”

Então, aqui está a solução. Use ScriptableObject para armazenar dados do Object.

Let’s, desenvolva nosso mini jogo com ScriptableObject.

Primeiro, vou criar um script simples sem usar um ScriptableObject. (Conforme nosso primeiro pensamento sobre criar diferentes pré-fabricados de cada inimigo diferente e atribuí-lo a cada nível 😉 )

Passo 1

  • Criar um GameObject vazio com o nome Enemy.

Passo 2

  • Criar script C# e nomeá-lo EnemyMove

Escrever o seguinte código em EnemyMove.cs

public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic string name;public int moveSpeed;public Color color;public string colorName; public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed = Mathf.MoveTowards (speed,moveSpeed,Time.deltaTime);}#endregion}

Passo 3

  • Atribuir ao GameObject(Inimigo) vazio.
  • EnemyMove script tem três variáveis públicas.
  • Se o jogo tem tantos GameObject inimigos com o script enemyMove com ele então usa muita memória.
  • Para isso, conforme nossa solução ScriptableObject, podemos fazer um script EnemyData ao invés de armazenar essas variáveis dentro do script EnemyMove.

Passo 4

  • Criar script C# nomeando-o EnemyData.
  • que herda ScriptableObject ao invés de Monobehaviour.

Criar o seguinte código em EnemyData.cs.

public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}

Passo 5

  • Mudar o código dentro de ‘EnemyMove’, que foi previamente criado.
  • Criar uma variável pública ‘data’ que é a referência de ‘EnemyData’.
  • Mudar o código dentro de ‘EnemyData’

Mudar de acordo com o seguinte código.

public class EnemyMove : MonoBehaviour {#region PUBLIC_VARIABLESpublic EnemyData data;public SpriteRenderer spriterendere;#endregion#region PRIVATE_VARIABLESprivate float speed;Vector3 newPosition;#endregion#region UNITY_CALLBACKSvoid Update () {ChangeSpeed();gameObject.name = name;spriterendere.color = data.color;newPosition=transform.position;newPosition.y = Mathf.Sin (Time.time) * speed;transform.position = newPosition;}#endregion#region PROVATE_METHODSprivate void ChangeSpeed(){speed=Mathf.MoveTowards (speed,data.moveSpeed,Time.deltaTime);}#endregion}

Agora você pode ver que dentro do Inspector para Enemy GameObject na variável ‘Data’ aparecerá,

Ainda idéia…o que você supõe atribuir aqui??

Janela Enemymove Inspector

Siga-me…

Passo 1

  • Adicionar uma linha em EnemyData.cs como segue
public class EnemyData : ScriptableObject {#region PUBLIC_VERIABLEpublic string name;public int moveSpeed;public Color color;public string colorName; #endregion}

Passo 2

  • Criar uma pasta Dados do jogo e fazer o seguinte

Assets enemydata item do menu

Passo 3

  • Digite o nome que quiser.
  • Agora, você pode ver toda a variável dentro do EnemyData na janela do inspetor, você pode alterar os valores da variável aqui.

janela do inspetor de dados inimigos

Passo 4

  • Atribuir isto ao script ‘EnemyMove’

Atribuir dados inimigos à janela do inspetor enemymove

Tenho certeza que você tem todas as respostas agora.

Conclusão

  • ScriptableObject são realmente bons para o fato de que eles podem quebrar seus dados em pedaços maiores.
  • Para que você não esteja comendo muita memória.
  • ScriptableObject é apenas para fins de desenvolvimento.

Deixe uma resposta

O seu endereço de email não será publicado.