Friends: Example of Implementation¶
Displaying the GOG GALAXY Friends List¶
User Experience¶
The simplest example of this class in action is displaying the friends list on screen. Launch the game and when the Main Menu scene is loaded, please click the Friends button (under Statistics). If you are logged in to GOG GALAXY, you should see a list of your friends with their current status displayed.
Solution¶
This is accomplished in the FriendsController script, which is attached to the FriendsScreen GameObject in the MainMenu scene. The script itself can be found in Assets/Scripts/UI/MainMenu.
Variables¶
The following variables are defined:
Variable | Description |
---|---|
public GameObject entries |
Unity Game Object which serves as a container for displaying all friends entries |
public GameObject entryPrefab |
Prefab used to display usernames and statuses; it can be found in Assets/Prefabs/UI/Entries/entryStatAchievementFriend |
private List<GameObject> entryList |
This is used to store all currently displayed friends entries, so we can dispose of them easily when needed |
private Dictionary<Galaxy.Api.PersonaState, string> personaStateEnumToStringMap |
Dictionary used as a map to transform Galaxy.Api.PersonaState enums into human readable strings |
Methods and Usage¶
There are only two methods defined in this class:
- DisplayFriendList is called when the GameObject is enabled (i.e. when the Friends screen is displayed).
- DisposeFriendList is called when the GameObject is disabled (i.e. when the Friends screen is closed).
DisplayFriendList¶
void DisplayFriendList()
{
uint friendsCount = GalaxyManager.Instance.Friends.GetFriendCount();
for (uint i = 0; i < friendsCount; i++)
{
Galaxy.Api.GalaxyID galaxyID = null;
Galaxy.Api.PersonaState personaStateEnum = Galaxy.Api.PersonaState.PERSONA_STATE_OFFLINE;
string personaStateName = null;
GameObject currentObject = null;
galaxyID = GalaxyManager.Instance.Friends.GetFriendByIndex(i);
personaStateEnum = GalaxyManager.Instance.Friends.GetFriendPersonaState(galaxyID);
personaStateEnumToStringMap.TryGetValue(personaStateEnum, out personaStateName);
currentObject = Instantiate(entryPrefab, entries.transform);
currentObject.transform.GetChild(0).GetComponent<Text>().text = GalaxyManager.Instance.Friends.GetFriendPersonaName(galaxyID);
currentObject.transform.GetChild(1).GetComponent<Text>().text = (personaStateName != null) ? personaStateName : "Unknown" ;
entryList.Add(currentObject);
}
}
First, we get the current user friend count using GetFriendCount from the Friends class and assign it to an unsigned integer friendsCount
. Once we have the friend count, we are ready to display the users list with a simple for
loop. Inside the loop we:
- Define variables:
galaxyID
of the Galaxy.Api.GalaxyID type for storing the current user’s GalaxyID and assign it null value to initialize the variable,stateName
string variable for storing user readable state name,currentObject
GameObject variable for easier access to the currently edited GameObject.
- Assign the GalaxyID of the currently processed user to the
galaxyID
variable, using theGetFriendByIndex
method and passing the index of thefor
as a parameter. - Assign a value to the
personaStateEnum
variable using theGetFriendPersonaState
method and passinggalaxyID
as a value. - Assign a user readable value to the
personaStateName
variable by callingTryGetValue
method on personaStateEnumToStringMap and passingpersonaStateEnum
andpersonaStateName
as parameters. - Instantiate
entryPrefab
using entries GameObject transform as a parent. Please note that the entries GameObject is using Unity VerticalLayoutGroup to group all of its children. - We assign values to the text objects inside our prefab, using Unity Transform inheritance. Then we use the GetFriendPersonaName to set the name, and the previously assigned
stateName
variable to set the state of the displayed user. - Finally, we add the
currentObject
variable to the list of displayed objects.
DisposeFriendList¶
void DisposeFriendList()
{
foreach (GameObject child in entryList)
{
Destroy(child);
}
entryList.Clear();
entryList.TrimExcess();
}
We iterate through all currently displayed friend entries using a foreach
loop within the entryList
created in the DisplayFriendList
method to destroy all displayed entries. After the loop is finished, we clear and trim entryList
.
Displaying Invite Friends List¶
Very similar use of the Friends class can be seen in the FriendInviteController class, which can be found in Assets/Scripts/UI/MainMenu.
The biggest difference between this and the FriendsController class is that it displays entries only for friends that are currently online. Moreover, this class uses a different prefab, which includes a button and attaches a listener for the onClick event to that button that will send an invite to a specified friend.
More about invites in further articles.