Au final maintenant je suis dans mon année finale où on a un projet pro à faire tout au long de l'année et pour moi ça sera un JV.
Tout se passe bien pour le moment mais j'arrive à un point ou je bloque tout seul et avec l'aide trouvable sur internet.
C'est la 1ère fois que je veux garder des données d'une scène à l'autre et c'est assez obscur pour moi, en me renseignant j'ai vu qu'il y avait globalement 5 méthodes pour garder des valeurs d'une scène à l'autre :
- une classe en static pour store tout les valeurs voulues
- utiliser un object en DontDestroyOnLoad qui store toutes les valeurs
- les PlayerPrefs
- Sauvegarder sur un fichier mais ça me semble overkill sachant que je ne veux pas sauvegarder entre chaque session de jeu
- utiliser un singleton mais de un je ne comprend pas trop le concept et de deux ça a l'air d'être un sujet vachement controversé
Mon problème vient du fait que je n'ai vraiment aucune idées de quelle méthode adopter(surtout parmi les 3 premières vu que les 2 dernières me semblent pas bonnes pour mon utilisation).
Pour clarifier la situation je cherche à faire une sorte de créateur d'armée ,l'armée est composée d'escouades qui sont elles mêmes composées d'unités individuelles.
Pour le moment je procède comme ceci :
J'ai un script "Army_Manager" qui gère les escouades, je peux les sélectionner, en rajouter, connaitre le nombre d'escouades etc...
Chaque escouade a un script "Squad" qui lui contient le type et le nombre d'unités dans celle ci.
En gros dans "Army_Manager" j'ai une Liste de GameObjects qui contient toutes mes escouades et dans "Squad" j'ai une liste de GameObject qui contient toutes les unités dans une escouade.
Ce que j'aimerai en gros c'est de garder chaque escouade avec leurs propres données contenues dans le script "Squad" et de les transférer dans une autre scène, mais c'est là que ça bloque
J'ai tenté quelque chose avec une classe statique pour stocker la liste d'escouades mais sans surprise ça ne marche pas, ça me créer une liste avec le bon nombre d'escouades mais les valeurs sont nulles.
Les scripts qui me semblent utile de linker, y'a pas mal de trucs sans rapport mais j'ai essayé d'être le plus clair possible avec des commentaires etc.. j'espère que c'est compréhensible :
Army_Creator :
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
using UnityEngine.SceneManagement;
public class Army_Creator : MonoBehaviour
{
public List<GameObject> squads = new List<GameObject>();
public List<GameObject> selected_units = new List<GameObject>();
public GameObject current_squad;
GameObject last_squad;
public GameObject squad_prefab;
int ofset_x = 0;
public LayerMask squad_mask;
public LayerMask unit_mask;
public GameObject unit_Selection_List;
public TextMeshProUGUI points_text;
public int army_points;
private void Start()
{
//Hide the unit selection list
unit_Selection_List.SetActive(false);
}
private void Update()
{
Select_Squad();
Select_Unit();
}
public void SaveArmy()
{
foreach(GameObject squad in squads)
{
Army_Manager.player_one_squads_list.Add(squad);
SceneManager.LoadScene("Test_Map");
}
}
public void Update_Score()
{
army_points = 0;
foreach (GameObject squad in squads)
{
army_points += squad.GetComponent<Squad>().points_cost;
points_text.text = "points : " + army_points;
}
}
public void Show_Unit_Selection_List(bool is_active)
{
if (is_active)
{
unit_Selection_List.SetActive(true);
}
else
{
unit_Selection_List.SetActive(false);
unit_Selection_List.GetComponent<Unit_Selection_List_Script>().isActive = false;
}
}
public void AddSquad()
{
//Create a squad
GameObject squad_instance = Instantiate(squad_prefab, transform.position + new Vector3(ofset_x, 0, 0), Quaternion.identity);
squads.Add(squad_instance);
Update_Score();
//ofset to the instat<niated squad
ofset_x += 20;
}
public void Add_Unit_To_Selected_Squad()
{
//Instantiate an unit in the squad
if (current_squad != null)
{
current_squad.GetComponent<Squad>().AddUnit(current_squad.GetComponent<Squad>().squad_member.prefab);
Update_Score();
}
}
public void Select_Squad()
{
//Select a squad and change the current squad
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity, squad_mask))
{
if (Input.GetButtonDown("Fire1"))
{
Change_Current_Squad(null, hit.transform.parent.gameObject);
}
}
}
public void Select_Unit()
{
//Select an unit inside the selected squad
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, Mathf.Infinity, unit_mask))
{
if (Input.GetButtonDown("Fire1"))
{
hit.transform.GetComponent<Unit_Script>().Select_Unit(gameObject, false);
//Show_Unit_Selection_List(true);
unit_Selection_List.GetComponent<Unit_Selection_List_Script>().Generate_Buttons(current_squad, gameObject);
}
}
}
public void Clear_Unit_Selection()
{
//Deselect all units selected
foreach(GameObject unit in selected_units)
{
unit.GetComponent<Unit_Script>().Select_Unit(gameObject, true);
//selected_units.Remove(unit);
}
//Clear the list of selected units
selected_units.Clear();
//Hide the unit selection list
Show_Unit_Selection_List(false);
}
public void Change_Current_Squad(GameObject last_squad, GameObject _current_squad)
{
//if there is already a current squad then put it as last squad
if (current_squad != null)
{
last_squad = current_squad;
current_squad = _current_squad;
}
//if it's the first time don't set any last squad
else
{
current_squad = _current_squad;
}
//print("last squad is " + last_squad);
//print("current squad is " + current_squad);
//Select the current squad
current_squad.GetComponent<Squad>().selected = true;
//if there is a last squad deselect it
if (last_squad != null)
last_squad.GetComponent<Squad>().selected = false;
//Deselect all selected units
Clear_Unit_Selection();
}
}
Squad :
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Squad : MonoBehaviour
{
public List<GameObject> units = new List<GameObject>();
public List<Unit> available_unit_types = new List<Unit>();
public Unit leader;
public Unit squad_member;
public GameObject squad_selector;
public Material selected_material;
public Material not_selected_material;
int x = 2;
int z = 0;
public int max_units = 20;
int units_number = -1;
public int points_cost;
public bool selected = false;
GameObject army_creator;
Army_Creator army_creator_ref;
private void Start()
{
GameObject current_instance = Instantiate(leader.prefab, transform.position, transform.rotation);
current_instance.transform.parent = transform;
units.Add(current_instance);
units_number++;
army_creator = GameObject.Find("Army_Creator");
army_creator_ref = army_creator.GetComponent<Army_Creator>();
}
private void Update()
{
Selected();
}
public void AddUnit(GameObject added_unit)
{
if (units_number < (max_units - 1))
{
GameObject current_instance = Instantiate(added_unit, transform.position + new Vector3(x, 0, z), transform.rotation);
current_instance.transform.parent = transform;
units.Add(current_instance);
x += 2;
units_number++;
current_instance.GetComponent<Unit_Script>().number_in_the_list = units_number;
int current_unit_point_cost = 0;
current_unit_point_cost = current_instance.GetComponent<Unit_Script>().unit_ref.point_cost;
//print(current_instance.GetComponent<Unit_Script>().unit_point_cost);
points_cost += current_unit_point_cost;
if (x >= 8)
{
z += 2;
x = 0;
}
}
}
public void Replace_unit(GameObject replaced_unit, GameObject replacing_unit, int _i)
{
units[_i] = replacing_unit;
units[_i].transform.SetParent(transform);
units[_i].GetComponent<Unit_Script>().number_in_the_list = replaced_unit.GetComponent<Unit_Script>().number_in_the_list;
points_cost -= replaced_unit.GetComponent<Unit_Script>().unit_ref.point_cost;
points_cost += replacing_unit.GetComponent<Unit_Script>().unit_ref.point_cost;
army_creator_ref.Update_Score();
Destroy(replaced_unit);
}
public void Selected()
{
if (selected == true)
{
squad_selector.GetComponent<Renderer>().material = selected_material;
foreach (GameObject unit in units)
{
unit.layer = LayerMask.NameToLayer("Units");
}
}
else
{
squad_selector.GetComponent<Renderer>().material = not_selected_material;
foreach (GameObject unit in units)
{
unit.layer = LayerMask.NameToLayer("Default");
}
}
}
}
La classe statique dans laquelle je stocke ma liste d'escouades :
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class Army_Manager
{
public static List<GameObject> player_one_squads_list = new List<GameObject>();
}
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Army_Placer : MonoBehaviour
{
public List<GameObject> player_one_squads;
private void Awake()
{
foreach(GameObject squad in Army_Manager.player_one_squads_list)
{
player_one_squads.Add(squad);
}
print(player_one_squads.Count);
}
}