本来应该接着将PopupMenu,但具体开发的笔记本不在身边,手头的电脑上没有最新的代码,
所以只能暂时停下那个内容,先谈谈另外一个有趣的内容——u3d实现子弹弹道。

当然这个完整的说,也非常复杂,还是由浅入深,先说说最核心的原理。

一、定义

我将子弹分为至少两种:

1、实体型。即发射后,生成一个带刚体的gameobject,可以通过u3d的物理引擎实现碰撞检测。比如机关枪子弹、弹道等等。

2、射线型。即子弹的运动和碰撞不由刚体实现,弹道控制由代码实现,通过Physics2D下函数或自己计算物体检测。比如定向激光、AOE伤害。

本文分别讲两种的实现。

二、理解U3D的物理引擎

知其所以然,才能更好、更快的进行代码实现。这个章节从运用和现象入手,说明一些有关u3d物理引擎的“坑”

Collider和Rigidbody

如果完全不了解U3D的Collider(碰撞体)、Rigidbody(刚体)可以先找下相关的文章看下,网上很多很好的文章。

这里用自己的理解简单说下(针对2D):

Collider描绘物体的碰撞形状,有Box、Cirlce等,是碰撞检测的基础,比如鼠标点击的碰撞判断,都是依赖于定义的Collider来知晓物体的“碰撞形状”

Rigidbody是给物体赋予一个接受物理规律的属性,比如给一个小球加上刚体,默认的小球就会收到重力加速度往下掉。

刚体必须有collider,不然就没有“形状”

在u3d的2D物理效果的设计理念是:

不会动的物体,只设Collider,例如大地、树木;

会动的,需要有物理运动效果的,设置Collider和Rigidbody,Collider说明“外形”,Rigidbody说明物理属性,如质量、碰撞属性等。

注意这个理念,因为我首次使用2D物理到游戏中的时候,有很多地方很费解,不明白为什么要这么设计,如果理解这个理念了,很多东西就想明白了。

碰撞检测的相关参数

U3D的2D物理引擎,可以不用做任何编码实现刚体的运动碰撞效果。

但如果需要代码获取碰撞信息,相关的属性有:

Collider的Is Trigger,Rigidbody的Is Kinematic

至于其他刚体参数的作用,可以摆个场景逐个调整参数看看效果,就基本明白了。

因为我主要是想通过u3d的2D物理引擎获得的碰撞信息,而不关注碰撞后的物理效果,所以其他参数都可以不管或设置为0。

特别的,由于游戏是一个top-down视角的游戏,而u3d的2D物理引擎默认y轴是2D世界的上下方向,所以Gravity Scale要设置为0。

对应的相关的函数有:

OnTriggerEnter2D、OnTriggerExit2D、OnTriggerStay2D(Collider发生碰撞时被调用)

OnCollisionEnter2D、 OnCollisionExit2D、OnCollisionStay2D(Rigidbody发生碰撞时被调用)

下面将解释这些属性和函数的作用。

碰撞检测的推荐实现方式——Rigidbody的Collision

需要用u3d的2d物理引擎实现碰撞检测时,需要这么设置(假定检测A和B之间的碰撞):

1、A和B都添加collider,不勾选Is Trigger

2、A或B至少一个添加rigidbody,不勾选IsKenematic

3、对A或B添加脚本,添加OnCollisionEnter2D、 OnCollisionExit2D或OnCollisionStay2D函数获取碰撞信息。

以本文的实体型子弹为例:

1、  对游戏单位和子弹都添加collider

2、  对子弹添加rigidbody

3、  对子弹添加OnCollisionEnter2D方法,编写造成伤害的逻辑代码,并销毁子弹对象。

关于Rigidbody的Is Kinematic的属性:勾选后,2D物理引擎对这个刚体不起作用,只能代码去实现物体的运动。同时,OnCollisionEnter2D也不会被触发。

另外一种碰撞检测的实现——Collider的Trigger

通过Collider的Is Trigger的,也能实现“碰撞检测”。

Collider的Is Trigger:顾名思义,这个属性说明是否触发,勾选后,则会有“碰撞时”OnTriggerEnter2D、OnTriggerExit2D, OnTriggerStay2D函数。

例如,检测A和B之间的碰撞

1、  A和B都添加collider,A勾选Is Trigger,B不勾选

2、  A添加rigidbody

3、  对A脚本添加OnTriggerEnter2D

A和B的collider发生接触时,则A的OnTriggerEnter2D被调用。如果B的脚本也有OnTriggerEnter2D,也会被调用,尽管B没有勾选Is Trigger。

