3D游戏导论七 · 模型与动画


本次的作业我们需要制作一个简易的巡逻兵项目。

文章目录

  • 3D游戏导论七 · 模型与动画
    • 一、作业要求
    • 二、具体实现
      • 1.概念解释
      • 2.项目详解
    • 三、最终结果

一、作业要求

  • 游戏设计要求:

    • 创建一个地图和若干巡逻兵(使用动画);
    • 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址。即每次确定下一个目标位置,用自己当前位置为原点计算;
    • 巡逻兵碰撞到障碍物,则会自动选下一个点为目标;
    • 巡逻兵在设定范围内感知到玩家,会自动追击玩家;
    • 失去玩家目标后,继续巡逻;
    • 计分:玩家每次甩掉一个巡逻兵计一分,与巡逻兵碰撞游戏结束;
  • 程序设计要求:
    • 必须使用订阅与发布模式传消息

      • subject:OnLostGoal
      • Publisher: ?
      • Subscriber: ?
    • 工厂模式生产巡逻兵

二、具体实现

和上次的打飞碟游戏一样,我们本次采用工厂模式来生产巡逻兵,然后用订阅与发布模式来传递消息。

1.概念解释

订阅与发布模式:

在订阅与发布模式中,称为发布者的消息发送者(Publisher)不会将消息直接发送给订阅者(Subscriber),这意味着发布者和订阅者不知道彼此的存在。在发布者和订阅者之间存在一个第三个组件,我们通常将其称为消息代理或调度中心或中间件,它维持着发布者和订阅者之间的联系,过滤所有发布者传入的消息并相应地分发它们给订阅者。

2.项目详解

