3D游戏导论七 · 模型与动画
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游戏导论七 · 模型与动画相关推荐
- 麒麟子Cocos Creator 3D研究笔记五:模型骨骼动画查看器
负一.先说两句 本文索引是负一开头,那是因为这一小节是最后加上来的.为了不牵一发动全身,就这样最好了. 写文章每次要自称的时候,麒麟子三个字打着太费劲,以后文章中,我就叫自己阿子吧. 大家从今天 ...
- 3D游戏引擎入门课程——角色动画
目录 写在前面 角色动画 角色动画概述和表示方法 角色的表示 骨骼蒙皮动画中重要的概念 角色动画实现实例 OGEE角色动画 Panda3D角色动画 写在前面 本专栏内容均为学堂在线慕课<3D游戏 ...
- 【3D游戏基础】蒙皮骨骼动画与骨架
效果 目标!画出蒙皮动画的骨架. 视频 https://www.bilibili.com/video/BV1pM411m7Yw PPT https://zfxdvouj61.feishu.cn/fil ...
- 3D游戏模型提取、导入、导出教程
本教程转自 http://geek.prdsarea.com/forum.php?mod=viewthread&tid=891&fromuid=282846 (出处: http://g ...
- 3D游戏建模是吃青春饭的吗? 3d建模薪资多少
一 本文总序 关于3D建模,尤其是3D游戏建模这一块,我将会系统的从以下九个方面谈一下. 包括:谈实力,谈学习,谈时间,谈青春,谈难易,谈职位,谈工资,谈行业,谈选择.希望能够解决大家思想上困扰,对未 ...
- 3D游戏建模真的很累吗?前景怎么样?需要什么基础?
所有行业都是一样的,没有什么容易的,只不过这一行是偏向于技术的,一个有好的建模师月薪10k+是很常见的,这个需要有自己刻苦学习的成果. 游戏建模前景 在游戏模型行业,你基本不用担心找不到工作,因为游戏 ...
- 3D游戏建模真的很累吗?前景怎么样?又需要哪样的基础
所有行业都是一样的,没有什么容易的,只不过这一行是偏向于技术的,一个有好的建模师月薪10k+是很常见的,这个需要有自己刻苦学习的成果. 游戏建模前景 在游戏模型行业,你基本不用担心找不到工作,因为游戏 ...
- 2D游戏比3D游戏哪个更好做?游戏行业什么职业最吃香?
通常情况下,同样档次2D游戏,开发成本和难度低于3D游戏. 对比两组共六个游戏,分别说明目前业界在2D游戏和3D游戏不同做法. 2D游戏(征途) 2D游戏(龙之皇冠) 2D游戏(奥利和迷雾森林) 3D ...
- 3D游戏编程学习笔记(七):模型与动画
一.前言 本次3D游戏编程我们将设计一个智能巡逻兵游戏. 二.游戏基本内容及规定 游戏内容部分 创建一个地图和若干巡逻兵(使用动画): 每个巡逻兵走一个3~5个边的凸多边型,位置数据是相对地址.即每次 ...
最新文章
- pl/sql块的基本语法
- 的注册表怎么才能删干净_白蚁怎么才能消灭干净?
- javafx sdk html 布局,JavaFX2开发教程
- RTSP播放器网页web无插件直播流媒体音视频播放器EasyPlayer-RTSP实现支持H265编码格式过程介绍
- C#数据结构-单链表
- 对Repository模式误用的反思和纠正
- 获取微信小程序源代码教程
- Java商店管理系统
- 金蝶精斗云PDA移动扫码入库出库,搭配蓝牙打印机打印单据小票
- 八皇后问题(回溯算法)
- efs android 分区 img,选择别人efs文件包都是.img格式的,怎么添加你们的.efs文? 爱问知识人...
- 【教程】win10 固态硬盘卡机卡死卡顿的真正原因!
- actions vuex 请求_vue中vuex的actions里面请求接口,提交给mutations报错
- Step1我学习ros2的一些经历(从ubuntu安装到ros2中的位姿转换)
- day29 | 216.组合总和III 17.电话号码的字母组合
- node.js基于微信小程序的校园失物招领毕业设计源码072343
- 《算法竞赛进阶指南》tarjan做法 银河
- okcoin 爱沙尼亚_我如何成为爱沙尼亚的电子居民
- linux 服务进程管理,进程管理和系统服务-Linux学习笔记
- 成信大807常用函数复习
热门文章
- 服务器启动显示按f1f2f10,电脑开机提示按f1f2f5 电脑开机要按F1F2F5
- stroage——SAN存储与WINDOWS主机连接
- 为什么总是闹离职的员工没走,平时不吭声的员工却突然离职?
- wow转服务器微信支付,魔兽打团本成就,打到一半,发微信支付宝要钱,真国服之耻!...
- linux快捷键锁定屏幕,天天Linux-Ctrl+S快捷键锁定屏幕的问题
- Jzoj5542 董先生的钦点
- java 必须try catch的异常_【java基础之异常】死了都要try,不淋漓尽致地catch我不痛快!...
- 孔浩java爱酷网_孔浩老师JAVA WebService教程
- Linux之父、大数据之父确认参加2021世界人工智能大会
- 为什么NR PDCP SDU最大为9000?