先把SelectMenu中的camera的audio listener去掉。
现在还是平面,直接在camera下面添加两个panel即可,应该是用不到canvas了,都是2D的UI。
加完以后问题来了,角色选择界面的按钮跑到主界面上边了,而且现在账号密码都输不进去。
而且现在是有两个相机的。 而且增加panel时,会自动创建一个上层的canvas。
秉着不到最后不学习的原则,用之前的知识是可以解决这个问题的
1.先给角色选择界面的canvas添加一个标签。
2.类比挂在上注册panel(object)的RegPanelScript.cs中在Start中使用SetActive (false)的技巧,在Scripts文件夹中新建脚本SelectMenu.cs,并将其挂在canvas上边。在unity中新建,vs那边会自动更新过去的。
只添加一行代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SelectMenu : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
gameObject.SetActive(false);
}
// Update is called once per frame
void Update()
{
}
}
3.再把脚本挂到对应canvas上,play游戏,达到预期效果。
4.跳转场景后,我们要让之前隐藏的panel显示出来。在MessageManager.cs的LoginHandler中,当登陆成功BroadcastMessage("Loading", 1);之后
TMP_Text d = GameObject.FindWithTag("logText").GetComponent<TMP_Text>(); ;//得到两个Text对象
d.text = "登录成功";
Debug.Log("成功登录,要进行场景跳转了");
GameInfo.ACC_ID = dto.value;//静态类起到全局效果
GameInfo.GAME_STATE = GameState.LOADING;
BroadcastMessage("Loading", 1);//进入ResceneScript.cs调用loading,只要继承mono的都可以调
//GameInfo.GAME_STATE = GameState.LOADING;//加载状态其实我也用不到
//StartCoroutine("load",1);//调用一个写作函数--作用其实就是把登录代码卡住。
Debug.Log("等待下一次挑战");
GameObject m = GameObject.FindWithTag("selectMenuCanvas");
m.SetActive(true);
5.成功完成场景跳转,但没有显示button,原因时FindWithTag不能跨场景借助标签寻找对象,需要用find,修改角色选取界面canvas的名字为CanvasM,名字和tag是两回事。
但是物体需要处于active()处于true状态才能被find,实测也不行。
6.只能在角色SelectMenu的生命周期函数中想办法了,这么写确实降低了效率,但是只能这么写。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SelectMenu : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
gameObject.SetActive(false);
}
// Update is called once per frame
void Update()
{
Debug.Log(GameInfo.GAME_STATE);
Debug.Log(GameState.RUN);
if (GameInfo.GAME_STATE == GameState.RUN)
{
gameObject.SetActive(true);//这么写确实降低了效率,但是只能这么写
}
}
}
实测,Update在object处于非激活状态下,也是不干活的!
7.LoadLevelAsync已经是强弩之末了!东西过时是有道理的。
即使换成LoadSceneAsync其实也没有本质上的区别!