游戏对象与图形基础-作业与练习(4)

游戏对象与图形基础-作业与练习(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脚本挂载上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值