Sauvegarder un objets 3D cloné

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Stuprematie
Messages : 4
Inscription : 06 Mai 2021 17:10

Sauvegarder un objets 3D cloné

Message par Stuprematie » 06 Mai 2021 17:40

Bonjour, j'ai créer une application dans laquel l'utilisateur a accès à un inventaire d'objets à placer dans un musée. Cependant j'aimerais que cet utilisateur ait la possibilité de sauvegarder la scène et donc de sauvegarder la position de tous les objets qu'il a placés. J'arrive sans problème à sauvegarder et à récupérer la position du joueur.

Mais le problèmes est ici : Quand j'attrape un objet dans mon inventaire, mon script créer un Clone du prefab de l'objet sélectionné et donc cet objet n'existe que à partir du moment ou l'utilisateur l'a pris dans l'inventaire. J'aimerais enfaite sauvegarder la position de mon clone pour pouvoir récupérer ma scène plus tard.

Des idées ?

Voici mon script de sauvegarde : 

Code : Tout sélectionner

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using System.IO;

public class Save : MonoBehaviour
{

    public GameObject objets1;

    void Start()
    {

        if(PlayerPrefs.GetInt("load") == 1)
        {
            float x = PlayerPrefs.GetFloat("x");
            float y = PlayerPrefs.GetFloat("y");
            float z = PlayerPrefs.GetFloat("z");
            objets1.transform.position = new Vector3(x, y, z);
        }
    }

    
    void Update()
    {
        
    }

    public void save()
    {
        //objets
        PlayerPrefs.SetString("scene", SceneManager.GetActiveScene().name);
        PlayerPrefs.SetFloat("x", objets1.transform.position.x);
        PlayerPrefs.SetFloat("y", objets1.transform.position.y);
        PlayerPrefs.SetFloat("z", objets1.transform.position.z); 
    }
}
merci beaucoup !

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Sauvegarder un objets 3D cloné

Message par jmhoubre » 06 Mai 2021 18:52

Bonjour,

si ton inventaire a plusieurs objets, comment espères-tu traiter ? Je pense que dans ton cas, PlayerPrefs n'est pas adapté.

Comment est constitué ton inventaire et comment sont représentés tes objets dans l'inventaire ?

Stuprematie
Messages : 4
Inscription : 06 Mai 2021 17:10

Re: Sauvegarder un objets 3D cloné

Message par Stuprematie » 06 Mai 2021 21:56

Merci de votre réponse rapide.

