Unity3D 相同标签或同名游戏对象的逐个监测

来源:互联网 发布:宁波seo入门教程 编辑:程序博客网 时间:2024/06/05 15:54

  最近比较忙着自己的项目,很少用空闲的时间来写博客,但是,只要有时间我就会思考如何来补上每天的博客,所以今天,可能会写下三篇博客,来弥补一下忙碌过的两天的问题总结为博客.要养成良好的习惯嘛,哈哈哈哈哈哈哈!

  今天,写下对相同标签或同名游戏对象的逐个检测! 这个问题也是困扰了大约半天的时间,因为,之前没有机会用过嘛! 首先,说一下遇到的问题吧!

  问题:  主角(Player),攻击相同标签的塔(Tower), 我用射线检测到塔 -> 鼠标点击移动到可以检测到塔 -> 主角到达自己可以攻击的范围(attackRange) -> 攻击塔(didAttack)并且停止移动,或,"判断二,当不在玩家攻击范围内(attackRange),不在攻击状态下(!didAttack),玩家向塔移动!"

  但是,会有一种状态无法解决.当有两个塔的时候,进入到玩家的攻击范围(attackRange) -> 攻击第一个塔, 但第二个塔不在玩家的攻击范围,用鼠标点击第二个塔. "判断一是,塔在玩家的攻击范围内(attackRange),攻击(didAttack)" || "判断二是,第二个塔不在玩家的攻击范围内(attackRangr),玩家向塔移动",但此时"第一个塔在玩家的攻击范围内(attackRange),可以攻击(did)",所以"判断二,就无法达成条件".

  下面是错误的代码,仅作为错误的书写代码,

 请勿复制!

for (int i = 0; i < towers.Length; i++) //*************************** 遍历所有的塔的数组 ***************************{GameObject tower = towers[i];//*************************** 一个塔游戏对象实例化并保存变量的所有的塔 ***************************if (null != tower) //@@@@@@@@@ 如果塔游戏对象不为空 @@@@@@@@@   {if(hit.transform.CompareTag ("Tower") && Vector3.Distance (tower.transform.position,transform.position) <= attackRange)//@@@@@@@@@ 射中的游戏对象为塔,并在玩家攻击范围内 @@@@@@@@@   {targetPosition = hit.point;//*************************** 设置玩家的移动的目标点为射中点 ***************************GetComponent<NavMeshAgent>().SetDestination (transform.position);//*************************** 寻路组件设置目的地为 玩家当前坐标(不移动) ***************************transform.LookAt (targetPosition);//*************************** 玩家看向目标点 ***************************animator.SetFloat ("Walk",0.2f);//*************************** 设置行走的速度为0.2f 外部设置大于0.1f播放行走动画 ***************************animator.SetLayerWeight(1,1f);//*************************** 设置第二层冻哈的权重值为1f  百分之百影响第一层的动画 ***************************animator.SetBool ("Attack",true);//*************************** 设置开始攻击 ***************************didAttack  = true;//*************************** 可以攻击 ***************************}if (hit.transform.CompareTag ("Tower") && Vector3.Distance (tower.transform.position,transform.position) > attackRange && !didAttack) //@@@@@@@@@ 射中的游戏对象为塔,但不在玩家的攻击范围内 @@@@@@@@@   {print ("移动移动移动移动移动移动移动");targetPosition = hit.point;//*************************** 设置玩家移动的目标点为射中点 ***************************GetComponent<NavMeshAgent>().SetDestination (targetPosition);//*************************** 寻路组件设置目的地为 玩家移动的目标点 ***************************transform.LookAt (targetPosition);//*************************** 玩家看向目标点 ***************************animator.SetFloat ("Walk",0.2f);//*************************** 设置行走的速度为0.2f 外部设置大于0.1f播放行走动画 ***************************didAttack  = false;//*************************** 不可以攻击 ***************************                            }                        }                    }


   所以,当塔在玩家攻击范围内时,玩家只能攻击,无法移动到,不在玩家攻击范围内的第二个塔,出现了所谓的BUG!

  下面是我的解决办法,请大家参考! 希望可以帮助到大家,给大家一些启发!

     我用了List<GameObject>数组来保存玩家的目标塔,当数组第一个元素为空的时候,就会在重新,从用鼠标射线检测(要是不懂可以参考我下文的射线检测)的塔,来补充到数组的第一个元素.来重新给予玩家目标!        当点击鼠标右键和左键和塔被销毁时候 -> 清除数组(归零)!     便于目标的获取!!

   使用C#中的数组就可以很好的解决这类的问题,代码中注释很详细,请参考!!!!!!!!!!

if (0 == towers.Count ) //@@@@@@@@@ 如果塔的数组的元素个数为零 @@@@@@@@@  {if (hit.transform.CompareTag ("Tower")) {//@@@@@@@@@ 如果射中的物体为塔 @@@@@@@@@        towers.Add (hit.transform.gameObject);//*************************** 塔的数组添加射中的塔的游戏对象 ***************************targetPosition = towers[0].transform.position;//***************************玩家的目标为塔数组一的位置 ***************************if (Vector3.Distance (targetPosition,transform.position) <= attackRange ) {//@@@@@@@@@ 如果玩家目标的坐标到玩家的距离小于玩家的攻击距离 @@@@@@@@@  GetComponent<NavMeshAgent>().SetDestination (transform.position);//*************************** 寻路组件设置目的地为 玩家当前坐标(不移动) ***************************transform.LookAt (targetPosition);//*************************** 玩家看向目标点 ***************************animator.SetLayerWeight(1,1f);//*************************** 设置第二层动画的权重值为1f  百分之百影响第一层的动画 ***************************animator.SetBool ("Attack",true);//*************************** 设置开始攻击 ***************************didHaveAtkTarget = true;//*************************** 玩家有攻击目标 ***************************}else if(didHaveAtkTarget && didAttack) //@@@@@@@@@ 射中的游戏对象为塔,但不在玩家的攻击范围内,玩家有攻击目标并且在攻击状态 @@@@@@@@@   {targetPosition = hit.point;//*************************** 设置玩家移动的目标点为射中点 ***************************GetComponent<NavMeshAgent>().SetDestination (targetPosition);//*************************** 寻路组件设置目的地为 玩家移动的目标点 ***************************transform.LookAt (targetPosition);//*************************** 玩家看向目标点 ***************************animator.SetLayerWeight (0,1f);animator.SetFloat ("Walk",0.2f);//*************************** 设置行走的速度为0.2f 外部设置大于0.1f播放行走动画 ***************************didHaveAtkTarget = false;//*************************** 玩家没有攻击目标 ***************************towers.Clear ();//*************************** 塔的数组清零 ***************************}}}


   

0 0