游戏对象与图形基础-作业与练习(4)
这里写目录标题
1、基本操作演练【建议做】
下载 Fantasy Skybox FREE, 构建自己的游戏场景
下载好Fantasy Skybox FREE之后,在Package Manager中下载并导入Asset中。
然后create一个Material,设置Shader为Skybox/Panoramic,示意为天空盒。在spherical(HDR)选项处选择刚才下载的一张图片,完成后将其拖入场景中即可看见效果。
之后是创建地形,GameObject->3D Object->Terrain,通过Terrain中的工具来美化地形。
让人想去学美术了
写一个简单的总结,总结游戏对象的使用
游戏对象 (GameObject) 自身不会向游戏添加任何特性。而是容纳实现实际功能的组件 (Component) 的容器。一个对象挂载了组件,便拥有了组件的相关属性。
另外,游戏对象还拥有它独特的功能。
- Camera:
作为游戏的眼睛,玩家通过Camera来观察游戏世界。 - Light:
光源,可以用来照明也可用于添加阴影 - Empty空对象
多被用于当做载体,例如挂载游戏脚本、成为其他对象的
父对象等。 - Cube等3D Object:
搭建游戏世界的组成元素,通过设置其Transform等* 属性来变换
它们的位置、形态等。 - Terrain等:
即是组成元素,又是编辑工具,例如Terrain本身是地图,然
后又附带了绘制地图的各项工具(造山、造草等)
2、编程实践(二选一)
牧师与魔鬼 动作分离版
设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束。
设计思路如下:
- 通过门面模式(控制器模式)输出组合好的几个动作,共原来程序调用。
- 好处,动作如何组合变成动作模块内部的事务
- 这个门面就是 CCActionManager
- 通过组合模式实现动作组合,按组合模式设计方法
- 必须有一个抽象事物表示该类事物的共性,例如 SSAction,表示动作, 不管是基本动作或是组合后动作
- 基本动作,用户设计的基本动作类。 例如:CCMoveToAction
- 组合动作,由(基本或组合)动作组合的类。例如:CCSequenceAction
- 接口回调(函数回调)实现管理者与被管理者解耦
- 如组合对象实现一个事件抽象接口(ISSCallback),作为监听器(listener)监听子动作的事件
- 被组合对象使用监听器传递消息给管理者。至于管理者如何处理就是实现这个监听器的人说了算了
- 例如:每个学生做完作业通过邮箱发消息给学委,学委是谁,如何处理,学生就不用操心了
- 通过模板方法,让使用者减少对动作管理过程细节的要求
- SSActionManager 作为 CCActionManager 基类
最终,程序员可以方便的定义动作并实现动作的自由组合,做到:
- 程序更能适应需求变化
- 对象更容易被 复用
- 程序更易于维护
以上是课件的设计要求 。
与上次作业Priests and Deivls相比,主要新增SSActionManager、SSAction、CCMoveToAction、ISSActionCallback、CCActionManager。
其中SSActionManager、SSAction、CCMoveToAction、ISSActionCallback都是很容易实现(copy课件代码 )
课件上给出的CCActionManager不太适用,需做一些更改。CCActionManager其实就像上次Move和MoveController的交集,主要的功能还是给FirstController提供一个移动游戏对象的函数接口。
CCActionManager:
public class CCActionManager : SSActionManager, ISSActionCallback
{
private bool isMoving=false;
public CCMoveToAction moveObjAction;
public FirstController controller;
protected new void Start()
{
controller=SSDirector.getInstance().currentSceneController as FirstController;
}
public bool IsMoving(){
return isMoving;
}
public void MoveObj(GameObject obj,Vector3 target,float speed){
if(isMoving) return;
isMoving=true;
moveObjAction=CCMoveToAction.GetSSAction(target,speed);
this.RunAction(obj,moveObjAction,this);
}
public void SSActionEvent(SSAction source,
SSActionEventType events=SSActionEventType.Competed,
int intParam=0,
string strParam=null,
Object objectParam=null){
isMoving=false;
}
}
其次是要求的裁判类Judgement。
public class Judgement : MonoBehaviour
{
private FirstController controller;
private LandModelController landRoleController;
// Start is called before the first frame update
void Start()
{
controller=SSDirector.getInstance().currentSceneController as FirstController;
landRoleController=controller.GetLandModelController();
}
// Update is called once per frame
void Update()
{
if(!controller.GetIsRuning()) return;
this.gameObject.GetComponent<UserGUI>().gameMessage="";
if(landRoleController.GetLandModel().rightPriestNum==3&&landRoleController.GetLandModel().rightDevilNum==3){
controller.JudgeCallback(false,"You Win!!");
}
else if((landRoleController.GetLandModel().leftPriestNum!=0
&&landRoleController.GetLandModel().leftPriestNum<landRoleController.GetLandModel().leftDevilNum)
||(landRoleController.GetLandModel().rightPriestNum!=0
&&landRoleController.GetLandModel().rightPriestNum<landRoleController.GetLandModel().rightDevilNum)){
controller.JudgeCallback(false,"Game Over!!");
}
}
}
其中通过LandModelController来获取河两岸牧师魔鬼的个数信息。
由于修改了check()相关的部分,还要将FirstController的Awake()函数里将Judgement脚本挂载上。