дублирует значения в массиве, используя сокращение, объясняющее

Есть 3 способа сделать это, но решение этого зависит от типа данных, которые вы хотите передать между сценами. Компоненты / скрипты и GameObjects уничтожаются при загрузке новой сцены и даже при маркировке как static.

1. Используйте ключевое слово static.

Используйте этот метод, если переменная для перехода к следующей сцене не является компонентом, не наследуется от MonoBehaviour и не является GameObject затем сделайте переменную равной static.

Встроенные примитивные типы данных, такие как int, bool, string, float, double. Все эти переменные могут быть сделаны переменной static.

Пример встроенных примитивных типов данных, которые могут быть отмечены как статические:

static int counter = 0;
static bool enableAudio = 0;
static float timer = 100;

Они должны работать без проблем.


Пример объектов, которые может быть отмечен как статический:

public class MyTestScriptNoMonoBehaviour
{

}

, затем

static MyTestScriptNoMonoBehaviour testScriptNoMono;

void Start()
{
    testScriptNoMono = new MyTestScriptNoMonoBehaviour();
}

Обратите внимание, что класс не наследуется от MonoBehaviour . Это должно работать.


Пример объектов, которые не может быть помечены как статические:

Все, что наследуется от Object , Component или GameObject не будет работать.

1A. Все, что наследуется от MonoBehaviour

public class MyTestScript : MonoBehaviour 
{

}

then

static MyTestScript testScript;

void Start()
{
    testScript = gameObject.AddComponent();
} 

Это не будет работать, потому что оно наследуется от MonoBehaviour .

1B.All GameObject :

static GameObject obj;

void Start()
{
    obj = new GameObject("My Object");
}  

Это не сработает, потому что это GameObject и GameObject наследуются от Object .

Единство всегда будет уничтожать его Object , даже если они объявлены с ключевым словом static.

См. № 2 для обходного пути.


2.Используйте функцию DontDestroyOnLoad .

Вам нужно использовать это, только если данные сохранить или перейти к следующей сцене наследует от Object , Component или является GameObject . Это решает проблему, описанную в 1A и 1B.

Вы можете использовать ее, чтобы этот GameObject не уничтожался при выгрузке сцены:

void Awake() 
{
    DontDestroyOnLoad(transform.gameObject);
}

Вы даже можете использовать его с ключевыми словами static решить проблему из 1A и 1B:

public class MyTestScript : MonoBehaviour 
{

}

then

static MyTestScript testScript;

void Awake() 
{
    DontDestroyOnLoad(transform.gameObject);
}

void Start()
{
    testScript = gameObject.AddComponent();
} 

Теперь переменная testScript будет сохранена при загрузке новой сцены.

3. Сохраните локальную память, затем загрузите ее во время следующей сцены.

Этот метод следует использовать, когда это данные игры, которые необходимо сохранить, когда игра закрыта и снова открыта. Пример этого - высокий балл игрока, настройки игры, такие как громкость музыки, местоположения объектов, данные профиля джойстика и т. Д.

Thare - два способа сохранить это:

3A. Используйте API PlayerPrefs .

Используйте, если у вас есть только несколько переменных для сохранения. Скажем, оценка игрока:

int playerScore = 80;

И мы хотим сохранить playerScore:

Сохранить оценку в функции OnDisable

void OnDisable()
{
    PlayerPrefs.SetInt("score", playerScore);
}

Загрузить в функции OnEnable

void OnEnable()
{
    playerScore  =  PlayerPrefs.GetInt("score");
}

3B. Сериализуйте данные в форму json, xml или binaray, затем сохраните с помощью одного из файлов API C #, таких как File.WriteAllBytes и File.ReadAllBytes для сохранения и загрузки файлов.

Используйте этот метод, если есть много переменных для сохранения.

Общие сведения, вам необходимо создать класс, который не наследуется от MonoBehaviour . Этот класс, который вы должны использовать для хранения ваших игровых данных, чтобы их можно было легко сериализовать или де-сериализовать.

Пример данных для сохранения:

[Serializable]
public class PlayerInfo
{
    public List ID = new List();
    public List Amounts = new List();
    public int life = 0;
    public float highScore = 0;
}

Возьмите класс DataSaver, который является оберткой поверх File.WriteAllBytes и File.ReadAllBytes , который упрощает сохранение данных из этого сообщения .

Создать новый экземпляр:

PlayerInfo saveData = new PlayerInfo();
saveData.life = 99;
saveData.highScore = 40;

Сохранить данные из PlayerInfo в файл с именем «игроки»:

DataSaver.saveData(saveData, "players");

Загрузить данные из файла с именем «игроки»:

PlayerInfo loadedData = DataSaver.loadData("players");

-2
задан i Lnx 16 January 2019 в 01:24
поделиться

3 ответа

Возможно, использование разных имен переменных поможет:

var arr = [10,10, 8000, 8000, 2, 17];
var initialiser = [];

var unique = arr.reduce((output, currentElement) => {

  // If our output array includes the current element
  if (output.includes(currentElement)) {

    // Return the output without adding to it
    return output;
  } else {

    // Otherwise create a new array by spreading out
    // the elements of the output array, and adding the
    // current element.
    // `return output.concat(currentElement);` would
    // give the same result
    return [...output, currentElement];
  }

// Pass in the initialiser object which
// we call `output` in each iteration
}, initialiser);
0
ответ дан Andy 16 January 2019 в 01:24
поделиться

как это:

Array.prototype.reduce = function(callback, value) {
  let result;

  // initial index
  let initialIndex = 0;

  // initial value
  let initialValue = this[0];

  // If there is a second parameter
  if (typeof value !== undefined) {
    initialIndex = 1;
    initialValue = value;
  }

  // Assignment initial value
  result = initialValue;

  // Traversing
  for (var i = initialIndex; i < this.length; i++) {
    // your callback and x,y here
    result = callback(result, this[i]);
  }

  // Return a new value
  return result;
};

0
ответ дан yujinpan 16 January 2019 в 01:24
поделиться

Для этого вам необходимо понять, как работает функция уменьшения. Он ожидает 2 параметра: функцию и начальное значение для вашего аккумулятора.

(x, y) => x.includes(y) ?  x : [...x, y]

это функция, которая вызывается внутри редукционного вызова. для x передается аккумулятор, для y - текущее значение массива. Таким образом, эта функция принимает значение аккумулятора и текущего значения, проверяет, находится ли значение в аккумуляторе (с помощью include). Если это функция возвращает x, аккумулятор, но если y не в x, функция возвращает новый массив для аккумулятора со всеми элементами старого аккумулятора и новым значением x.

Это далеко не лучший способ удаления дубликатов из массива, потому что каждый цикл вы просматриваете по всему массиву. Если вам нужен массив без дубликатов, рассмотрите возможность использования множеств .

0
ответ дан Nikita Malyschkin 16 January 2019 в 01:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: