ARcore项目 MatchVS联网实现部分教程

目录介绍

       需要导入的为以下三部分:
       Script 下 Tea 文件夹下为项目部分脚本代码与预制体项目目录

运行说明

首先需要配置 Player Settings 中的 Api Conmpatibility Level在这里插入图片描述
       接着,Scene中 loginscene 与 mainscene 需要加入到 Build Settings 中的 Scenes 中。若要直接运行,需要将 loginscene 设置为初始场景,即后面标号为0。如图:
 Build Settings
       若要加到项目中以后引用,则调用 SceneManger.LoadScene(“loginscene”);

非常重要的事!!

目前版本,在 Unity 运行 MatchVS 联网时,每次运行结束再次运行时都会崩溃,需要重新启动 Unity,且运行前的部分全局设置会被还原。所以保险的方法是更改完全局设置后,直接保存并退出,重新打开 Unity。这个可能是由于内存未释放等原因造成的。后续版本进行改进。

代码介绍

       下面介绍几个较为重要的脚本。

tea_logincontroller脚本

       这个脚本挂载在 loginscene 的 controller 空物体下,里面配置了联网的 appkey、secret 等。有登录、创建房间等函数。它里面生成了一个静态类 tea_response。
在这里插入图片描述

tea_response脚本

       这个类在 loginscene 刚开始时就被创建,负责网络信息的回调。可参考官方文档。由于里面回调方法在调用正常方法时会出现问题,所以要么使用静态变量,如:在这里插入图片描述
要么参考我的上一篇博客

tea_addTag脚本

在这里插入图片描述       这个脚本控制点击实现物体之后的 Tag 或 Text 生成。注意要在每个需要生成相应动作的物体下都挂载此脚本,且添加合适的 Collider 组件。
       为实现每个物体下只有一个 Text 或 Tag,利用下面代码实现:

public void createTag()
    {
        Debug.Log("createTag");
        int childCount = this.transform.childCount;
        for (int i = childCount-1; i >=0 ; i--)	//从后向前遍历子物体
        {
            if(this.transform.GetChild(i).name.Contains("Tag")) //防止删除其他子物体
            {
                Debug.Log("Destory");
                Destroy(this.transform.GetChild(i).gameObject);
            }
        }
        Vector3 pos = new Vector3(1, 1, 1);		//偏移量
        Instantiate(Tag, this.transform.position + pos, this.transform.rotation, this.transform);		//实例化方法
    }

       为防止网络震荡导致不断重复产生物体,添加下面代码:

	public void createTagEvent()
    {
        Debug.Log("createTagEvent");
        JsonData data = new JsonData();
        data["action"] = "addtag";
        data["name"] = this.name;
        data["text"] = "test";
        string value = data.ToJson();
        GameManager.SendEvent(value, new int[] { GameManager.userID });
        listview.SetActive(false);
        createTag();
    }

       当本机发生点击事件时,调用 createTagEvent() 方法,可以给所有客户发送信息;当其他客户传递来点击事件时,调用 createTag() 方法。
同时为防止自己发送的信号再被自己重新接受处理,在 tea_getEvent 脚本中 getInfo 方法下有判断逻辑:

	public void getInfo(MsMsgNotify tRsp1)
    {
        Debug.Log(tRsp1.srcUserID);
        Debug.Log(GameManager.userID);
        if (tRsp1.srcUserID != GameManager.userID)
        {
            tRsp = tRsp1;
            Debug.Log("getInfo");
            flag = true;
        }
        else
            Debug.Log("getMyInfo");
        
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值