#c# #visual-studio #unity3d #photon
Вопрос:
В Playerprefs есть способ настройки и получения информации об игроках, такой как строка, int и т. Д.
Я использую photon для установки и получения строки каждого игрока, но она захватывает только одного локального игрока! Строка, которую вводит каждый игрок, впоследствии должна отображаться всем другим игрокам только при выполнении условия (bool).
Действительно ли Playerprefs хранит информацию о каждом игроке и может ли она быть получена (каждым игроком)?
Например: Когда настанет ваша очередь играть, скажем, bool установлен на true, а затем отобразите свою строку всем другим игрокам. Таким образом, игра должна быть активирована и предотвратить продолжение игры!
Я делаю это с помощью следующих сценариев ниже: Ваше предложение или исправление действительно много бы значило. Я застрял на некоторое время.
Мой первый сценарий (Входная строка):
[SerializeField] WordInfo wordInfo; void Update() { wordInfo.word = StringWord; } public void GetString() { StringWord = PlayerPrefs.GetString("word", "no word"); } //use Onclick to set the string public void SetString() { saveWord = InputWord.text; PlayerPrefs.SetString("word", saveWord); }
Мой второй сценарий (Извлеките введенную строку для чтения из другой сцены (статическая))
public class WordInfo: MonoBehaviour { public string word; public static WordInfo wordInfo; private void Awake() { if (wordInfo == null) { wordInfo = this; DontDestroyOnLoad(gameObject); } else if(wordInfo != this) { Destroy(wordInfo.gameObject); wordInfo = this; DontDestroyOnLoad(gameObject); } } }
Мой третий сценарий (сценарий игры — другая сцена)
public string TheSavedWord; private const string DISPLAY_MY_STRING_PLAYER = "{0} Your Word is displayed to others!"; private const string DISPLAY_OTHER_STRING_PLAYER = "{0}'s word has been Displayed!"; private const string MY_WORD = "{0} your word is: "; private void Update() { TheSavedWord = WordInfo.wordInfo.word; } public void ShowPlayerString() { //a bool to check when to display the string //if i am active and the isShow is set to true then display a notification Player_Notification.text = string.Format(isShow amp;amp; iAmActive ? DISPLAY_MY_STRING_PLAYER : DISPLAY_OTHER_STRING_PLAYER, activePlayer.NickName); //display the string WordToDisplay.text = string.Format(isShow amp;amp; iAmActive ? MY_WORD " " TheSavedWord: MY_WORD " " TheSavedWord, activePlayer.NickName); }
Комментарии:
1. Префы игрока являются локальными для игрока, устанавливающего значения. Если вам нужно передать значение всем клиентам, вам нужно будет использовать пользовательские свойства RPC или плеера.
2. PlayerPrefs хранит все, что вы хотите локально .. это не имеет никакого отношения к пользовательским свойствам Photon вообще …
3. Я пытаюсь использовать пользовательские свойства, но для меня это довольно технически! Я действительно знаю, чего хочу, но как только я начинаю печатать, я просто путаюсь с вызовом свойств.
4. @derHugo ваше руководство действительно будет много значить!
Ответ №1:
Это сработало отлично. После нескольких попыток и понимания я смог получить строку каждого игрока.
Вот код:
[SerializeField] WordInfo wordInfo; void Update() { wordInfo.word = saveWord; } //use Onclick to set the string public void SetString() { saveWord = InputWord.text; var hash = PhotonNetwork.LocalPlayer.CustomProperties; hash.Add("SaveWord", saveWord); PhotonNetwork.LocalPlayer.SetCustomProperties(hash); if (!PhotonNetwork.IsMasterClient) return; Debug.Log(PhotonNetwork.LocalPlayer.ToStringFull()); } public override void OnPlayerPropertiesUpdate(Player targetPlayer, ExitGames.Client.Photon.Hashtable changedProps) { base.OnPlayerPropertiesUpdate(targetPlayer, changedProps); if (!PhotonNetwork.IsMasterClient) return; if (!changedProps.ContainsKey("SaveWord")) return; }
Изначально я использовал префы игроков, которые вызывали игрока только локально. Итак, это был мой предыдущий код (исходный код до его улучшения):
[SerializeField] WordInfo wordInfo; void Update() { wordInfo.word = StringWord; } public void GetString() { StringWord = PlayerPrefs.GetString("word", "no word"); } //use Onclick to set the string public void SetString() { saveWord = InputWord.text; PlayerPrefs.SetString("word", saveWord); }
Комментарии:
1. Чтобы сделать этот ответ более понятным, не могли бы вы кратко описать разницу между вашим исходным кодом и кодом, который вы указали в ответе?
2. Только что обновил краткое описание исходного кода @PeterGordon