目录
一、基本操作演练【建议做】
1、下载Fantasy Skybox FREE,构建自己的游戏场景。
1.1 导入Fantasy Skybox FREE资源
在Windows->Asset Store中找到对应的Fantasy Skybox FREE资源,然后下载资源并点击Import导入即可。
导入后,我们可以在Project中的Assets目录下找到对应的文件夹,里面包含此天空盒所对应的材料和场景。
1.2 创建一块用于制作场景的地
选择菜单栏中的GameObject->3D Object->Terrain,建立一块地,然后可以用unity提供的地形设计工具来改变这块地的地形和贴图。
最上面一行是unity提供的简单工具,从左到右依次是:创建相邻地块、绘制地形、种树、种草和设置。
而在绘制地形中又有多种选项,分别是:
升高或降低地形、绘制洞、绘制纹理、设置高度、平滑高度、绘制有特定地质特征的纹理。
这里我没有使用自己绘制的地形(太丑了),将地形绘制工具的各种画笔功能尝试了几遍后,便用天空盒中附带的地形(种了一些树和花草完善原来的地形)来接着后面的操作了。
1.3 创建一个天空盒
选择菜单栏中的Assets->Create->Material,创建一个新的材料,命名为skybox。
然后选择Shader,在下拉栏中找到Skybox选项,将着色器改为天空盒模式,在Skybox中有四种模式,分别是:六面体天空盒、立体天空盒、全景天空盒、纯手写天空盒
这里我们用Cubemap,创建好天空盒材料后,将选定好的图片加进去,便成了我们所要的天空盒了。
1.4 将天空盒加入摄像机组件中
选择摄像机,在右边的Inspector中选择Add Component添加组件,在下拉栏中找到Rendering,里面便有我们需要的skybox组件,添加后,将我们所建立的天空盒加到Custom Skybox中,这样子天空盒便加入到摄像机组件中了。
1.5 运行截图
2、总结
在unity中,有很多种游戏对象,包括空对象、3D游戏对象、2D游戏对象、事件、灯光、声音、视频、UI界面、摄像机等。其中我们最常用的就是3D游戏对象、灯光、声音、UI界面和摄像机。
游戏对象是游戏中人物、道具、场景等对象的总称,它们有基础的属性,但没有具体的独特的功能,用于容纳不同的组件。只有挂载了组件后,一个游戏对象才有了属于它的功能。
二、编程实践
1、目标
- 完成牧师与魔鬼动作分离版。
- 【2019新要求】设计一个裁判类,当游戏达到结束条件时,通知场景控制器结束游戏
2、回顾
在上一节课中,我们也是完成的牧师与魔鬼游戏,当时是利用基础的MVC架构,来设计牧师与魔鬼。下面回顾一下MVC架构:
Model
模型,负责建立起各个游戏对象和它们的基本行为,在牧师与魔鬼中的模型有牧师、魔鬼、船、河以及2个河岸。其中船和河岸被设计为容器,可以承载牧师和魔鬼这两个角色并记录它们的位置;牧师和魔鬼则是作为游戏的主要角色,可以在船和河岸之间来回移动。
View
视图,与用户交互的接口,是我们用户最终可以看到的界面。它能够接收用户的输入信息(比如点击或者键盘按键输入),并根据所点击的游戏对象不同而传递不同的信息,并把一些重要信息反馈给用户。
Controller
控制器,用于将模型和视图连接起来,以达到全局控制的目的。控制器不仅要从模型那里获取相应的信息,根据这些信息判断模型的位置和状态,而且还需要从视图处获得用户的输入信息,进行相应的物体操作。最后控制器还需要判断游戏的进行程度,判断游戏的进度和输赢状态,并将输赢信息返回到视图上,反馈给用户。
3、动作分离思路
从回顾中可以看出,控制器Controller所承担的工作太多了,在设计起来显得很复杂,很容易出现错误。所以动作分离的要求便应运而生。
动作分离,顾名思义,就是将动作从控制器中分离出来,这里需要分离出来的有船的移动和角色(牧师和魔鬼)的移动。
4、动作分离实现
这里的实现很大程度上参照了老师所给的课程文档中的4.2 核心代码与设计解读。
- 首先,我们要定义一个动作的基类,用于存储动作的基本运动:平移、旋转和缩放。
在这个基类中,我们可以没有区分是具体的哪一个动作,也就是说,如果我们直接调用基类,并不会有任何操作,所以这里实现了虚函数,以便后面子类进行重写。
public class SSAction : ScriptableObject {
public bool enable = true;
public bool destroy = false;
public GameObject gameObject {
get; set; }
public Transform transform {
get; set; }
public ISSActionCallback callBack {
get; set; }
public virtual void Start () {
throw new System.NotImplementedException ();
}
public virtual void Update () {
throw new System.NotImplementedException ();
}
}
- 接着,我们在动作基类的基础上,实现这一次作业所需要的具体动作。
而在牧师与魔鬼游戏中,船只跟角色都只需要平移即可,不用旋转和缩放,所以我们的具体动作只需要实现平移操作,让物体从一个位置以一定的速度平移到目标位置。
public class SSMoveToAction : SSAction {
public Vector3 target;
public float speed;
private SSMoveToAction () {
}
public static SSMoveToAction GetSSAction (Vector3 target, float speed) {
SSMoveToAction action = ScriptableObject.CreateInstance<SSMoveToAction> ();
action.target = target;
action.speed = speed;
return action;
}
public override void Start ()