我们最后的具体实现由九个C#程序组成。下面我们对各个程序的功能及部分代码做简要分析。

  • Action.cs:这个程序主要是用来提供动作接口。程序很简单,只有几行。

    public interface Action
    {void move(float x, float z); //玩家的移动void gameOver(); //游戏结束void changeScore(); //改变分数
    }
    
  • Director.cs:导演类,按照之前作业的惯例,我们采用单例模式来实现。

    public SceneController currentSceneController { get; set; }
    public static Director getInstance()
    {if (_instance == null){_instance = new Director();}return _instance;
    }
    
  • FirstSceneController.cs: 场景控制器,主要作用是继承接口,实现相应的函数。我们在上面介绍过的订阅与发布模式 主要是在这个部分实现。在这里面,PatrolmanController是发布者,而FirstSceneController是订阅者。

    void Enable()//订阅patrolmanController的事件
    {PatrolmanController.hit += gameOver;PatrolmanController.scoreRecord += changeScore;
    }
    void Disable()//取消patrolmanController事件的订阅
    {PatrolmanController.hit -= gameOver;PatrolmanController.scoreRecord -= changeScore;;
    }
    

    还有就是对Action.cs 里面的动作接口进行继承实现,具体的代码我们就不放了,有兴趣的可以直接去看源代码。

    public void move(float x, float z)
    {…………
    }
    public void gameOver()
    {…………
    }
    public void changeScore()
    {score.record();
    }
    
  • PatrolFactory.cs :工厂模式的实现,主要是用来批量生产巡逻兵的。因为不像上次打飞碟游戏一样还需要回收,这次只需要生产即可,相对来说比较容易。

    有一点需要注意的是,巡逻兵和小女孩相撞后,我们需要对刚体进行移除,避免两者之间继续进行碰撞。

    public void removeRigid()
    {for(int i = 0;i < list.Count; i++){list[i].GetComponent<Animator>().SetBool("run", false);list[i].GetComponent<Animator>().SetBool("idle", true);Destroy(list[i].GetComponent<Rigidbody>());}
    }
    
  • PatrolmanController.cs:这个程序主要是对巡逻兵的相关功能进行实现,这也是整个项目里面最复杂的部分。涉及到碰撞、触发器、超出边界等等问题的设计。

    • 实现碰撞:

      • 我们首先,给巡逻兵,墙体和玩家添加刚体,并且不要勾选gravity,给墙体选中 is Kinematic 属性,使其不会移动。这是碰撞产生的先决条件。
      • 其次,给巡逻兵,墙体和玩家添加碰撞器,设置好大小,尤其是玩家和巡逻兵,使用 Capsule Collider 直径以刚好包住对象为宜。
      • 最后,给巡逻兵添加触发器,即添加 Box Collider,半径可设置稍微大一点,选中 isTrigger ,这样就可以啦。
    • 题目中还要求,“巡逻兵在设定范围内感知到玩家,会自动追击玩家;”,因此我们需要制作一个触发器,当两者接近时,会触发加速的条件(即speed * 2)。离开这个范围则会恢复到以前的状态。

      void OnTriggerEnter(Collider other)//进入触发器范围
      {if(other.transform.tag == "player" && !dir.getState() && canFollow){target = other.transform.position;this.transform.LookAt(other.transform.position);speed *= 2;}
      }
      void OnTriggerExit(Collider other)//退出触发器范围
      {if (other.transform.tag == "player" && !dir.getState() && canFollow){if (scoreRecord != null){scoreRecord();}setNewPath();speed /= 2;}
      }
      
  • ScoreRecorder.cs:记分员咯,和上面的导演类一样,同样采用的是单例模式。

  • singleton.cs :这个就不用了多说啦。

  • UI.cs :前端的实现,我们在整个界面设置了规则介绍区计分区等等……

    //粗糙的规则介绍:
    GUIStyle style_dom = new GUIStyle();
    style_dom.fontSize = 20;
    GUI.Label(new Rect(20, 10, 200, 30), "玩家须知:", style_dom);GUIStyle style_word = new GUIStyle();
    style_word.fontSize = 15;
    GUI.Label(new Rect(20, 40, 200, 30), "小女孩正在躲避巡逻兵,你需要帮助她避开士兵!", style_word);
    GUI.Label(new Rect(20, 60, 150, 30), "W键:向前", style_word);
    GUI.Label(new Rect(20, 80, 150, 30), "S键 :向后", style_word);
    GUI.Label(new Rect(20, 100, 150, 30), "A键 :向左", style_word);
    GUI.Label(new Rect(20, 120, 150, 30), "D键 :向右", style_word);
    GUI.Label(new Rect(20, 140, 300, 30), "每当你逃脱一次追杀,我们会为你加分作为鼓励", style_word);
    
    //重置按钮
    if (GUI.Button(new Rect(700, 500, 100, 50), "重新开始"))
    {flag = 1;director.reset();s.reset();SceneManager.LoadScene("Scene");
    }
    

三、最终结果

因为用了师兄给的素材和Assets Store中的素材,我们的最后结果还是比较好看的,如下图:

参考了大量师兄的代码,写的真的很好,在此表示真挚的感谢。具体的项目放在github 了,想了解详细代码的可以去项目仓库看看。

戳这里