这种“碰撞检测”,依靠Collider的trigger机制,在Collider层面就可以完成,其原理应该和鼠标点击事件的触发类似。但有以下问题:

1、  这个触发机制的碰撞检测频率和Update一样,而上文中推荐方式(利用OnCollisionEnter2D)是和FixedUpdate一样,后者是专门是做刚体物理运算,其计算频率更好,碰撞检测更准确。如果使用OnTriggerEnter2D的方式,检测到碰撞发生时可能两个碰撞的物体已经相互嵌入很久了,如果其中一个物体运动速度过快,可能已经“穿”过去了

2、  OnCollisionEnter2D的参数提供的碰撞信息更丰富,而OnTriggerEnter2D只有一个碰撞对方collider的信息,得不到更精确的点。

3、  虽然碰撞是在Collider层面完成,感觉跟Rigidbody没有什么关系(1、2两点的想象也侧面印证了我这个想法),但A和B之间必须有一个是Rigidbody,不然碰撞事件触发不了。Physics2D中IsTouching等函数也有这样。

4、  设置Trigger后,所有的碰撞事件被Trigger拦截,OnCollisionEnter2D不会再被调用。

基于以上因素,这种碰撞检测,不能称之为有效的“碰撞检测”,在实际运用中要根据实际情况判断是否合适。

作为游戏物体和物体的碰撞检测,不推荐使用Collider的Trigger方式。

关于碰撞检测的总结

1、如果想使用物理引擎实现碰撞,包括Collider的Trigger,rigidbody的Collision,Physics 2D的IsTouching等方法,除了碰撞双方都有Collider,必须有1个有rigidbody。(此点让我无力吐槽)。

2、使用Collider的Trigger(勾选Is Trigger),可以使用OnTriggerEnter2D、OnTriggerExit2D, OnTriggerStay2D监听碰撞,但没有碰撞物理效果,rigidbody的collision无法使用。Collider的Trigger不是在物理引擎层面上工作的,不管是碰撞检测的更新频率、是碰撞结果都不好,且它直接“阻止”了物理引擎的对物体的作用。

3、使用rigidbody的collision(不勾选Is Kinematic),使用OnCollisionEnter2D、 OnCollisionExit2D、OnCollisionStay2D监听碰撞,物理引擎会影响刚体的运动,会有碰撞反弹的物理效果。最好在OnCollisionEnter2D只获取状态而不更新物体运动,因为物理引擎这是也在控制它的运动。

综上,u3d物理引擎的使用限制还是很多的,实现很多逻辑功能都有障碍。由于对于实体子弹的实现,子弹打击单位后,子弹自我销毁,和以上第3点正好满足,可以使用u3d的collision,而非实体子弹显然不能使用。

三、实体型子弹

如果认真阅读上面的分析且理解了原理,应该对u3d的2D碰撞(3D类似)的套路应该很清楚,实现实体子弹打击效果,仅仅是点点、配配的事。

现实方式为:

1、  对游戏单位和子弹都添加collider

2、  对子弹添加rigidbody

3、  对子弹添加OnCollisionEnter2D方法,编写造成伤害的逻辑代码,并销毁子弹对象。

关键代码:

    void Update (){if (Common.pause)return;m_Anim.OnUpdate (GetComponent<SpriteRenderer> ());float l = Time.deltaTime * m_Info.speed;transform.position += m_Direction * l;m_LeftDistance -= l;if (m_LeftDistance < 0 || m_DestroySelf){FlyerManager.Free(gameObject);}}public virtual void OnCollisionEnter2D (Collision2D coll){if (m_DestroySelf)return;TargetPick pick = TargetPick.From (coll);m_Info.AttackOn (pick,m_Direction, m_myUnit,hitEffectType);m_DestroySelf = true;}

其中有很多类和函数已经封装,例如

FlyerManager.Free(),内部实现了子弹的回收,便于再利用。

再如TargetPick和AttackOn,实现了拾取最合适的游戏单位和计算打击伤害的功能。

(待续)

转载于:https://www.cnblogs.com/uncleciba/p/5742221.html

