今天下午乖乖的跟着教学视频学习使用Unity3d完成期末的游戏课程实验,第一遍跟着做的时候没有什么印象,几天尝试一边做一遍整理,一遍查自己不明白的地方,发现有很多知识点课本上并没有学习到。先把下午的知识点整理一下,然后接着努力啦。
课时37:开发功能面板
1.功能面板:背包、状态、装备等信息 功能栏
(1)NGUI:Unity的导入资源,NGUI为unity中绘制游戏2d界面的插件,通常在做菜单,按钮等地方要用到。UGUI是unity4.6之后出现的Unity自己的UI技术,在某种程度上重新定义了UI技术规范,它的出现大有统一unity各种UI插件的目的。具体的使用方法:https://www.2cto.com/kf/201708/663727.html
(2)Invisible Widget:容器
(3)Sprite精灵:精灵是什么东西?它可以在一张大图中去截取一部分(大图就是整体图像集合,而截取的小图就是一个精灵),然后起一个精灵的名称,使用时通过精灵的名称就能直接绘制,并且精灵还可以播放动画。
2.添加状态按钮
(1)添加Box Collider盒子碰撞器,添加 Button Script
(2)设置正常和按下的图片
3.添加背包、装备、技能、设置按钮,放在FunctionBar右下端,设置Anchor,设置图片
课时38:功能按钮点击事件的监听
1.FunctionBar添加脚本来监听5个按钮,添加Function脚本
2.编辑脚本,添加5个方法,分别处理按钮的点击事件
public void OnStatusButtonClick()
public void OnBagButtonCLick()
public void OnEquipButtonCLick()
public void OnSkillButtonCLick()
public void OnSettingButtonCLick()
3.给上述5个方法添加监听
给每个按钮的OnClick添加对应的事件
课时39:物品信息管理系统,分析物品信息属性
1.开发背包管理系统:包括药品、装备等信息,因此先开发物品信息管理系统。
2.信息管理系统信息列表
ID |
名称 |
ICON名称 |
类型 |
回血值 |
蓝血值 |
出售价 |
购买价 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
类型:药品(Drug)装备(Equip)材料Mat
3.创建.txt文档,ObjectsInfoList物品信息清单
每行一条物品信息,物品的属性之间用逗号隔开
药品ID以100开头,装备是200开头,材料用300开头
课时40:创建物品信息的管理类(读取.txt文件,获得物品信息)
1.创建类ObjectInfo,管理所有的物品
创建一个空物体叫做GameSetting,上面挂一个脚本ObjectsInfo
(1)单例模式
每个游戏场景中都会有许多的游戏对象,而各个游戏场景之间也是同等的关系。如何去管理它们,是我们要解决的问题。
场景中各脚本间的直接访问,会在各脚本间形成一个巨大而又混乱的网络,这给以后代码的维护带来了极大的困难。为了避免这种因交互访问而带来的过度耦合情况,我们取消掉场景中各脚本间的直接交互,取而代之的是,让所有脚本都只与场景中的一个特定脚本交互。
在刚开始使用这种方法时,声明了一个场景中的全局脚本,然后把场景中所有其他需要交互的脚本声明为其成员,一旦脚本间要发生交互,就在脚本中声明一个全局脚本的对象,然后通过这个对象去访问其他的脚本,从而把直接交互变成了间接交互。这样做确实解决了脚本之间直接访问带来的高耦合度问题,但是在每个脚本中都要保存一个全局脚本的对象,这显然有些不太合适,浪费了资源。为了进一步解决这个问题,引入了单例模式的应用。
单例模式的定义是:保证一个类只有一个实例,并且提供一个访问它的全局访问点。单例对象的类必须保证只有一个实例存在。在我们的场景中,全局脚本的对象只会创建一次,保证单例,然后它(全局单例类)提供给各个脚本访问单例对象的方法,并且所有其他脚本的公共数据都会存储在全局单例脚本中
在整个游戏生命周期当中,有很多对象从始至终有且只有一个。这个唯一的实例只需要生成一次,并且直到游戏结束才需要销毁。 单例模式一般应用于管理器类,或者是一些需要持久化存在的对象。
●声明全局单例类自身类型的静态私有成员变量,作为单例对象使用。
Private static GloSingleton _globalSingleton;
●创建访问方法
Public static GloSingletonGetSingleton() { …}
If (null==_globalSingleton) {
lock(_globalSingleton) {
if(null== _globalSingleton) {
_globalSingleton=(GloSingleton)GameObject.FindObjectOfType(typeof(GloSingleton));
}
}
}
(2)ObjectsInfo类代码:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;//包含字典类 字典存储的是键值对
///
/// 解析物品信息
///
public class ObjectsInfo : MonoBehaviour {
public static ObjectsInfo _instance;
void Awake() {
_instance = this;
}
//枚举类型记录物品的类型
public enum ObjectType {
Drug,//药品
Equip,//装备
Mat//材料
}
///
/// 类ObjectInfo:一条物品信息
///
public class ObjectInfo {
public int id;//物品ID
public string name;//名称
public string icon_name;//这个名称是存储在图集中的名称
public ObjectType type;//类型
public int hp;//血量
public int mp;//魔法
public int price_sell;//售价
public int price_buy;//购买价
}