上次的打飞碟游戏是利用Transform来实现飞碟的位移,以此模仿物体运动的轨迹。事实上,如果游戏对象是一个刚体,就可以按照现实世界中物体运动那样,给它一个力,然后让它“自由发挥”,不需要我们在脚本里Update每一帧手动写对象的位置。

关于刚体的学习

游戏对象添加Rigidbody组件后即具备物理属性,也就是说“成为了”刚体。

刚体变量

类型 变量 备注
Vector3 velocity 速度向量
Vector3 angularVelocity 角速度向量
float drag 阻力
float angularDrag 角阻力
float mass 物体的质量
bool useGravity 是否受重力影响
bool isKnematic 是否开启空气动力学

向刚体施加力

给具有刚体的gameobject施加力,常用的方法是void Rigidbody.AddForce();
具体有四个重载:

  • void Rigidbody.AddForce(vector3 Force);
  • void Rigidbody.AddForce(Vector3 Force,ForceMode mode);
  • void Rigidbody.AddForce(float x,float y,float z);
  • void Rigidbody.AddForce(float x,float y,float z,ForceMode mode)

其中,ForceMode有四种形式

  • ForceMode.Force:给物体添加一个持续的力并使用其质量
  • ForceMode.Acceleration:给物体添加一个持续的加速度,但是忽略其质量(采用默认质量1,忽略设置的质量)
  • ForceMode.Impulse:给物体添加一个瞬间的力并使用其质量
  • ForceMode.VelocityChange:给物体添加一个瞬间的加速度,但是忽略其质量

还可以在物体表面施加力:利用AddForceAtPosition(force:Vector3, position:Vector3, FoceMode)在position位置应用force力。
作为结果这个将在这个物体上应用一个力矩和力。为了效果的真实性,position的位置应在刚体的表面。

刚体的移动

除了可以用AddForce,添加一个力到刚体,作为结果刚体将开始移动之外,还可以

  • function AddRelativeForce:添加一个力到刚体,相对于本地坐标
  • MovePosition: 移动刚体到position

刚体的旋转

  • AddTorque (Vector3, ForceMode):添加一个转矩到刚体。作为结果刚体将绕着torque轴旋转,torque的长度决定转速。
  • AddTorque (float x, float y, float z, ForceMode) : 添加一个转矩到刚体。作为结果刚体将绕着torque轴旋转,torque的长度决定转速。
  • AddRelativeTorque (Vector3, ForceMode): 添加一个转矩到刚体,相对于本地坐标。
  • AddRelativeTorque (float x, float y, float z, ForceMode) : 添加一个转矩到刚体,相对于本地坐标。
  • MoveRotation (rot : Quaternion):旋转刚体到rot

游戏实现部分

游戏规则

点击start开始游戏,每一轮出现的飞碟颜色、位置随机,飞行速度随着关卡增加而增加。当分数大于轮数x50时(如第一关需要大于50分),可以点击start进入下一关,否则提示GameOver,只能按restart开始。在每一轮结束的时候,如果符合进入下一关的条件,可以选择start进入下一关,也可以点击restart从第一关开始。

飞碟的运动

