查看: 1665|回复: 3
打印 上一主题 下一主题

[其他] 游戏攻击的检测

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-8-30 02:02:35 |只看该作者 |倒序浏览
自己在模仿一个2D游戏做攻击时的感触。纯粹个人理解。。。。

1.通过射线进行检测
在进行攻击时,向攻击的方向发射一条射线。射线的长度为攻击的距离,碰撞层为敌人的层。若发生碰撞,通过标签判断是否是自己要攻击的对象。若是则造成伤害。
有点:资源消耗少,攻击的真实性高

缺点:1.只能进行单体攻击,不能进行群体攻击。2.如果目标大小差距比较大时,容易造成射线检测不到的状态。
代码实现:

  1. csharpcode:[/b]  
  2.      [backcolor=rgb(247, 247, 247)][font=Tahoma, Helvetica, SimSun, sans-serif] /// 攻击方式1[/font][/backcolor][code]<pre class="brush:csharp;auto-links:false;">      /// </summary>
  3.       private void Attack_1(float _AttackRange)
  4.       {
  5.   //设置攻击动画
  6.           anim.SetTrigger("Attack");
  7.   //设置工具特效
  8.           effectManager.Attack_1(facingRight);
  9.   //如果玩家面朝右
  10.           if (facingRight)
  11.           {
  12.   //进行射线检测
  13.               RaycastHit2D hit = Physics2D.Linecast(transform.position, transform.position + new Vector3(_AttackRange, 0, 0), 1 << LayerMask.NameToLayer("Enemy"));
  14.   //如果有碰撞
  15.               if (hit)
  16.               {
  17.   //判断是否是敌人
  18.                   if (hit.transform.gameObject.tag == "Enemy")
  19.                   {
  20.   //进行伤害设置
  21.                       hit.transform.GetComponent<EnemyController>().HPBar.UpdateHP(-5, 10);
  22.                       Debug.Log("攻击到敌人了");
  23.                   }
  24.               }
  25.           }
  26.           else
  27.           {
  28.               RaycastHit2D hit = Physics2D.Linecast(transform.position, transform.position + new Vector3(-_AttackRange, 0, 0), 1 << LayerMask.NameToLayer("Enemy"));
  29.   
  30.               if (hit)
  31.               {
  32.                   if (hit.transform.gameObject.tag == "Enemy")
  33.                   {
  34.                       hit.transform.GetComponent<EnemyController>().HPBar.UpdateHP(-5, 10);
  35.                       Debug.Log("攻击到敌人了");
  36.                   }
  37.               }
  38.           }
  39.       }</pre>
复制代码
2.距离检测
在攻击时遍历屏幕里所有的敌人,检测其相对于玩家的距离和方向,如果距离小于攻击距离并且位于玩家的面前。则就受到攻击,造成伤害
优点:可进行范围攻击,100%击中,单体攻击,群体攻击
缺点:资源消耗比较大,典型的以空间换时间

代码实现:
  1. csharpcode:[/b] 

  2. [code]//攻击
  3.   private void Attack_Range_1(float _AttackRange)
  4.       {
  5.   //设置工具动画
  6.           anim.SetTrigger("Attack");
  7.   //设置攻击特效
  8.           effectManager.Attack_1(facingRight);
  9.           float distance=0;
  10.   //敌人和玩家之间的方向 -1方向相反,0是方向垂直,1正前方
  11.           float direction=0;
  12.   //EnemyList是敌人的集合,即EnemyController的集合
  13.           for (int i = 0; i < EnemyList.Count; i++)
  14.           {
  15.               //计算玩家和敌人之间的距离
  16.               distance = Vector3.Distance(EnemyList[i].transform.position, myTransform.position);
  17.               //获取目标相对于玩家的方向
  18.               Vector3 dir = (EnemyList[i].transform.position - myTransform.position).normalized;
  19.               if(facingRight)
  20.                   direction = Vector3.Dot(dir, transform.right);
  21.               else
  22.                   direction = Vector3.Dot(dir, -transform.right);
  23.               //当敌人处于玩家的攻击范围时,攻击才生效
  24.               Debug.Log("距离" + distance+"方向"+direction);
  25.               if (distance < _AttackRange)
  26.               {
  27.                   //当敌人在玩家面前时才进行伤害
  28.                   if (direction > 0)
  29.                   {
  30.                       EnemyList[i].HPBar.remove = new CallBack(RemoveGameObect);
  31.                       EnemyList[i].HPBar.UpdateHP(-5, 10);
  32.                   }
  33.               }
  34.           }
  35.       }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

heise    

4

主题

3

听众

4249

积分

中级设计师

Rank: 5Rank: 5

纳金币
105
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-8-30 02:14:55 |只看该作者
谢谢分享
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-8-30 03:15:33 |只看该作者
Great share !
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-24 07:17 , Processed in 0.083185 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部