Files
unity-application/Assets/Accounts/Scripts/ChangeUserScreen.cs
2023-03-12 19:36:37 +00:00

91 lines
2.8 KiB
C#

using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class ChangeUserScreen : MonoBehaviour
{
/// <summary>
/// Prefab of the user selection
/// </summary>
public GameObject userPrefab;
/// <summary>
/// Reference to the container to list all users
/// </summary>
public Transform usersContainer;
/// <summary>
/// Reference to the user list
/// </summary>
public UserList userList;
/// <summary>
/// Index of the current selected user in the UserList
/// </summary>
private int currentUserIndex;
/// <summary>
/// List of references to avatar background sprites (so we can color them nicely)
/// </summary>
private List<Image> userBackgrounds = new List<Image>();
/// <summary>
/// Start is called before the first frame update
/// </summary>
void Start()
{
List<User> users = userList.GetUsers();
currentUserIndex = userList.GetCurrentUserIndex();
for (int i = 0; i < users.Count; i++)
{
User user = users[i];
// Create instance of prefab
GameObject instance = GameObject.Instantiate(userPrefab, usersContainer);
// Store value of i so we can use it the callback (else it would get the value of sprites.Count)
int x = i;
// Add onClick callback
instance.GetComponent<Button>().onClick.AddListener(() => UpdateSelection(x));
// Set username
instance.GetComponentInChildren<TMP_Text>().text = user.username;
// Store reference to image for fancy coloring
Image background = instance.GetComponent<Image>();
userBackgrounds.Add(background);
// Set background color
background.color = i == currentUserIndex ? Color.blue : Color.gray;
// Find correct component for setting the sprite
foreach (Image img in background.GetComponentsInChildren<Image>())
if (img != background)
{
img.sprite = user.avatar;
break;
}
}
}
/// <summary>
/// Update the current selected user
/// </summary>
/// <param name="index">Index to the user in the <c>this.userBackgrounds</c> list</param>
private void UpdateSelection(int index)
{
userBackgrounds[currentUserIndex].color = Color.gray;
currentUserIndex = index;
userBackgrounds[currentUserIndex].color = Color.blue;
}
/// <summary>
/// Select the current selected user and return to the StartScreenScene
/// </summary>
public void IChooseYou()
{
userList.ChangeCurrentUser(currentUserIndex);
userList.Save();
SceneManager.LoadScene("Common/Scenes/StartScreen");
}
}