En gros, chaque prefab d'objet est stocké dans le tableau d'un script (taille du tableau définis manuellement selon le nombre d'objets), pour chaque objets stocké dans le script, un "slot" est créer dans ma scène. Ensuite un autre scipt détecte le contact avec l'inventaire et créer alors un clone de la prefab de départ pour amener l'objet dans la scène.

si PlayerPrefs n'est pas adpaté, vous me conseillez quoi ?

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Sauvegarder un objets 3D cloné

Message par jmhoubre » 07 Mai 2021 01:34

Bonsoir,

je récapitule pour être sur d'avoir compris :
- le joueur a un inventaire. Cet inventaire définit un tableau dans lequel les prefabs des objets sont stockés.
- chaque prefab a un "slot" qui lui correspond dans la scène.
- le joueur doit aller placer chaque prefab dans son "slot" (on l'instancie à ce moment).

Encore une question : le "slot" est créé manuellement, ou quand le clone est placé dans la scène ?

Si j'ai bien compris votre problème, il s'agit de sauver :
- le nom de la scène (d'après votre script)
- pour chaque objet placé (de 0 à n), l'identifiant de l'objet (son nom ou quelque chose d'équivalent) et les coordonnées de l'objet.

Ce qui me semble le plus simple est d'utiliser JSon, qui est un format de données textuelles lisible par l'homme. Il dérive de la notation des objets du langage JavaScript. Il permet de représenter de l’information structurée. Toutefois, il n'est pas sécurisé. Voici un exemple de fichier Json :

Code : Tout sélectionner

{
	"name" : "Wagner",
	"firstname" : "Richard",
	"age" : 63
}
Unity utilise la classe JsonUtility qui propose 3 méthodes statiques :
FromJson : crée un objet à partir de sa représentation JSON.
FromJsonOverwrite : écrase les données dans un objet en lisant à partir de sa représentation JSON.
ToJson : génère une représentation JSON des champs publics d'un objet (pas les champs static).

Attention toutefois : JsonUtility sait manipuler les types habituels (string, float, int, ...) mais ne sait pas directement gérer un tableau. A tester pour un Vector3. Les exemples de code et les explications fournies dans la documentation devraient résoudre vos difficultés.

Stuprematie
Messages : 4
Inscription : 06 Mai 2021 17:10

Re: Sauvegarder un objets 3D cloné

Message par Stuprematie » 07 Mai 2021 11:12

Bonjour,

- Le slot est créer manuellement dans la scène (il correspond à une case de rangement visuellement visible) et oui le joueur via le script remplis les slots.

-sauver le nom de la scene c'est pour moi faire une condition dans le menu démarrer pour détecter si une partie sauvegarder est stockée ou pas, tout simplement.

Je vais donc me pencher sur le Json, merci beaucoup.

Stuprematie
Messages : 4
Inscription : 06 Mai 2021 17:10

Re: Sauvegarder un objets 3D cloné

Message par Stuprematie » 07 Mai 2021 11:52

Après quelques essayes j'arrive au même genre d'erreur.

Mon problème est que je n'arrive pas a référencer l'objets dont la position doit être sauvegardé car l'objet en question n'existe sur la scène que via son clone après intéraction. J'espère me faire comprendre clairement ce n'est pas évident...

Avatar de l’utilisateur
jmhoubre
Messages : 851
Inscription : 05 Oct 2019 22:05

Re: Sauvegarder un objets 3D cloné

Message par jmhoubre » 07 Mai 2021 15:20

Je ne dois pas avoir tout compris, mais pour moi l'objet à placer a 2 états : dans la scène ou non.
- dans la scène : un objet a été instancié à partir de son prefab. Le clone a un transform, donc une position. Problème réglé.
- pas dans la scène : l'objet est dans l'inventaire. On peut lui attribuer une position à l'infini, ou ajouter un booléen.

Voici comment je ferai en pseudocode. Comme je ne sais pas les options que vous avez choisies, j'ai choisi, mais c'est l'idée générale
- quand un objet est placé, est-il enlevé de l'inventaire : j'ai choisi oui
- quand un objet est placé, comment le sait-on ? J'ai choisi d'interroger les slots.

Code : Tout sélectionner

string chaineJSON
fonction SauvegardeObjets ()
	chaineJSON = ""
	// Sauve l'inventaire
	pour chaque OBJET de l'inventaire
		sauve(OBJET, true)
	pour chaque SLOT
		si le SLOT est non vide
			sauve(OBJET du SLOT, false)
			
fonction Sauve(GameObjet OBJET, bool dansInventaire)
	Data data = new Data()
	data.name = OBJET.name
	data.inInventory = dansInventaire
	si (dansInventaire)
		data.x = Mathf.Infinity
		data.y = Mathf.Infinity
		data.z = Mathf.Infinity
	sinon
		data.x = OBJET.transform.position.x
		data.y = OBJET.transform.position.y
		data.z = OBJET.transform.position.z
	finsi
	chaineJSON += JsonUtility.ToJson(data)
	
public class Data
	string name
	float x, y, z
	bool inInventory

EmileF
Messages : 673
Inscription : 18 Mars 2017 19:39

Re: Sauvegarder un objets 3D cloné

Message par EmileF » 09 Mai 2021 09:46

Salut,

Quand tu crées un objet à partir de l'inventaire je suppose que tu utilises la fonction Instantiate()

Donc dans ta fonction Load(), il faut aussi que tu crées tous les objets que tu as sauvegardé avec cette même fonction
La différence entre l'intelligence et la stupidité est que l'intelligence est limitée.

Répondre

Revenir vers « Scripting »