Photon Unity Networking基础教程 2 Lobby UI

Photon Unity Networking基础教程 2 Lobby UI

这部分将会集中于给Lobby创建用户界面。这部分的内容非常基础,并且跟网络关系不大。

主要内容

  • Play按钮
  • 玩家名字
  • 连接进度

Play按钮

目前我们的Lobby是把我们自动连接到一个房间,这是有益于早期测试,但我们想让用户选择是否以及何时开始游戏。 因此,我们将简单地提供一个Button。

  1. 打开场景Launcher
  2. 使用Unity菜单'GameObject/UI/Button'创建一个按钮,命名为Play Button,注意他在场景中创建了Canvas和EventSystem游戏对象,省了我们的事了,nice:)
  3. 编辑Play Button的Text值为“Play”
  4. 选择Play Button然后定位到按钮组建的On Click()部分
  5. 点击小的加号“+”添加一条
  6. 把Launcher对象从Hierachy面板中拖过来
  7. 在下拉列表中选择Launcher.connect()函数。我们现在把按钮和Launcher脚本连起来了,当用户点击按钮的时候,将会调用Launcher脚本的connect()函数
  8. 打开Launcher脚本
  9. 把Start()函数中的connect()函数删除
  10. 保存Launcher脚本和场景

现在点击Play,你会发现需要点击按钮才能进行连接了。

玩家名字

典型游戏的另一个重要的最低要求是让用户输入他们的名字,以便其他玩家知道他们正在和谁玩。 我们将实现这个简单的任务,通过使用PlayerPrefs记住名字,以便当用户打开游戏,我们可以知道名字是什么。 要为您的游戏创建一个伟大的用户体验的话,这是一个非常方便和相当重要的功能。

让我们先创建一个脚本来管理和记住玩家的名字,然后创建相关的UI。

创建玩家名字输入框

  1. 创建一个新的C#脚本,命名为PlayerNameInputField

  2. 下面是脚本的全部内容,编辑然后保存

     using UnityEngine;
     using UnityEngine.UI;
     using System.Collections;
      
     namespace Com.MyCompany.MyGame
     {
         /// <summary>
         /// Player name input field. Let the user input his name, will appear above the player in the game.
         /// </summary>
         [RequireComponent(typeof(InputField))]
         public class PlayerNameInputField : MonoBehaviour
         {
             #region Private Variables        
      
             // Store the PlayerPref Key to avoid typos
             static string playerNamePrefKey = "PlayerName";         
      
             #endregion         
      
             #region MonoBehaviour CallBacks         
      
             /// <summary>
             /// MonoBehaviour method called on GameObject by Unity during initialization phase.
             /// </summary>
             void Start () {         
      
                 string defaultName = "";
                 InputField _inputField = this.GetComponent<InputField>();
                 if (_inputField!=null)
                 {
                     if (PlayerPrefs.HasKey(playerNamePrefKey))
                     {
                         defaultName = PlayerPrefs.GetString(playerNamePrefKey);
                         _inputField.text = defaultName;
                     }
                 }         
      
                 PhotonNetwork.playerName =  defaultName;
             }         
      
             #endregion         
      
             #region Public Methods                 
             /// <summary>
             /// Sets the name of the player, and save it in the PlayerPrefs for future sessions.
             /// </summary>
             /// <param name="value">The name of the Player</param>
             public void SetPlayerName(string value)
             {
                 // #Important
                 PhotonNetwork.playerName = value + " "; // force a trailing space string in case value is an empty string, else playerName would not be updated.         
      
                 PlayerPrefs.SetString(playerNamePrefKey,value);
             }         
      
             #endregion
         }
     }
    

下面分析一下这个脚本:

  • RequireComponent(typeof(InputField))

我们首先保证这个脚本必须InputField组件,这可以方便快捷的保证使用该脚本没有错误。

  • PlayerPrefs.HasKey(), PlayerPrefs.GetString() and PlayerPrefs.SetString()

PlayerPrefs是一个简单的配对条目的查找列表(像一个excel表有两列),一个是键,一个是值。 Key是一个字符串,是完全任意的,你决定如何命名,你需要在整个开发过程中记住它。因此,有必要总是将PlayerPrefs键存储在一个地方,一个方便的方法是使用Static变量声明,因为它不会随着时间的推移在游戏过程中改变,并且每次都是相同的。

所以,逻辑非常简单。如果PlayerPrefs有一个给定的键,我们可以得到它,并当我们要用的时候直接赋值。在我们的案例中,我们在启动时填充InputField时,在编辑过程中,我们把当前InputField的值设置给PlayerPref键,然后我们确定它被存储在用户设备上以供稍后检索(下一次用户打开此游戏)。

  • PhotonNetwork.playerName

