Unity使用Photon PUN开发时如何在场景中显示已加入的房间名称?
Photon PUN 加入房间后显示房间名实现方案
1. 前置准备
- 在游戏场景中创建 UGUI Text 或 TextMeshProUGUI 组件,命名为
RoomNameDisplay,调整到合适的显示位置 - 新建独立控制脚本,命名为
RoomUIManager.cs,挂载到场景中永久存在的UI节点上
2. 基础实现(脚本逻辑)
首先引入必要命名空间:
using Photon.Pun; using Photon.Realtime; // 用UGUI Text加下面这行 using UnityEngine.UI; // 用TextMeshPro加下面这行 // using TMPro;
脚本继承MonoBehaviourPunCallbacks以使用PUN官方回调,重写加入房间成功的触发方法:
public class RoomUIManager : MonoBehaviourPunCallbacks { // Inspector面板拖拽赋值对应UI组件 public Text roomNameText; // TextMeshPro版本改为 public TMP_Text roomNameText; // 加入房间成功后PUN会自动调用该方法 public override void OnJoinedRoom() { // 直接从Photon当前房间实例获取名称 string roomName = PhotonNetwork.CurrentRoom.Name; roomNameText.text = $"房间名:{roomName}"; base.OnJoinedRoom(); } }
3. 场景切换场景适配
如果你的逻辑是「加入房间成功后才切换到游戏场景」,会出现回调触发时游戏场景还未加载、UI组件不存在的问题,按以下方式修改:
方式一:直接在游戏场景加载后读取房间信息
游戏场景的RoomUIManager改为在Start生命周期读取,无需额外存储:
private void Start() { if (PhotonNetwork.InRoom) { roomNameText.text = $"房间名:{PhotonNetwork.CurrentRoom.Name}"; } }
方式二:静态变量暂存
如果需要跨场景传递更多房间信息,可以用静态变量暂存:
// 全局静态存储类 public static class GameTempData { public static string CurrentRoomName; }
在加入房间的逻辑脚本中先存值再切场景:
public override void OnJoinedRoom() { GameTempData.CurrentRoomName = PhotonNetwork.CurrentRoom.Name; PhotonNetwork.LoadLevel("GameScene"); }
游戏场景中读取即可:
private void Start() { roomNameText.text = $"房间名:{GameTempData.CurrentRoomName}"; }
注意事项
- 不要在
Awake生命周期读取PhotonNetwork.CurrentRoom,可能因Photon状态未同步完成导致空引用 - 创建房间时需确保传入的房间名非空,避免显示空白
- 可重写
OnLeftRoom回调实现退出房间后清空房间名显示的逻辑
内容的提问来源于stack exchange,提问作者BlckAddict
相关产品推荐
相关产品推荐

