纳金网
标题: 游戏攻击的检测 [打印本页]
作者: 王者再临 时间: 2014-8-30 02:02
标题: 游戏攻击的检测
自己在模仿一个2D游戏做攻击时的感触。纯粹个人理解。。。。
1.通过射线进行检测在进行攻击时,向攻击的方向发射一条射线。射线的长度为攻击的距离,碰撞层为敌人的层。若发生碰撞,通过标签判断是否是自己要攻击的对象。若是则造成伤害。
有点:资源消耗少,攻击的真实性高
缺点:1.只能进行单体攻击,不能进行群体攻击。2.如果目标大小差距比较大时,容易造成射线检测不到的状态。
代码实现:
- csharpcode:[/b]
- [backcolor=rgb(247, 247, 247)][font=Tahoma, Helvetica, SimSun, sans-serif] /// 攻击方式1[/font][/backcolor][code]<pre class="brush:csharp;auto-links:false;"> /// </summary>
- private void Attack_1(float _AttackRange)
- {
- //设置攻击动画
- anim.SetTrigger("Attack");
- //设置工具特效
- effectManager.Attack_1(facingRight);
- //如果玩家面朝右
- if (facingRight)
- {
- //进行射线检测
- RaycastHit2D hit = Physics2D.Linecast(transform.position, transform.position + new Vector3(_AttackRange, 0, 0), 1 << LayerMask.NameToLayer("Enemy"));
- //如果有碰撞
- if (hit)
- {
- //判断是否是敌人
- if (hit.transform.gameObject.tag == "Enemy")
- {
- //进行伤害设置
- hit.transform.GetComponent<EnemyController>().HPBar.UpdateHP(-5, 10);
- Debug.Log("攻击到敌人了");
- }
- }
- }
- else
- {
- RaycastHit2D hit = Physics2D.Linecast(transform.position, transform.position + new Vector3(-_AttackRange, 0, 0), 1 << LayerMask.NameToLayer("Enemy"));
-
- if (hit)
- {
- if (hit.transform.gameObject.tag == "Enemy")
- {
- hit.transform.GetComponent<EnemyController>().HPBar.UpdateHP(-5, 10);
- Debug.Log("攻击到敌人了");
- }
- }
- }
- }</pre>
复制代码 2.距离检测在攻击时遍历屏幕里所有的敌人,检测其相对于玩家的距离和方向,如果距离小于攻击距离并且位于玩家的面前。则就受到攻击,造成伤害
优点:可进行范围攻击,100%击中,单体攻击,群体攻击
缺点:资源消耗比较大,典型的以空间换时间
代码实现:
- csharpcode:[/b]
- [code]//攻击
- private void Attack_Range_1(float _AttackRange)
- {
- //设置工具动画
- anim.SetTrigger("Attack");
- //设置攻击特效
- effectManager.Attack_1(facingRight);
- float distance=0;
- //敌人和玩家之间的方向 -1方向相反,0是方向垂直,1正前方
- float direction=0;
- //EnemyList是敌人的集合,即EnemyController的集合
- for (int i = 0; i < EnemyList.Count; i++)
- {
- //计算玩家和敌人之间的距离
- distance = Vector3.Distance(EnemyList[i].transform.position, myTransform.position);
- //获取目标相对于玩家的方向
- Vector3 dir = (EnemyList[i].transform.position - myTransform.position).normalized;
- if(facingRight)
- direction = Vector3.Dot(dir, transform.right);
- else
- direction = Vector3.Dot(dir, -transform.right);
- //当敌人处于玩家的攻击范围时,攻击才生效
- Debug.Log("距离" + distance+"方向"+direction);
- if (distance < _AttackRange)
- {
- //当敌人在玩家面前时才进行伤害
- if (direction > 0)
- {
- EnemyList[i].HPBar.remove = new CallBack(RemoveGameObect);
- EnemyList[i].HPBar.UpdateHP(-5, 10);
- }
- }
- }
- }
复制代码
作者: heise 时间: 2014-8-30 02:14
谢谢分享
作者: hyui 时间: 2014-8-30 03:15
Great share !
欢迎光临 纳金网 (http://go.narkii.com/club/) |
Powered by Discuz! X2.5 |