/// <summary> /// Ensure that there is no duplication of color /// </summary> private void VerifyPlayersColorsOnDropdownValueChanged() { List <DropdownColor> dropdownColors = new List <DropdownColor>(CanvasParent.GetComponentsInChildren <DropdownColor>()); foreach (DropdownColor ddc in dropdownColors) { TMP_Dropdown tmpdd = ddc.GetComponent <TMP_Dropdown>(); // Search the dropdown who changed its value if (tmpdd.value != ddc.LastSelectedValue) { if (ActualAvailableColor.Remove(tmpdd.value)) { ActualAvailableColor.Add(ddc.LastSelectedValue); } // Search a dropdown whose previous value correspond to the new value of the dropdown found previously DropdownColor ddcToSwap = dropdownColors.Find(x => x.LastSelectedValue == tmpdd.value); if (ddcToSwap != null) { // If a dropdown has been found then we change its value to avoid multiple same color ddcToSwap.DropdownColors.value = ddc.LastSelectedValue; } } } }
/// <summary> /// Add or remove the player fields according to the value selected in the dropdown /// </summary> /// <param name="firstGeneration">Allow to skip a verification when generating the player fields. Must be set to true for the first generation.</param> private void GeneratePlayerFields(bool firstGeneration = false) { if (NbPlayerSelected < ListPlayerFields.Count) { // Only remove the extra players fields to keep other players data int nbPlayerToRemove = ListPlayerFields.Count - NbPlayerSelected; int index = -1; for (int i = 0; i < nbPlayerToRemove; i++) { index = ListPlayerFields.Count - 1 - i; GameObject playerField = ListPlayerFields[index]; DropdownColor dropdownColor = playerField.GetComponentInChildren <DropdownColor>(); ActualAvailableColor.Add(dropdownColor.LastSelectedValue); Destroy(playerField); } if (index > -1) { ListPlayerFields.RemoveRange(index, nbPlayerToRemove); } } else { // Only add the new players fields (or add all of them if it's the first generation) int nbNewPlayer = NbPlayerSelected - ListPlayerFields.Count; for (int i = PreviousNbPlayerSelected; i < NbPlayerSelected; i++) { if (i >= nbNewPlayer || firstGeneration) { // Create the field and place it GameObject playerField = Instantiate(Resources.Load(PLAYER_FIELD_PREFAB_PATH)) as GameObject; playerField.name = PLAYER_FIELD_PREFAB_PATH; playerField.transform.parent = CanvasParent.transform; playerField.transform.localScale = new Vector3(PREFAB_SCALE, PREFAB_SCALE, PREFAB_SCALE); playerField.transform.position = new Vector3(START_POSITION_PLAYER_FIELD_X, START_POSITION_PLAYER_FIELD_Y - i); // Set the label and color Text label = playerField.GetComponentInChildren <Text>(); label.text = "Player " + (i + 1) + " : "; DropdownColor dropdownColor = playerField.GetComponentInChildren <DropdownColor>(); TMP_Dropdown dropdown = dropdownColor.GetComponent <TMP_Dropdown>(); dropdown.value = ActualAvailableColor[0]; ActualAvailableColor.RemoveAt(0); // Force the change of the color dropdownColor.DropdownValueChanged(dropdown); // Create event to avoid duplicate color dropdown.onValueChanged.AddListener(delegate { VerifyPlayersColorsOnDropdownValueChanged(); }); ListPlayerFields.Add(playerField); } } } PreviousNbPlayerSelected = NbPlayerSelected; }