3D游戏导论七 · 模型与动画相关推荐

  1. 麒麟子Cocos Creator 3D研究笔记五:模型骨骼动画查看器

    负一.​先说两句 本文索引是负一开头,那是因为这一小节是​最后加上来的.为了不牵一发动全身,就这样最好了. 写文章每次要自称的时候,麒麟子三个字打着太费劲,以后文章中,我就叫自己阿子吧​. 大家从今天 ...

  2. 3D游戏引擎入门课程——角色动画

    目录 写在前面 角色动画 角色动画概述和表示方法 角色的表示 骨骼蒙皮动画中重要的概念 角色动画实现实例 OGEE角色动画 Panda3D角色动画 写在前面 本专栏内容均为学堂在线慕课<3D游戏 ...

  3. 【3D游戏基础】蒙皮骨骼动画与骨架

    效果 目标!画出蒙皮动画的骨架. 视频 https://www.bilibili.com/video/BV1pM411m7Yw PPT https://zfxdvouj61.feishu.cn/fil ...

  4. 3D游戏模型提取、导入、导出教程

    本教程转自 http://geek.prdsarea.com/forum.php?mod=viewthread&tid=891&fromuid=282846 (出处: http://g ...

  5. 3D游戏建模是吃青春饭的吗? 3d建模薪资多少

    一 本文总序 关于3D建模,尤其是3D游戏建模这一块,我将会系统的从以下九个方面谈一下. 包括:谈实力,谈学习,谈时间,谈青春,谈难易,谈职位,谈工资,谈行业,谈选择.希望能够解决大家思想上困扰,对未 ...

  6. 3D游戏建模真的很累吗?前景怎么样?需要什么基础?

    所有行业都是一样的,没有什么容易的,只不过这一行是偏向于技术的,一个有好的建模师月薪10k+是很常见的,这个需要有自己刻苦学习的成果. 游戏建模前景 在游戏模型行业,你基本不用担心找不到工作,因为游戏 ...

  7. 3D游戏建模真的很累吗?前景怎么样?又需要哪样的基础

    所有行业都是一样的,没有什么容易的,只不过这一行是偏向于技术的,一个有好的建模师月薪10k+是很常见的,这个需要有自己刻苦学习的成果. 游戏建模前景 在游戏模型行业,你基本不用担心找不到工作,因为游戏 ...

  8. 2D游戏比3D游戏哪个更好做?游戏行业什么职业最吃香?

    通常情况下,同样档次2D游戏,开发成本和难度低于3D游戏. 对比两组共六个游戏,分别说明目前业界在2D游戏和3D游戏不同做法. 2D游戏(征途) 2D游戏(龙之皇冠) 2D游戏(奥利和迷雾森林) 3D ...

  9. 3D游戏编程学习笔记(七):模型与动画

    一.前言 本次3D游戏编程我们将设计一个智能巡逻兵游戏. 二.游戏基本内容及规定 游戏内容部分 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次 ...

最新文章

  1. pl/sql块的基本语法
  2. 的注册表怎么才能删干净_白蚁怎么才能消灭干净?
  3. javafx sdk html 布局,JavaFX2开发教程
  4. RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP实现支持H265编码格式过程介绍
  5. C#数据结构-单链表
  6. 对Repository模式误用的反思和纠正
  7. 获取微信小程序源代码教程
  8. Java商店管理系统
  9. 金蝶精斗云PDA移动扫码入库出库,搭配蓝牙打印机打印单据小票
  10. 八皇后问题(回溯算法)
  11. efs android 分区 img,选择别人efs文件包都是.img格式的,怎么添加你们的.efs文? 爱问知识人...
  12. 【教程】win10 固态硬盘卡机卡死卡顿的真正原因!
  13. actions vuex 请求_vue中vuex的actions里面请求接口,提交给mutations报错
  14. Step1我学习ros2的一些经历(从ubuntu安装到ros2中的位姿转换)
  15. day29 | 216.组合总和III 17.电话号码的字母组合
  16. node.js基于微信小程序的校园失物招领毕业设计源码072343
  17. 《算法竞赛进阶指南》tarjan做法 银河
  18. okcoin 爱沙尼亚_我如何成为爱沙尼亚的电子居民
  19. linux 服务进程管理,进程管理和系统服务-Linux学习笔记
  20. 成信大807常用函数复习

热门文章

  1. 服务器启动显示按f1f2f10,电脑开机提示按f1f2f5 电脑开机要按F1F2F5
  2. stroage——SAN存储与WINDOWS主机连接
  3. 为什么总是闹离职的员工没走,平时不吭声的员工却突然离职?
  4. wow转服务器微信支付,魔兽打团本成就,打到一半,发微信支付宝要钱,真国服之耻!...
  5. linux快捷键锁定屏幕,天天Linux-Ctrl+S快捷键锁定屏幕的问题
  6. Jzoj5542 董先生的钦点
  7. java 必须try catch的异常_【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!...
  8. 孔浩java爱酷网_孔浩老师JAVA WebService教程
  9. Linux之父、大数据之父确认参加2021世界人工智能大会
  10. 为什么NR PDCP SDU最大为9000?