Je reviens à vous encore une fois pour un nouveau souci avec ma Visual Novel. C'est un souci que je rencontre depuis un long moment à présent et la console n'indique aucune erreur pouvant donner une idée de sa résolution.
Mon projet actuel comporte deux scènes (MainMenu et Novel) qui permettent toutes les deux d'accéder au panel Save/Load pour sauvegarder, charger ou même supprimer des données de sauvegardes. La scène MainMenu y accède grâce à un bouton "Continuer" tandis que la scène Novel (la partie jeu) y accède grâce à un clic droit.
L'écran MainMenu en mode Game :
En cliquant sur Continuer, le panel Save/Load suivant s'affiche bien :
(oui j'ai deux boutons "retour" mais je voulais tester voir si ça venait de TMPro et/ou des images/RawImage mais avec ou sans, ça ne fonctionne en aucun cas ).
Les boutons à gauche de l'écran sont reconnus comme tels (cliquer dessus fonctionne et le highlighted color aussi, d'où le orange pétant sur le 2ème bouton retour ) mais pas les autres, cliquer dessus ne donne rien du tout.
Depuis la scène Novel, ces mêmes boutons sont aussi reconnus en plus des petits 1, 2, 3, ..., 7 qui changent le numéro des "N empty file..." juste en dessous. Mais encore une fois, les boutons comprenant les images toutes blanches et les textes ne sont pas reconnus comme des boutons (pas de highlight dessus, ni de clic chargeant les données).
J'ai lu plusieurs fois que le problème venait d'un EventSystem absent mais dans les deux scènes il est bien présent et en dehors des Canvas comme montré ci dessous :
L'EventSystem est strictement identique dans les deux cas :
Aussi, j'ai bien placé tous les OnClick qu'il fallait sur les boutons, la cible étant à chaque fois le Panel dans lequel ils se trouvaient, permettant ainsi d'appeler la fonction pour fermer le panel, charger les données etc. Un petit exemple ici :
Et voici le GameSavePanel.cs qui appelle ces fonctions :
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
public class GameSavePanel : MonoBehaviour
{
public List<BUTTON> buttons = new List<BUTTON>();
[HideInInspector]
public int currentSaveLoadPage = 1;
public CanvasGroup canvasGroup;
public Button loadButton;
public Button saveButton;
public Button deleteButton;
public enum TASK
{
saveToSlot,
loadFromSlot,
deleteSlot
}
public TASK slotTask = TASK.loadFromSlot;
public void LoadFilesOntoScreen(int page = 1)
{
currentSaveLoadPage = page;
string directory = FileManager.savPath + "savData/gameFiles/" + page.ToString() + "/";
if (System.IO.Directory.Exists(directory))
{
for(int i = 0; i < buttons.Count; i++)
{
BUTTON b = buttons[i];
string expectedFile = directory + (i + 1).ToString() + ".txt";
if (System.IO.File.Exists(expectedFile))
{
GAMEFILE file = FileManager.LoadEncryptedJSON<GAMEFILE>(expectedFile, FileManager.keys);
b.button.interactable = true;
byte[] previewImageData = FileManager.LoadComposingBytes(directory + (i + 1).ToString() + ".png");
Texture2D previewImage = new Texture2D(2, 2);
ImageConversion.LoadImage(previewImage, previewImageData);
file.previewImage = previewImage;
b.previewDisplay.texture = file.previewImage;
//need to read date and time information from file.
b.dateTimeText.text = page.ToString() + "\n" + file.modificationDate;
}
else
{
b.button.interactable = allowSavingFromThisScreen;
b.previewDisplay.texture = Resources.Load<Texture2D>("Images/UI/EmptyGameFile");
b.dateTimeText.text = page.ToString() + "\n" + "empty file...";
}
}
}
else
{
for (int i = 0; i < buttons.Count; i++)
{
BUTTON b = buttons[i];
b.button.interactable = allowSavingFromThisScreen;
b.previewDisplay.texture = Resources.Load<Texture2D>("Images/UI/EmptyGameFile");
b.dateTimeText.text = page.ToString() + "\n" + "empty file...";
}
}
}
[HideInInspector]
public BUTTON selectedButton = null;
string selectedGameFile = "";
string selectedFilePath = "";
public bool allowLoadingFromThisScreen = true;
public bool allowSavingFromThisScreen = true;
public bool allowDeletingFromThisScreen = true;
public void ClickOnSaveSlot(Button button)
{
foreach (BUTTON B in buttons)
{
if (B.button == button)
selectedButton = B;
}
selectedGameFile = currentSaveLoadPage.ToString() + "/" + (buttons.IndexOf(selectedButton) + 1).ToString();
selectedFilePath = FileManager.savPath + "savData/gameFiles/" + selectedGameFile + ".txt";
//Run an error check just to be sure the file has not been removed since load.
if (System.IO.File.Exists(selectedFilePath))
{
loadButton.interactable = allowLoadingFromThisScreen;
saveButton.interactable = allowSavingFromThisScreen;
deleteButton.interactable = allowDeletingFromThisScreen;
}
else
{
selectedButton.dateTimeText.text = "<color=red>FILE NOT FOUND!";
loadButton.interactable = false;
saveButton.interactable = allowSavingFromThisScreen;
deleteButton.interactable = true;
}
}
public void LoadFromSelectedSlot()
{
//we need to load the data from this slot to know what to do.
GAMEFILE file = FileManager.LoadEncryptedJSON<GAMEFILE>(selectedFilePath, FileManager.keys);
//save the name of the file that we will be loading in the visual novel. carries over to next scene.
FileManager.SaveFile(FileManager.savPath + "savData/file", selectedGameFile);
UnityEngine.SceneManagement.SceneManager.LoadScene("Novel");
gameObject.SetActive(false);//deactivate the panel after loading.
}
public void ClosePanel()
{
if (gameObject.activeInHierarchy)
GetComponent<Animator>().SetTrigger("deactivate");
}
public void SaveToSelectedSlot()
{
//save the open game file to this slot.
if (NovelController.instance != null)
{
savingFile = StartCoroutine(SavingFile());
}
}
Coroutine savingFile = null;
IEnumerator SavingFile()
{
NovelController.instance.activeGameFileName = selectedGameFile;
//render this part of the screen invisible so we get a clear snapshot of the visual novel.
GetComponent<Animator>().SetTrigger("instantInvisible");
yield return new WaitForEndOfFrame();
// a screen shot is made during this point.
NovelController.instance.SaveGameFile();
selectedButton.dateTimeText.text = currentSaveLoadPage.ToString() + "\n" + GAMEFILE.activeFile.modificationDate;
selectedButton.previewDisplay.texture = GAMEFILE.activeFile.previewImage;
yield return new WaitForEndOfFrame();
//render this part of the screen visible again after the screenshot is taken.
GetComponent<Animator>().SetTrigger("instantVisible");
savingFile = null;
}
public void DeleteSlot()
{
print("We'll do this later.");
}
[System.Serializable]
public class BUTTON
{
public Button button;
public RawImage previewDisplay;
public TextMeshProUGUI dateTimeText;
}
}
Merci beaucoup d'avance pour votre attention !