在Photon Pun2多人环境中通过ReadyPlayerMe URL加载角色遇阻求助
基于C#的ReadyPlayerMe角色加载与Photon PUN同步方案
前置准备
- 确保Unity项目已正确导入ReadyPlayerMe Avatar Loader和Photon PUN 2包
- 完成Photon项目基础配置(填入AppID、设置房间规则等)
- 在ReadyPlayerMe设置面板中,启用「Allow Remote Avatar Loading」选项
核心加载脚本实现
创建名为RPM_PhotonAvatarLoader的C#脚本,挂载到玩家预制体上:
using UnityEngine; using Photon.Pun; using ReadyPlayerMe.AvatarLoader; public class RPM_PhotonAvatarLoader : MonoBehaviourPunCallbacks, IPunObservable { [SerializeField] private string defaultAvatarUrl = "你的默认角色URL"; private AvatarLoader avatarLoader; private string currentAvatarUrl; void Start() { avatarLoader = gameObject.AddComponent<AvatarLoader>(); avatarLoader.OnCompleted += OnAvatarLoaded; avatarLoader.OnFailed += OnAvatarLoadFailed; // 本地玩家主动加载角色,远程玩家等待URL同步 if (photonView.IsMine) { // 可替换为从本地存储/UI输入获取的自定义角色URL LoadAvatar(defaultAvatarUrl); } } public void LoadAvatar(string avatarUrl) { currentAvatarUrl = avatarUrl; if (photonView.IsMine) { avatarLoader.LoadAvatar(avatarUrl); } } private void OnAvatarLoaded(object sender, AvatarLoadEventArgs args) { // 适配角色与玩家预制体的父子关系及初始变换 args.Avatar.transform.parent = transform; args.Avatar.transform.localPosition = Vector3.zero; args.Avatar.transform.localRotation = Quaternion.identity; } private void OnAvatarLoadFailed(object sender, FailureEventArgs args) { Debug.LogError($"角色加载失败: {args.Message}"); } // 同步角色URL至其他客户端 public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) { if (stream.IsWriting) { stream.SendNext(currentAvatarUrl); } else { currentAvatarUrl = (string)stream.ReceiveNext(); // 远程客户端加载同步得到的角色 if (!photonView.IsMine) { avatarLoader.LoadAvatar(currentAvatarUrl); } } } }
关键配置与问题排查
- 玩家预制体必须添加
PhotonView组件,并将RPM_PhotonAvatarLoader加入PhotonView的观察列表 - 加载失败常见原因排查:
- 验证角色URL有效性(可直接在浏览器打开测试)
- 在Unity「Player Settings」中启用「Allow downloads over HTTP」(针对非HTTPS的URL)
- 确认ReadyPlayerMe的API密钥配置正确(若使用自定义角色生成功能)
- 避免在
Awake阶段执行加载逻辑,需等待Photon连接完成后再触发
内容的提问来源于stack exchange,提问作者Sachin
相关产品推荐
相关产品推荐

