Данные в моем списке становятся нулевыми/пустыми после создания моей игрыC#

Место общения программистов C#
Ответить
Anonymous
 Данные в моем списке становятся нулевыми/пустыми после создания моей игры

Сообщение Anonymous »

Я сталкиваюсь с проблемой с моей игрой Unity после создания ее для Интернета. В игре используется массив списков для хранения данных пользователя, но при переходе на другую сцену данные в элементах в списке становятся нулевыми. < /P>
Дополнительный контекст: < /p>
В редакторе Unity все работает совершенно нормально.
Однако, после создания и публикации игры для Интернета, список больше не сохраняет свои значения при переключении сцен. Раньше, или у кого -то есть представление о том, что может вызвать это? /p>
Информационный менеджер игрока обрабатывает все информацию об информации игрока. < /p>
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
///
/// Manages all player info data
///
public class PlayerInfoManager : MonoBehaviour
{
public static PlayerInfoManager Instance;

private void Awake()
{
if (Instance == null)
{
Instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}

[SerializeField] List
playerInfos = new List();

int selectedPlayerInfoIndex;

public PlayerInfo GetMyPlayerInfo() { return playerInfos[0]; }

public List GetAllPlayerInfos() { return playerInfos; }

public void AddPlayerInfo(string username, PlayerTurn playerTurn)
{
AddPlayerInfo(new PlayerInfo(username, playerTurn));
}

public void AddPlayerInfo(User user, PlayerTurn playerTurn)
{
AddPlayerInfo(new PlayerInfo(user, playerTurn));
}

public void AddPlayerInfo(PlayerInfo playerInfo)
{
playerInfos.Add(playerInfo);
}

public void ResetAllPlayerInfo()
{
ClearPlayerInfoData();
}

public void ResetPlayerInfoData()
{
foreach (var playerInfo in playerInfos)
{
playerInfo?.GetPlayerTiles()?.ForEach(tile => Destroy(tile?.gameObject));
playerInfo?.RemovePlayerTiles();
playerInfo?.SetScore(0);
}

GameDataManager.Instance?.ClearGameData();
}

public void ClearPlayerInfoData()
{
ResetPlayerInfoData();

// Restore the Main Player Info
if (playerInfos.Count > 1) { playerInfos = new List { playerInfos[0] }; }
}
}
< /code>
Это класс, содержащий подклассы (моя цель состояла в том, чтобы модулировать каждый набор класса с их конкретными данными, которые мне нужны для хранения или сбора). Информация об игроке хранит все данные конкретного игрока или пользователя. < /P>
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[Serializable]
public class PlayerInfo
{
// User Info
[SerializeField] User user = new User();
[SerializeField] GameData gameData = new GameData();

// Game Data
[SerializeField] PlayerTurn playerTurn; // On Game Start it should choose either Player 1/2 (Online Games Mostly)

[SerializeField] List playerTiles = new List(); // Generated Tiles
[SerializeField] int score = 0;
public PlayerInfo() { }
public PlayerInfo(string username, PlayerTurn playerTurn)
{
user = new User();
user.GetUserDetails().UserName = username;
this.playerTurn = playerTurn;
this.gameData = new GameData();
}
public PlayerInfo(User user, PlayerTurn playerTurn)
{
this.user = user;
this.playerTurn = playerTurn;
this.gameData = new GameData();
}
public User GetUser() { return user; }
public GameData GetGameData() { return gameData; }
public List GetPlayerTiles() { return playerTiles; }
public PlayerTurn GetPlayerTurn() { return playerTurn; }
public void SetPlayerTurn(PlayerTurn playerTurn) { this.playerTurn = playerTurn; }
public int GetScore() { return score; }
public void SetScore(int score) { this.score = score; }
}
< /code>
Это пользовательский класс < /p>
using Newtonsoft.Json;
using System;
using UnityEngine;

[Serializable]
public class User
{
[JsonProperty]
[SerializeField] private UserDetails userDetails = new UserDetails();
[JsonProperty]
[SerializeField] private UserCategoryRole userCategoryRole = new UserCategoryRole();

// Set the User details and category role from another User object
public void SetUser(User user)
{
userDetails = user.userDetails;
userCategoryRole = user.userCategoryRole;
}

// Setters and Getters for UserDetails
public UserDetails GetUserDetails()
{
return userDetails;
}

public void SetUserDetails(UserDetails userDetails)
{
this.userDetails = userDetails;
}

// Setters and Getters for UserCategoryRole
public UserCategoryRole GetUserCategoryRole()
{
return userCategoryRole;
}

public void SetUserCategoryRole(UserCategoryRole userCategoryRole)
{
this.userCategoryRole = userCategoryRole;
}
}

< /code>
Это класс данных пользователя < /p>
using Newtonsoft.Json;
using System;
using UnityEngine;

///
/// User Details like personal details etc
///
[Serializable]
public class UserDetails
{
[Header("Personal Details")]
[SerializeField] private string userName;
[SerializeField] private string fullName;
[SerializeField] private string email;
[SerializeField] private string phoneNumber;
[JsonIgnore] private string password;
[SerializeField] bool hasEmail = false;

[Header("Location")]
[SerializeField] private string country;
[SerializeField] private string city;

[Header("Age & GenderType")]
[SerializeField] private GenderType gender;
[SerializeField] private int age; // TODO: Remove this (We can still calculate the age using the date of birth)
[SerializeField] private string dateOfBirth;

[Header("Avatar")]
[SerializeField] int avatarPosition;

[Header("Parental/Guardian Consent")]
[SerializeField] [JsonProperty] private ParentalConsent parentalConsent;
public UserDetails() { }
public UserDetails(string userName){ this.userName = userName; }
public UserDetails(string fullName, int avatarPosition)
{
this.fullName = fullName;
this.avatarPosition = avatarPosition;
}
public string UserName { get => userName; set => userName = value; }
public string PhoneNumber { get => phoneNumber; set => phoneNumber = value; }
public string FullName { get => fullName; set => fullName = value; }
public string Email { get => email; set => email = value; }
public string Password { get => password; set => password = value; }

public void ClearSensitiveData()
{
password = "";
}
}

< /code>
Чтобы отладить проблему, я использовал текстовое поле, чтобы проверить, правильно ли извлечены данные в списке. Вот что я наблюдал: < /p>
Сам список все еще существует после перехода на другую сцену, но все его элементы внезапно становятся нулевыми. но вместо этого элементы потеряли свои значения.
Дополнительные шаги, предпринятые: < /p>
гарантировали, что массив списков сериализован. ].


Подробнее здесь: https://stackoverflow.com/questions/794 ... ng-my-game
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»