直接修改了DiskData部分的代码,颜色材质这些保留上周的内容不变,把Update里根据startPoint和endPoint移动position部分修改成施加力让飞碟运动。

    void Start(){//获取自身 Transform组件和Rigidbody组件的引用mmTransform = gameObject.GetComponent<Transform>();mmRigidbody = gameObject.GetComponent<Rigidbody>();//    Debug.Log(mmRigidbody);//mmRigidbody.position = new Vector3(5, 5, 5);mmRigidbody.velocity = new Vector3(0, 0, 5);}//给一个向远处飞行的初速度
x = rules * 3;
y = rules *3;
z =  rules * 3;
mmRigidbody.AddForce(new Vector3(x, y, z));
void FixedUpdate(){if (isEnabled){mmRigidbody.AddForce(new Vector3(x, y, z));}}

判断飞碟“落地”

在上一次作业中,规定了随机的startPoint和endPoint,判断一个飞碟是否可用(也就是是否“落地”)是通过判断这两个Vector3是否相等,但是这里我们不能规定endPoint,所以需要利用其他的方法。
1.规定一个范围,大概估计Camera的视线范围,然后判断position.x、position.y、position.z是否超出这个范围,超出就通知Factory进行回收。

2.依然是利用Camera视角,但是参考unity3d 如何判断一点是不是在一个相机的视锥内 做了一些改动,这样就比较科学。

static public bool IsAPointInACamera(Camera cam, Vector3 wordPos)
{// 是否在视野内bool result1 = false;Vector3 posViewport = cam.WorldToViewportPoint(wordPos);Debug.Log("posViewport:" + posViewport.ToString());Rect rect = new Rect(0, 0, 1, 1);result1 = rect.Contains(posViewport);Debug.Log("result1:" + result1.ToString());// 是否在远近平面内bool result2 = false;if(posViewport.z >= cam.nearClipPlane && posViewport.z<=cam.farClipPlane){result2 = true;}Debug.Log("result2:" + result2.ToString());// 综合判断bool result = result1 && result2;Debug.Log("result:" + result.ToString());return result;
}

3.设置一个plane,是否碰撞plane作为判断“落地”的标准。
这个也比较简单,在场景中Create一个plane,设置位置,然后打开box collision,写一个onCollisionEnter就好了。

三种方法都试了一次,最后用的是第二种。

补一个天空盒制作

收集前后左右上下六张图,在Resources文件夹Create一个Material,在Inspector窗口

只会贴六张图的所以选6 Sided,分别拖六张图进去


(感谢大佬在群里分享的skybox素材)
一个游戏效果图:


遇到的bug和难点:
1.实在没办法在短时间内搞清楚导演场记动作管理的模式,模仿Priest and Devil强行拆代码遇到了很多问题(牧师与魔鬼的实现是看别人的博客,知道哪个函数放哪里怎么通信,这次作业自己按框架写的时候就不知道怎么划分了),修修补补能够勉强跑没有Physics的部分,加上了切换就不知道怎么办了。所以本周作业其实并不算完成…..在没有真正理解之前我只好上交自己弄懂的部分,以后搞清楚了应该会再写一次。

2.关于useGravity和AddForce在y轴正方向增加力,实验发现只要勾选使用重力,飞碟就会永远往下,无论自己加的力有多大。思考了一下应该是因为我是在FixedUpdate里使用AddForce,每一次刷新才施加一次力,但是重力是一直存在的,所以总体呈现就是下降的轨迹。可以考虑利用Drag,但是这样调起来比较不方便,所以我把使用重力给去掉了。

3.关于Update和FixedUpdate,只记住要在刚体对象的Update处用FixedUpdate,没有同步更新Factory处的代码,就出现了一些微妙的延迟情况。这个具体的机制并没有很清楚,尝试用Debug输出结果,但是每次测试也并不相同,因此没有得出一个确切的结论。关于FixedUpdate,可以看看FixedUpdate真的是固定的时间间隔执行吗?聊聊游戏定时器

4.因为要求飞碟出现位置、飞行方向随机,而Camera视角有限,因此一开始直接Random就出现了有几个飞碟还没看见就消失的情况:微调了一下上一次的Random范围,顺利解决。遇到比较难处理的部分就是判断飞碟是否“落地”,出现明明还在范围内但是点击却无效的情况,前面已经给出具体解决方式,不再赘述。

Unity3D——打飞碟游戏(2)相关推荐

  1. Unity3d——打飞碟游戏(终极版)

    前段时间比较忙,囫囵吞枣学了个大概,作业写的也很烂,趁最近有空整理一下,认真写一次打飞碟游戏(主要是总结一下导演场记动作管理这些面向对象设计) 放个UML图 1.SSDirection,导演对象负责 ...

  2. unity3d开发鼠标打飞碟游戏(Hit UFO)

    这次我们用Unity3d开发一个简单的打飞碟游戏 游戏简介 游戏有3个回合,每个回合会发射n中颜色的飞碟,击中飞碟会得到相应的分数,其中,击中黄色飞碟得1分,击中蓝色飞碟得2分,红色飞碟4分,击不中不 ...

  3. 【Unity3d学习】使用物理引擎——打飞碟游戏的物理引擎改进与射箭游戏设计

    文章目录 写在前面 HitUFO的物理引擎改进版本 物理引擎的改进版本思路与实现 PhysicsAction PhysicsManager 新接口类IActionManager 动作管理器基类的变化 ...

  4. Unity3D学习:飞碟游戏进化版

    上一个做的飞碟游戏虽然是功能也齐全,但是我感觉架构不是很好有点紊乱,不利于后期维护以及改进,所以我按照一个完整的架构重新做了一次,思路更清晰,而且还添加了更多的功能.这次的飞碟游戏是两个关卡,50分上 ...

  5. Unity3D 飞碟游戏改进版

    飞碟游戏改进 这次作业在上一次打飞碟游戏的基础上增加了adapter设计模式,用来统一物理运动和运动学动作管理器的接口,使得游戏可以动态改变飞碟的行为,同时支持物理运动和运动学变换,具有更高的可扩展性 ...

  6. unity3D游戏-打飞碟游戏改进版

    打飞碟(Hit UFO)游戏改进版 内容要求 按 adapter模式 设计图修改飞碟游戏 使它同时支持物理运动与运动学(变换)运动 适配器模式 适配器模式将某个类的接口转换成另一个接口表示,目的是兼容 ...

  7. 一、创建Assetbundle 在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新。

    一.创建Assetbundle 在unity3d开发的游戏中,无论模型,音频,还是图片等,我们都做成Prefab,然后打包成Assetbundle,方便我们后面的使用,来达到资源的更新. 一个Asse ...

  8. Unity3d开发IOS游戏 基础

    Unity3d开发IOS游戏 基础 @阿龙 -  649998群 1.先说明两个问题,我在WIN7下面的U3D里面,用了雅黑字体,但是导出为ios后,字体就看不见了,这是为什么呢?这是需要在MAC下找 ...

  9. unity3D埃及探险游戏源码,支持安卓+IOS双端 unity2019 C#语言开发

    unity3D埃及探险游戏源码,支持安卓+IOS双端 unity2019 C#语言开发.完整的源码可直接运营.拿来学习研究和二次开发都很不错. 源码下载 unity3D埃及探险游戏源码C#语言开发.完 ...

  10. c语言课程设计--打飞碟源代码,飞碟游戏(飞碟游戏规则)

    2021年5月13日发(作者:封孟绅) 计算机技术基础课程设计 C语言 设计报告 题目:打飞碟游戏 学院:机电工程学院 专业:工业工程 班级:050109 姓名:刁玉斌 指导教师:顾煜新 设计时间:2 ...

最新文章

  1. SQL Server数据库错误9003(LSN无效)的处理方法
  2. AI战略投资全景图:11个行业200多家巨头最爱什么样的AI创业公司?
  3. 网络推广外包——网络推广外包专员浅析移动端网站建设要点
  4. php能做的事,PHP也能干大事 随机函数
  5. python3精要(84)-字节码原理及分析(2)
  6. 网易云信即时通讯推送保障及网络优化详解(三):如何在弱网环境下优化大数据传输
  7. Cookie的使用(js-cookie插件)
  8. 《关键对话——注意观察,如何判断对话氛围是否安全》读书笔记(四)
  9. iPhone开发之@Class与#import的区别
  10. bind配置进阶,转发器的配置以及如何实现子域授权。
  11. 乐嘉写给15岁的女儿的信
  12. 异数OS 星星之火(三)--异数OS-织梦师云 微服务编写入门
  13. iphone 手势编程---值得回忆的API
  14. 《30天自制操作系统》学习笔记--第12天
  15. react图片剪裁react-cropper
  16. 微软MSBI零基础从数据仓库到商业智能实战(SSIS SSAS SSRS)
  17. 计算机二级office高级应用知识点,2017年全国计算机二级考试MS Office高级应用知识点:电子邮件...
  18. Linux基础知识与实操-篇三: 文件压缩打包与vim基本使用
  19. 主存、辅存、内存、外存、存储器是什么?还傻傻分不清楚?看完这一篇就够了
  20. 微信支付中的p12证书提取公钥、私钥、证书、序列号等

热门文章

  1. 三十岁仍一事无成,一个失败工程师的自白
  2. 参数是list集合校验,使用@Vaild或者@Vaildated不起作用
  3. Qt Creator 8.0.1 (Community)创建项目出现No valid kits found怎么办?
  4. 电机控制系统php,基于FPGA的直流电机PWM控制系统(附带源码下载)
  5. 蒙特卡洛树搜索(MCTS)
  6. html5中国产业联盟,中软国际联合发起HTML5+联盟为产业生态服务
  7. 用计算机探索商的变化规律教案,用计算器探索规律教学设计与反思(精选5篇)...
  8. 常用计算机检索算符,在计算机检索中,常用的布尔逻辑算符有哪几种
  9. 2018电大计算机操作题怎么评分,2018年度电大专科计算机应用基础学习知识win7系统上机操作技巧题操作技巧.doc...
  10. 腾讯AlloyTeam招募Web工程师(社招/校招/实习生)