You are on page 1of 6

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;
}
}

You might also like