糍粑大叔的独游之旅-战斗!之弹道实现(上)相关推荐

  1. 糍粑大叔的独游之旅-开篇语

    开篇语 从事IT行业近8年了,虽然有编写文档的习惯,但从来没有写博客的习惯. 现在的工作开始慢慢偏向IT相关的管理工作,从事具体技术工作的时间越来越少, 但我始终保持着对技术的热爱. 特别是游戏编程. ...

  2. 糍粑大叔的独游之旅-u3d实现弹出菜单(上)-动态列表

    在u3d5.x中,使用ugui作为默认的界面系统,但控件实在太少,很多需求都不能满足,比如弹出菜单(PopupMenu) 我也懒得去网上找现成的实现,再加上现有代码已经有很多有关列表控件的功能,不想再 ...

  3. [转载]九寨沟自游青年旅舍为您献上九寨沟二次进沟独门攻略!

    玩九寨沟一天的时间是绝对不够的!要想好好把九寨沟看个遍最佳的游览时间应该是一天半到两天.要想玩这么长的时间就只能二次进沟了,九寨沟二次进沟怎么玩?别着急!九寨沟自游青年旅舍为您献上九寨沟二次进沟独门攻 ...

  4. 零经验小白的独游历程——如何解决独立游戏的素材问题

    前言 曾经看过很多可以一个人搞定美术.编程.策划的独游大佬,心里虽然很佩服,但是就我个人的观点是--现代社会的大部分工作都是需要分工合作才能完成的.尤其是游戏这种专业性很强的产品,更需要每个人各司其职 ...

  5. 名帖230 张雨 行书《独游龙井方圆庵卷》

    <中国书法名帖目录> 张雨<独游龙井方圆庵行书诗卷>行书,至正二年(1342年),香港中文大学文物馆藏. [释文]独游龙井方圆庵僧照请阅宋五贤二开士象 独寻招提游,果得世外欢. ...

  6. qq幻想一直连接不到服务器,造梦西游OL连接服务器失败 连接不上网络怎么办

    造梦西游OL连接服务器失败 连接不上网络怎么办.造梦西游OL是一款非常好玩的网络游戏,许多游戏爱好者进入游戏想领略它的玩法,但是近日有许多小伙伴反应一直连接不上服务器,一打开就是连接网络失败这样的界面 ...

  7. pythonjam游戏_独游网 - 专注独立游戏,为独立游戏发声!

    国人游戏 / chinese-games freeman • 16:21 / 12-21 每年1月的末尾,全球接近5万名开发者都在等待着一个主题的揭晓.在这个主题全球同步公布之后,等待着他们的是一场游 ...

  8. 读书笔记(I) 游戏之旅

    书写的深刻,而重实践,转型工作就靠这本书了! 游戏之旅 作者:云风 电子工业出版社 出版年:2005-12-01 综合评分:8.0 ---------------------------------- ...

  9. 2.5 随从受伤溅血效果的实现———自制卡牌游戏之旅

    文章目录 一.实现效果 二.具体实现 1. 对象创建 2. 编写代码 DamageEffect.cs ① 从预制体生成 ② 渐隐效果协程 ③ 差分的特效图片 DamageEffectTest.cs 三 ...

最新文章

  1. 唯一索引和普通索引的选择
  2. python--numpy pad函数使用
  3. 区块链BaaS云服务(3)甲骨文 Oracle Blockchain Platform
  4. boost::hana::int_c用法的测试程序
  5. 调用第三方接口缴费的通用逻辑
  6. Java - I/O
  7. 136_Power BI 自定义矩阵热力图
  8. 未来经济会发展到什么程度?
  9. git配置ssh私钥_GitLab 配置
  10. 大学生利用信息差赚钱的方式
  11. oracle nav函数,WordPress函数wp_nav_menu()怎样用_CMS体系建站教程
  12. 想学编程做程序员,是学前端好还是学后台好?
  13. 内插滤波器 matlab,多相分解实现内插滤波器.ppt
  14. Drcom校园网自动登录
  15. 手机上好用的apm测试软件,在哪才能找到测apm的软件  及如合使用  – 手机爱问...
  16. Alpha阶段敏捷冲刺⑥
  17. 电脑损坏,电脑文件损坏无法开机怎么办
  18. 《实践论》、《矛盾论》
  19. 美国交通事故分析(2017)(项目练习_5)
  20. 机器学习-常用八大神经网络框架

热门文章

  1. 【人工智能】全网首发!2020年AI、CV、NLP等最全国际会议、顶会时间汇总!!
  2. 面向对象(OOP)基本概念
  3. cacti 升级php,Cacti 升级备忘
  4. centos 配置mysql环境变量_Centos7.1部署mysql-5.6.34(笔记)
  5. 怎么让php文件请求一次连接,php 如何锁定接口,让一个接口,同一时间只处理同一人的一次请求?...
  6. java火焰纹章攻略女神之剑_《火焰纹章风花雪月》白云之章-女神再生仪式图文攻略...
  7. 华三模拟器hcl实验手册_实验室 | # 实验室废气处理系统的设计#
  8. jQuery length和size()区别
  9. 坑:jmeter部署AWS云服务器时出现连接超时Non HTTP response code: org.apache.http.conn.HttpHostConnectException...
  10. 8. String to Integer[M]字符串转整数