Автоматическое заполнение объектов сценариев - PullRequest
0 голосов
/ 10 ноября 2018

Некоторые из моих объектов Scriptable (используются для заполнения моих начальных игровых данных) содержат большие двумерные массивы (например, 10x10), данные которых я генерирую с помощью внешнего скрипта Python. Я также использую плагин Odin inspector, чтобы сериализовать 2d массив для меня и предоставить мне хорошее представление этого массива в редакторе Unity.

Я просто делаю это так:

[TableMatrix()]
public int[,] table = new int[10, 10];

и это просто класс Odin SerializedScriptableObject.

Проблема в том, что я действительно хочу избежать добавления элементов 10x10 вручную с помощью редактора Unity, а также хочу, чтобы мои объекты имели переменные размеры массивов 2d, один может быть beb (10,10), другой мог бы быть ( 5,5). Есть ли способ заполнить мои объекты сценариев программно для достижения этого? (Или плагин Odin inspector поддерживает что-то подобное, если кто-нибудь знает?)

Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вам следует сериализовать массивы в файлы в python, а затем использовать импортер сценариев, чтобы импортировать их в Unity, создать массивы в ScriptableObject и заполнить их значения.

https://docs.unity3d.com/Manual/ScriptedImporters.html

0 голосов
/ 25 ноября 2018

Извините за поздний ответ @ Spyros.

Мой подход будет аналогичен подходу @D Manokhin, но вместо использования зубчатого массива я буду использовать многомерный массив (поскольку вы можете создать собственный сценарий редактора для их визуализации, я почти уверен, что вы можете визуализировать зубчатые массивы в редакторе без плагинов, я никогда не использовал плагин Odin).

Итак, я делаю один класс, который будет хранить структуры под названием TileData:

using UnityEngine;
using System.Collections;

[System.Serializable]
public class TileData
{
    /*
     * rows
        [rowData][rowData][rowData]
        [cell]  ->value
                ->type
        [cell]  ->value
                ->type
        [cell]  ->value
                ->type
    */

    [System.Serializable]
    public struct cell
    {
        public float value;
        public string type;
    }


    [System.Serializable]
    public struct rowData
    {
        public cell[] row;
    }

    public rowData[] rows;

}

Я использовал value и type в качестве «примеров», это абсолютно ваше дело, вы также можете сохранить Vector3, если хотите!

Тогда как вызвать и использовать такую ​​структуру? Посмотрим:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Matrix : MonoBehaviour {

    //declare the structure that will store the data
    public TileData tileData = new TileData();    

    //those are public so you could make the matrix with the size you want..
    //..ideally dynamically call it from your python file requisits
    public int horizontalMatrixSize = 10;  
    public int verticalMatrixSize = 10;

    // Use this for initialization
    void Start()
    {        
        //Create the matrix structure and fill it
        tileData.rows = new TileData.rowData[horizontalMatrixSize];
        for (int i = 0; i < tileData.rows.Length; i++)
        {
            tileData.rows[i].row = new TileData.cell[verticalMatrixSize];
            for (int u = 0; u < tileData.rows[i].row.Length; u++)
            {                
                tileData.rows[i].row[u].value = GetValuesFromPythonFileOrWhatever();
                tileData.rows[i].row[u].type = GetValuesFromPythonFileOrWhatever();
            }
        }
    }

}

Но если вам действительно нравится зазубренная структура, вы все равно можете использовать ее (но помните, что она не будет отображаться в редакторе) следующим образом:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Matrix : MonoBehaviour {
    //declare the structure that will store the data
    [SerializeField] private float[,] grayscaleBidimensional = null;

    //those are public so you could make the matrix with the size you want..
    //..ideally dynamically call it from your python file requisits
    public int horizontalMatrixSize = 10;  
    public int verticalMatrixSize = 10;

    // Use this for initialization
    void Start()
    {        
        //Create the matrix structure and fill it
        tileData.rows = new TileData.rowData[horizontalMatrixSize];

        grayscaleBidimensional = new float[horizontalMatrixSize, verticalMatrixSize];
        for (int x = 0; x < horizontalMatrixSize; x++)
        {
            for (int y = 0; y < verticalMatrixSize; y++)
            {
                grayscaleBidimensional[x, y] = GetValuesFromPythonFileOrWhatever();
            }
        }
    }

}

Помните, что вы можете задавать значения объектов так, как хотите, чтобы им не требовался статический размер!

0 голосов
/ 19 ноября 2018

Чтобы изменить индивидуальное значение, вы можете сделать table[x,y] = (your value). Допустим, вы хотите заполнить каждое значение номером 1, вы можете сделать:

for (int y = 0; y < 10; y++)
{
    for (int x = 0; x < 10; x++)
    {
        table[x, y] = 1;
    }
}

Надеюсь, что он ответит на ваш вопрос, и извините, если код неправильный - в данный момент у меня нет доступа к Unity, поэтому вам, возможно, придется возиться с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...