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
- Unity3D 相同标签或同名游戏对象的逐个监测
- unity3d常用的游戏对象引用技巧
- Unity3D 获取一个游戏对象的尺寸
- unity3d 获取游戏对象
- C++不同类中的特征标相同的同名函数
- java 对象比较 判断两个对象的某些或某个属性相同 这对象相等。
- Unity3D获取GameObject的所有子对象,添加特定标签
- unity3D之克隆游戏对象
- Unity3d中获取游戏对象
- Unity3D获取游戏对象详解
- 使用Unity3D 自主实战开发的赛车游戏实例,关键点记录 (四)之道路监测点
- Unity3D游戏对象消失enabled、Destroy与active的区别
- Unity3D游戏对象消失三种方法的区别:
- Unity3D游戏对象消失enabled、Destroy与active的区别
- Unity3D 处于Camera跟随游戏对象后面拍摄的方法
- Unity3D Camera跟随游戏对象后面拍摄的方法(二)
- Unity3D游戏对象消失enabled、Destroy与active的区别
- Unity3d获取游戏对象的几种方法
- 三星等低端手机OOM解决方法
- 图像梯度特征的常用边缘检测算子:Sobel、Prewitt、Roberts
- hdu 4655 Cut Pieces(贪心)
- linux和vxworks的实时性
- 没有BAT3级的应急响应中心,互联网公司该如何应对数据泄露事件?
- Unity3D 相同标签或同名游戏对象的逐个监测
- ViewPager 打造 图片幻灯切换
- android 存储及注意事项!(java io流,和sharedperference存储)
- Cloud Design Pattern - Compute Resource Consolidation(服务聚合)
- maven的生命周期和插件(九)
- 【DP】 BZOJ 3675: [Apio2014]序列分割
- 怎么引入bsdsocket来搭建一个一对一的服务器
- Light Bulb
- TL-WR2041N 自动登陆 自动控制设置