0% found this document useful (0 votes)
15 views

Using UnityEngine

This document contains a C# script that allows selecting game objects and saving their properties like position, color, and prefab to a Firebase database. It handles raycasting to select objects, saving and loading data from Firebase, and displaying selected object properties.

Uploaded by

iwon wahyudi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
15 views

Using UnityEngine

This document contains a C# script that allows selecting game objects and saving their properties like position, color, and prefab to a Firebase database. It handles raycasting to select objects, saving and loading data from Firebase, and displaying selected object properties.

Uploaded by

iwon wahyudi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 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