这是此脚本的要点,设置玩家在网络上的名称。 脚本在两个地方使用它,一次是在Start()中检查名称是否存储在PlayerPrefs中,一次是在公共方法SetPlayerName()中。 现在,没地方调用这个方法,我们需要绑定InputField OnValueChange()来调用SetPlayerName(),这样每次用户编辑InputField时,我们都会记录它。 我们可以做到这一点,只有当用户按下播放,这取决于你,但是这需要些更多的脚本,所以为了清楚起见让我们保持简单。 这也意味着,不管用户将做什么,输入将被记住,这通常是期望的行为。

为玩家的名字创建UI

  1. 确保你打开的是Launcher场景
  2. 使用Unity菜单'GameObject/UI/InputField'创建InputField,命名为Name InputField
  3. 把RectTransform中的PosY值设置为35,它会在PlayButton的上面
  4. 定位到Name InputField的子对象PlaceHolder,设置它的文本值为"Enter your Name..."
  5. 选择Name InputField对象
  6. 把我们刚才创建的PlayerNamerInputField脚本给它加上
  7. 定位到InputField组件的On Value Change (String)部分
  8. 点击加号“+”添加一条
  9. 把PlayerNamerInputField拖拽到框里
  10. 下拉列表中选择PlayerNameInputField.SetPlayerName()
  11. 保存场景

好了,你可以点击play运行,输入你的名字,然后停止play,再次点击play启动,你刚才输入的名字就会有了。

我们实现了功能,然而在用户体验方面,我们缺少连接进度的反馈,还缺少当连接期间和加入房间时出现问题时的反馈。

连接进度

我们在这里尽量保持简单,隐藏名称字段和play按钮,并在连接期间将其替换为简单的文本“正在连接...”,并在需要时将其切换回来。

为此,我们把播放按钮和名称字段做成一个组,以便我们只需要激活和停用该组。 后来更多的功能可以添加到组,它不会影响我们的逻辑。

  1. 确保你打开的是Launcher场景
  2. 使用unity菜单'GameObject/UI/Panel'创建UI面板,命名为Control Panel
  3. 删除Control Panel的Image和Canvas Renderer组件,我们不需要任何可视元素,我们只关心它的内容
  4. 把Play Button 和 Name InputField拖拽到Control Panel对象上去
  5. 使用unity菜单'GameObject/UI/Text'创建UI文字,命名为Progress Label,不用关心它影响了显示,我们将在运行时激活和停用它们
  6. 选择Progress Label的Text组件
  7. 设置对齐方式为center align和middle align
  8. 设置文字为“Connecting...”
  9. 设置颜色为白色或者其他和背景有区别
  10. 保存场景

此时,为了测试,您可以简单地启用/禁用Control Panel和Progress Label,以查看各种连接阶段的情况。 现在让我们编辑脚本以控制这两个GameObjects激活。

  1. 编辑脚本Launcher

  2. 在Public Properties区块添加下面两个属性

     [Tooltip("The Ui Panel to let the user enter name, connect and play")]
     public GameObject controlPanel;
     [Tooltip("The UI Label to inform the user that the connection is in progress")]
     public GameObject progressLabel;
    
  3. 把下面的代码加入Start函数

     progressLabel.SetActive(false);
     controlPanel.SetActive(true);
    
  4. 在Connect方法开头添加下面的代码

     progressLabel.SetActive(true);
     controlPanel.SetActive(false);
    
  5. 在OnDisconnectedFromPhoton方法开头添加下面的代码

     progressLabel.SetActive(false);
     controlPanel.SetActive(true);
    
  6. 保存Launcher脚本,等待unity编译结束

  7. 确保打开场景Launcher

  8. 在Hierarchy中选中Launcher对象

  9. 把Hierarchy中的Control Panel和Progress Label拖拽到对应的Launcher中的组件

  10. 保存场景

现在,如果你运行场景。 您将看到只有控制面板,可见,一旦您单击播放,将显示Progres标签。

到此为止,我们做好了Lobby部分。 为了进一步增加Lobby的功能,我们需要切换到游戏本身,并创建各种场景,以便我们可以在加入房间时最终加载正确的级别。 我们将在接下来的部分完成,然后,我们将完成Lobby系统。

原文

http://doc.photonengine.com/en-US/pun/current/tutorials/pun-basics-tutorial/lobby-ui

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容