Unity3d实战之Unity3d网络游戏实战篇(2):代码资源分离的界面系统
- 阅读文章前请细读以下几点:
- 学习书籍《Unity3d网络游戏实战》 罗培羽著 机械工业出版。
- 本文是作者在学习过程中遇到的认为值得记录的点,因此引用的代码等资源基本出资罗培羽老师的书籍 以下为个人的学习简记,与诸君共论。
- 由于U3D的官方案例Tank Tutorial中对坦克的基本操作已经有了详尽的描述(其实是我懒..),因此本文着重于面板系统、服务端基本网络框架和客户端基本网络框架的搭建。
- 如有疑问或者描述错误的地方,欢迎各位提出或修正,讨论交流是获取和巩固知识的重要途径之一!
代码资源分离的界面系统
刚刚入门U3D的时候,如果要写一个界面系统肯定会瞎写一通(抱歉我菜,基础功不扎实..),比如说,当需要在其他面板的逻辑中关闭另一个面板时,通常都是xxx.enable = false就ok了,或者在每一个面板的逻辑中都写了关闭面板的public方法供其他调用,当做的游戏渐渐大了起来之后发现有些地方很不好管理,而且代码也显得凌乱,每次写新面板的时候都要重新造轮子,看着心烦。这时就要找回基础(没错,基础功不扎实说的就是我…),复习一下类的继承、虚函数、泛型编程等。要记住,我们是面向对象…编程的!
要构建一个通用的界面系统,首先要了解到代码与资源分离是游戏程序设计的核心思想之一,因为游戏公司里,美工和程序是两个人,如果代码和资源是黏在一起的话会有很多问题产生,而且不利于代码的重复使用。
然后构思面板的生命周期(即面板对象被创建出来后到销毁的整个过程),书中对面板周期这样定义:
Init -> OnShowing -> OnShowed -> Update -> OnClosing -> OnClosed
Init:面板初始化阶段,用于处理一些参数;
OnShowing:面板显示前调用OnShowing,可用于处理面板中的监听事件;
OnShowed:面板显示后调用OnShowed,可在OnShowed前插播一个面板飞入动画;
Update:每帧更新一些东东
OnClosing:面板关闭前调用OnClosing;
OnClosed:面板关闭后调用OnClosed,可在OnClosed前插播一个面板飞出动画
插入一段面板基类的定义:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PanelBase : MonoBehaviour {
#region Properties
public string skinPath; // skin's actual path = 'Assets/Resources/' + skinPath
public GameObject skin; // an instance based on skinPath.
public PanelMgr.PanelLayer layer; // current panel's layer(equal to which group the panel belong to.)
public object[] args; // panel's arguments.
#endregion
#region Operation Cycle
/*
* Panel's basic life-time:
* Init -> OnShowing -> OnShowed -> Update -> OnClosing -> OnClosed
*/
/// <summary>
/// Init the panel with args.
/// </summary>
/// <param name="args">panel initia arguments.</param>
pub