using UnityEngine;
using Firebase;
using Firebase.Database;
using Firebase.Extensions;
using TMPro;
using System.Collections.Generic;
public class Selection : MonoBehaviour
{
public GameObject selectedObject;
public GameObject textTmpObj;
public GameObject colorTextObj;
public GameObject prefabNameTextObj;
public GameObject idTextObj;
private int idCounter = 1;
private DatabaseReference databaseReference;
private Dictionary<GameObject, int> objectToId = new Dictionary<GameObject,
int>();
private List<SelectionData> savedItems = new List<SelectionData>();
[SerializeField]
private GameObject[] prefabs; // Array of prefabs for loading
private bool ctrlKeyHeld = false;
private Vector3 lastSavedPosition; // Store the last saved position
void Start()
{
FirebaseApp.CheckAndFixDependenciesAsync().ContinueWith(task =>
{
var dependencyStatus = task.Result;
if (dependencyStatus == DependencyStatus.Available)
{
FirebaseApp app = FirebaseApp.DefaultInstance;
databaseReference = FirebaseDatabase.DefaultInstance.RootReference;
LoadDataFromFirebase();
}
else
{
Debug.LogError($"Could not resolve all Firebase dependencies:
{dependencyStatus}");
}
});
}
void Update()
{
ctrlKeyHeld = Input.GetKey(KeyCode.LeftControl) ||
Input.GetKey(KeyCode.RightControl);
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(ray, out hit, 1000))
{
Select(hit.collider.gameObject);
}
}
if (Input.GetMouseButtonDown(1))
{
Deselect();
}
if (ctrlKeyHeld && Input.GetKeyDown(KeyCode.S))
{
SaveDataToFirebase();
}
if (ctrlKeyHeld && Input.GetKeyDown(KeyCode.L))
{
LoadDataFromFirebase();
}
if (Input.GetKeyDown(KeyCode.K))
{
SaveSelectedObject();
}
if (Input.GetKeyDown(KeyCode.L))
{
LoadSelectedObject();
}
}
public void SaveSelectedObject()
{
if (selectedObject != null)
{
if (!objectToId.ContainsKey(selectedObject))
{
objectToId[selectedObject] = idCounter;
idCounter++;
}
SaveDataToFirebase();
}
}
public void LoadSelectedObject()
{
if (savedItems.Count > 0)
{
SelectionData lastSavedData = savedItems[savedItems.Count - 1];
int prefabIndex = lastSavedData.PrefabIndex;
if (prefabIndex >= 0 && prefabIndex < prefabs.Length)
{
GameObject loadedPrefab = prefabs[prefabIndex];
if (loadedPrefab != null)
{
GameObject loadedObject = Instantiate(loadedPrefab);
loadedObject.transform.position = lastSavedPosition;
Renderer objRenderer = loadedObject.GetComponent<Renderer>();
if (objRenderer != null)
{
// Update the color of the loaded object
Color color;
if (ColorUtility.TryParseHtmlString("#" +
lastSavedData.Color, out color))
{
objRenderer.material.color = color;
}
else
{
Debug.LogError("Failed to parse color: " +
lastSavedData.Color);
}
}
else
{
Debug.LogError("Renderer not found on loaded object.");
}
Debug.Log("Loaded the last saved object.");
}
else
{
Debug.LogError("Prefab not found at index: " + prefabIndex);
}
}
else
{
Debug.LogError("Invalid prefab index: " + prefabIndex);
}
}
else
{
Debug.Log("No saved items to load.");
}
}
public void SaveDataToFirebase()
{
if (selectedObject != null)
{
Vector3 objectPosition = selectedObject.transform.position;
lastSavedPosition = objectPosition;
int prefabIndex = GetPrefabIndex(selectedObject);
SelectionData data = new SelectionData
{
X = objectPosition.x,
Y = objectPosition.y,
Z = objectPosition.z,
Color = selectedObject.GetComponent<Renderer>() != null
?
ColorUtility.ToHtmlStringRGBA(selectedObject.GetComponent<Renderer>().material.colo
r)
: "N/A",
PrefabIndex = prefabIndex,
Id = objectToId[selectedObject]
};
string jsonData = JsonUtility.ToJson(data);
string uniqueKey = databaseReference.Push().Key;
databaseReference.Child(uniqueKey).SetRawJsonValueAsync(jsonData);
Debug.Log("Saved To Database with Key: " + uniqueKey);
}
}
public void LoadDataFromFirebase()
{
databaseReference.GetValueAsync().ContinueWith(task =>
{
if (task.IsCompleted)
{
DataSnapshot snapshot = task.Result;
savedItems.Clear();
foreach (var child in snapshot.Children)
{
string jsonData = child.GetRawJsonValue();
SelectionData data =
JsonUtility.FromJson<SelectionData>(jsonData);
savedItems.Add(data);
}
foreach (var data in savedItems)
{
int prefabIndex = data.PrefabIndex;
if (prefabIndex >= 0 && prefabIndex < prefabs.Length)
{
GameObject loadedPrefab = prefabs[prefabIndex];
if (loadedPrefab != null)
{
GameObject loadedObject = Instantiate(loadedPrefab);
loadedObject.transform.position = new Vector3(data.X,
data.Y, data.Z);
Renderer objRenderer =
loadedObject.GetComponent<Renderer>();
if (objRenderer != null)
{
// Update the color of the loaded object
Color color;
if (ColorUtility.TryParseHtmlString("#" +
data.Color, out color))
{
objRenderer.material.color = color;
}
else
{
Debug.LogError("Failed to parse color: " +
data.Color);
}
}
else
{
Debug.LogError("Renderer not found on loaded
object.");
}
}
else
{
Debug.LogError("Prefab not found at index: " +
prefabIndex);
}
}
else
{
Debug.LogError("Invalid prefab index: " + prefabIndex);
}
}
Debug.Log("Loaded " + savedItems.Count + " items from the
database.");
}
});
}
private int GetPrefabIndex(GameObject obj)
{
for (int i = 0; i < prefabs.Length; i++)
{
if (prefabs[i] == obj)
{
return i;
}
}
return -1; // Default value if the prefab is not found
}
private void Select(GameObject obj)
{
if (obj == selectedObject) return;
if (selectedObject != null) Deselect();
Outline outline = obj.GetComponent<Outline>();
if (outline == null) obj.AddComponent<Outline>();
else outline.enabled = true;
selectedObject = obj;
if (objectToId.ContainsKey(obj))
{
idTextObj.GetComponent<TextMeshProUGUI>().text = "ID: " +
objectToId[obj];
}
else
{
objectToId[obj] = idCounter;
idTextObj.GetComponent<TextMeshProUGUI>().text = "ID: " + idCounter;
idCounter++;
}
Vector3 objectPosition = obj.transform.position;
textTmpObj.GetComponent<TextMeshProUGUI>().text = $"X:
{objectPosition.x:F2}, Y: {objectPosition.y:F2}, Z: {objectPosition.z:F2}";
Renderer objRenderer = obj.GetComponent<Renderer>();
if (objRenderer != null)
{
colorTextObj.GetComponent<TextMeshProUGUI>().text = "Color: " +
objRenderer.material.color.ToString();
}
else
{
colorTextObj.GetComponent<TextMeshProUGUI>().text = "Color: N/A";
}
prefabNameTextObj.GetComponent<TextMeshProUGUI>().text = "Prefab Name: " +
obj.name;
}
private void Deselect()
{
Outline outline = selectedObject.GetComponent<Outline>();
if (outline != null)
{
outline.enabled = false;
}
selectedObject = null;
textTmpObj.GetComponent<TextMeshProUGUI>().text = "";
colorTextObj.GetComponent<TextMeshProUGUI>().text = "";
prefabNameTextObj.GetComponent<TextMeshProUGUI>().text = "";
idTextObj.GetComponent<TextMeshProUGUI>().text = "";
}
[System.Serializable]
public class SelectionData
{
public float X;
public float Y;
public float Z;
public string Color;
public int PrefabIndex;
public int Id;
}
}