редактировать значение Struct в Unity C # - PullRequest
0 голосов
/ 02 сентября 2018

Я создал словарь с именем «Команды» и использую структуру для хранения целого числа, строки и логического значения.

Так что, если кто-то присоединится к красной команде, bool будет ложным, чтобы другие игроки не могли присоединиться к той же команде.

Я пытался установить логическое значение false, но это не удалось.

public Dictionary <int , myCustomType> Teams = new Dictionary<int,myCustomType>();

private ExitGames.Client.Photon.Hashtable m_PlayerCustomPropeties = new ExitGames.Client.Photon.Hashtable();

private void addTeams() 
{
    myCustomType t=new myCustomType();

    t.name="Yellow"; 
    t.flag= true;
    Teams.Add(1,t);

    t.name="Red"; 
    t.flag= true;
    Teams.Add(2,t);

    t.name="Blue"; 
    t.flag= true;
    Teams.Add(3,t);

    t.name="Green"; 
    t.flag= true;
    Teams.Add(4,t);

    Debug.Log("Teams created.");
}

public void getPlayers() 
{
    Debug.Log(Teams[1].flag);
    Teams[1] = new myCustomType { flag = false };
}

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Это похоже на анти-паттерн. Сделайте вашу структуру неизменной (в любом случае вам может не понадобиться структура для этого, особенно если команде нужны другие функции):

public struct myCustomType
{   
    public string Name { get; }

    public myCustomType(string name)
    {
        this.Name = name;
    }
}

Создайте набор доступных команд, которые вы заполняете аналогично вашему addteams методу:

public Dictionary<string, myCustomType> AvailableTeams; //color, team
public void InitializeTeams()
{
    AvailableTeams = new Dictionary<string, myCustomType>()
    {
        ["Yellow"] = new myCustomType("Yellow"),
        ["Red"] = new myCustomType("Red"),
        ["Blue"] = new myCustomType("Blue"),
        ["Green"] = new myCustomType("Green")
    };
}

Когда игрок присоединяется к команде, удалите эту команду из доступного набора и добавьте ее в набор ActiveTeams:

public Dictionary<int, myCustomType> ActiveTeams; //player #, team

public void JoinTeam(int playerNumber, string teamColor)
{
    if (!AvailableTeams.TryGetValue(teamColor, out myCustomType team)
    // handle team already taken.

    ActiveTeams.Add(playerNumber, team);
    AvailableTeams.Remove(teamColor);
}
0 голосов
/ 02 сентября 2018

Ваш тип определяется как:

public struct myCustomType
{
  public string name;
  public bool flag;
}

А Teams является Dictionary<int, myCustomType>. Когда вы попробовали что-то вроде:

Teams[1].flag = false;

это не удалось, потому что Teams[1] это просто значение (возвращаемое значение Dictionary<,> индексатора геттера).

Ваш тип myCustomType является изменяемой структурой. Структура возвращается по значению, поэтому нет смысла пытаться изменить возвращенную копию значения.

Вам понадобится:

var mct = Teams[1];  // 'mct' is a copy of the value from the 'Dictionary<,>'.
mct.flag = false;    // You modify the copy which is allowed because 'mct' is a variable.
Teams[1] = mct;      // You overwrite the old value with 'mct'.

Некоторые люди считают изменчивыми структурами зла .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...