rgd1998 2022-07-22 22:22 采纳率: 0%
浏览 1369
已结题

#unity##Mirror#多用户位置及摄像头实时画面

问题遇到的现象和发生背景

本来是在unity mirror插件下实现一个VR下的三维场景中的多用户玩家联网的虚拟自行车角色漫游任务,但是目前需要在每个用户的自行车角色头顶加入一个电脑摄像头的画面,并且当互相联网时在VR眼睛中可以看到彼此的位置的变化以及头顶上电脑摄像头拍摄的该用户自己的实时画面(有声音的互动更好)。
前期已经使用Mirror自带的NetworkManager将自行车角色prefab拖入,并给prefab挂了Network Transform脚本,这样实现了多用户联网时的位置移动。接着为了实现电脑摄像头的采集功能,引用了林新发@林新发 做好的Mirror下的视频通话packagehttps://blog.csdn.net/linxinfa/article/details/119136203,并把视频通话canvas置于前面做好的自行车prefab内,这样就完成了电脑摄像头画面对自行车位置的跟随。但林新发的视频通话中挂载于gameobject下的video chat network脚本与mirror自带的network Manager脚本会冲突(一个场景中只能有一个Network Manager),故无法实现。

问题相关代码

林新发的video chat network脚本

public class VideoChatNetwork : NetworkManager
{
    private Action onStartHost;
    private Action onStartClient;

    public struct CreatePlayerMessage : NetworkMessage
    {
        public string name;
    }

    public void DoStartHost(Action cb)
    {
        onStartHost = cb;

        StopHost();
        StopClient();

        StartHost();
    }

    public void DoStartClient(Action cb)
    {
        onStartClient = cb;
        StopHost();
        StopClient();

        StartClient();
    }    


    public override void OnStartServer()
    {
        base.OnStartServer();
        NetworkServer.RegisterHandler<CreatePlayerMessage>(OnCreatePlayer);
        if (null != onStartHost)
        {
            onStartHost();
        }
    }

    [Obsolete]
    public override void OnClientConnect(NetworkConnection conn)
    {
        base.OnClientConnect(conn);

        // tell the server to create a player with this name
        conn.Send(new CreatePlayerMessage { name = MainLogic.instance.accountName });
        
        if (null != onStartClient)
        {
            onStartClient();
        }
    }

    [Obsolete]
    public override void OnClientDisconnect(NetworkConnection conn)
    {
        base.OnClientDisconnect(conn);
        // 返回到登录界面
        MainLogic.instance.OnClientDisconnect();
    }

    void OnCreatePlayer(NetworkConnection connection, CreatePlayerMessage createPlayerMessage)
    {
        // create a gameobject using the name supplied by client
        GameObject playergo = Instantiate(playerPrefab);
        playergo.GetComponent<Player>().accountName = createPlayerMessage.name;

        // set it as the player
        NetworkServer.AddPlayerForConnection((NetworkConnectionToClient)connection, playergo);

    }

自己的Prefab具体样子

img

尝试过的方法

我还尝试了在scene中加入了camera并让其在屏幕右上角显示为小地图形式,其内容为林新发视频通话的canvas,这样的话untiy无法正常运行

想要达到的结果

可以在VR眼镜中看到多个用户的自行车位置变化以及头顶摄像头采集的该用户自己的实时画面。

  • 写回答

3条回答

  • 林新发 Unity3D游戏开发领域优质创作者 2022-07-24 12:57
    关注

    你在项目里用的是Mirror的NetworkManager,可以像我一样写一个类继承NetworkManager,比如你的就叫VRNetworkManager,然后把我的VideoChatNetwork的逻辑代码搬进去就可以了

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月29日
  • 创建了问题 7月22日

悬赏问题

  • ¥500 把面具戴到人脸上,请大家贡献智慧
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急
  • ¥30 c#打开word开启修订并实时显示批注
  • ¥15 如何解决ldsc的这条报错/index error
  • ¥15 VS2022+WDK驱动开发环境
  • ¥30 关于#java#的问题,请各位专家解答!
  • ¥30 vue+element根据数据循环生成多个table,如何实现最后一列 平均分合并
  • ¥20 pcf8563时钟芯片不启振
  • ¥20 pip2.40更新pip2.43时报错