基本游戏流程:
1、打开游戏需要检测是否需要热更(涉及热更相关的东西就不说了太多了,百度就可以了)加载loading界面。下载资源完成
2、进入登录界面,执行登录方面以及注册方面的校验逻辑。
3、退出登录场景(状态),进入主城(主界面),然后正八经进入游戏开始玩了。
上面的虽然都是废话,但是整个游戏UI的控制,其实就是一直进行这样一个简单的循环。
退出上一个场景(可能需要做一些事情:清理内存,销毁一些不必要的预制体)——进入新的场景(可能需要做一些事情:加载Loading界面,加载状态内的资源,例如场景中的一些房子模型,人物模型等等)——加载完成(关闭loading界面)
下面三个是常用的一些工具或者框架中简单但是挺重要的模块,因为简单就不过多介绍了。
1、小工具之类的东西:单例基类。不多介绍,这个不会的话可能真的需要自己去补一下C#基础知识了啊~~
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class AutoSingleton<T> :MonoBehaviour where T:MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
GameObject go = new GameObject(typeof(T).ToString());
instance = go.AddComponent<T>();
}
return instance;
}
}
}
2、小工具:拓展方法,递归查找子物体;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public static class ExpandFunc
{
public static Transform FindChildWithName(this Transform self,string targetName)
{
if (self.name == targetName)
return self;
if (self.childCount < 1)
return null;
Transform target;
for (int i = 0; i < self.childCount; i++)
{
target = self.GetChild(i).FindChildWithName(targetName);
if (target)
return target;
}
return null;
}
}
3、框架中经常用到的一个部分,消息传递:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public delegate void LoadDel(float num);//可以自定义泛型委托;
public static class MessageManager
{
//用于存储 想要执行的委托字典;
private static Dictionary<string, LoadDel> m_loadDic = new Dictionary<string, LoadDel>();
//将消息或者委托注册到字典中
public static void AddListener(string funcName, LoadDel loadDel)
{
if (m_loadDic.ContainsKey(funcName))
{
m_loadDic.Remove(funcName);
}
m_loadDic.Add(funcName, loadDel);
}
//执行的时候,就可以通过string把委托从字典取出来,执行,num是一个参数,可以根据自己的需要自定义泛型委托或者固定参数的委托;
public static void DoFunc(string funcName, float num)
{
LoadDel temDel = null;
if (m_loadDic.TryGetValue(funcName, out temDel))
{
temDel(num);
MDebug.Log("执行了方法:" + funcName);
}
}
public static void RemoveFunc(string funcName)
{
m_loadDic.Remove(funcName);
}
public static void ClearAllFunc()
{
m_loadDic.Clear();
}
}
一、状态(通常可以理解为一个状态,就是一个场景,或者在一个模块中想要干的一系列事情。)
由此可知,加载场景就需要两个东西:第一加载场景管理类,第二状态管理类。这两个是有区别的,第一个是从硬盘中把场景资源加载进来,第二个是决定管理这些状态什么时候加载,什么时候卸载。这两个管理类暂时先不说,之后详细介绍,也是核心的部分!
1)状态基类:
public abstract class BaseScene
{
//开始加载
public void Start()
{
UIManager.LoadPanel(); //通过UI管理类加载LoadingPanel;
OnStart();
}
//退出场景
public void Stop()
{
OnStop();
}
//场景加载完成,这个参数的用处,之后会介绍的;
public void LoadComplete(params object[] args)
{
OnLoadComplete(args);
}
protected abstract void OnStart();
protected abstract void OnStop();
protected abstract void OnLoadComplete(params object[] args);
}
2)先简单举一个例子,作为具体实现状态基类的方法,当进入登录场景的时候,实现具体的虚方法,会在基类BaseScene中调用。
public class LoginStateScene : BaseScene
{
protected override void OnLoadComplete(params object[] args)
{
//关于UIManger以后介绍;
UIManager.LoadPanel(PanelNameEnum.LoginPanel, PanelNameEnum.None);
}
protected override void OnStart()
{
}
protected override void OnStop()
{
UIManager.DestoryPanel(PanelNameEnum.LoginPanel);
}
}
这两个没什么难度,就是简单的继承而已。在之后要写的状态管理类中,就会发现进入一个场景之前,想要执行Stop方法,然后执行场景的Start方法。这个流程就是在状态管理类中控制的;
至于UIManager这管理类先不要去管它。之后会详细介绍UI代码如何处理;接下来可能需要先介绍一下AB包管理器了(本来想着直接用本地加载算了,不用ab包了。后来想着反正都写了框架,多介绍一点是一点吧);