Unity框选游戏目标的实现方法

上传人:平*** 文档编号:12801493 上传时间:2017-10-20 格式:DOCX 页数:14 大小:318.36KB
返回 下载 相关 举报
Unity框选游戏目标的实现方法_第1页
第1页 / 共14页
Unity框选游戏目标的实现方法_第2页
第2页 / 共14页
Unity框选游戏目标的实现方法_第3页
第3页 / 共14页
Unity框选游戏目标的实现方法_第4页
第4页 / 共14页
Unity框选游戏目标的实现方法_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《Unity框选游戏目标的实现方法》由会员分享,可在线阅读,更多相关《Unity框选游戏目标的实现方法(14页珍藏版)》请在金锄头文库上搜索。

1、学 IT 技能上我学院网 学 Unity 上我学院:Unity 框选游戏目标 的实现方法相信大家在打魔兽争霸类游戏的时候,需要框选多个游戏目标,然后来进行指挥作战,这种方法是如何实现的你嗯,在 Unity 里实现,其实很简单,有两个前提:1.画的方框始终是在屏幕空间进行的,而屏幕空间其实就是摄像机的视锥空间的投射了,不需要另外计算视锥。2.unity 摄像机内建的功能,可以方便的把屏幕坐标和世界坐标互换。这样最简单的画框选物体就简化成了:1.用 GL 在屏幕空间动态画框。2.把备选对象的 transform.position 用 camera.WorldToScreenPoiont 变换成屏幕

2、坐标。3.判断这些 position 的点是否落在画的方框之内,如果是就把对象切换到画边框的层,呈现选中效果。一.屏幕动态画框这个过程相对简单 就是在鼠标按下的时候记下鼠标位置,然后在鼠标移动时在当前鼠标位置和按下的位置之间画一个方形就行了。using UnityEngine;using System.Collections;学 IT 技能上我学院网 学 Unity 上我学院:public class DrawRectangle : MonoBehaviour public Color rectColor = Color.green;private Vector3 start = Vector

3、3.zero;/记下鼠标按下位置private Material rectMat = null;/画线的材质 不设定系统会用当前材质画线 结果不可控private bool drawRectangle = false;/是否开始画线标志/ Use this for initializationvoid Start () rectMat = new Material( Shader Lines/Colored Blended +SubShader Pass + Blend SrcAlpha OneMinusSrcAlpha + ZWrite Off Cull Off Fog Mode Off +

4、 BindChannels + Bind vertex, vertex Bind color, color +学 IT 技能上我学院网 学 Unity 上我学院: );/生成画线的材质rectMat.hideFlags = HideFlags.HideAndDontSave;rectMat.shader.hideFlags = HideFlags.HideAndDontSave; void Update () if(Input.GetMouseButtonDown(0)drawRectangle = true;/如果鼠标左键按下 设置开始画线标志start = Input.mousePosit

5、ion;/记录按下位置else if (Input.GetMouseButtonUp(0)drawRectangle = false;/如果鼠标左键放开 结束画线void OnPostRender() /画线这种操作推荐在 OnPostRender()里进行 而不是直接放在 Update,所以需要标志来开启学 IT 技能上我学院网 学 Unity 上我学院:if(drawRectangle)Vector3 end = Input.mousePosition;/鼠标当前位置GL.PushMatrix();/保存摄像机变换矩阵if (! rectMat)return;rectMat.SetPass

6、( 0 );GL.LoadPixelMatrix();/设置用屏幕坐标绘图GL.Begin(GL.QUADS);GL.Color( new Color(rectColor.r,rectColor.g,rectColor.b,0.1f) );/设置颜色和透明度,方框内部透明GL.Vertex3( start.x,start.y,0);GL.Vertex3( end.x,start.y,0);GL.Vertex3( end.x,end.y,0 );GL.Vertex3( start.x,end.y,0 );学 IT 技能上我学院网 学 Unity 上我学院:GL.End();GL.Begin(GL

7、.LINES);GL.Color(rectColor);/设置方框的边框颜色 边框不透明GL.Vertex3( start.x,start.y,0);GL.Vertex3( end.x,start.y,0);GL.Vertex3( end.x,start.y,0);GL.Vertex3( end.x,end.y,0 );GL.Vertex3( end.x,end.y,0 );GL.Vertex3( start.x,end.y,0 );GL.Vertex3( start.x,end.y,0 );GL.Vertex3(start.x,start.y,0);GL.End();GL.PopMatrix

8、();/恢复摄像机投影矩阵学 IT 技能上我学院网 学 Unity 上我学院:效果如图:注意 GL 绘图都是每帧进行的,所以不需要清除,直接不绘制方框就消失了。 二.判断物体是否选中有了方框,要判断物体是否在方框内,按照经典的数学算法可以根据直线方程和点的坐标计算判断点在线的左边 右边 还是线上空间平面方程可表示为:Ax+By+Cz=0对于点(x1, y1, z1),有若 Ax1+By1+Cz1 = 0,则点在平面上;学 IT 技能上我学院网 学 Unity 上我学院:若 Ax1+By1+Cz1 0,则点在平面的另一侧;但是在这里,因为都是水平、垂直的线,我们并不需要考虑画斜线、曲线框选物体.

9、,所以只需要简单的比大小就行了,土了那么一点但其实效率更高,毕竟作游戏不是算法比赛,怎么简单高效怎么用。如果:物体的屏幕 position.x 方框左下角.x ; 物体的屏幕 position.y 方框左下角.y ; 物体的屏幕 position.x 屏幕坐标转换,其实根本不需要什么复杂的裁剪算法,也不需要搞一大堆参考物体,往外发射一堆射线什么的,一次坐标转换加 6 个判断条件的一条 if语句,就完成全部选择逻辑了,简单高效。void checkSelection(Vector3 start,Vector3 end)Vector3 p1 = Vector3.zero;Vector3 p2 =

10、Vector3.zero;学 IT 技能上我学院网 学 Unity 上我学院:if(start.xend.x)/这些判断是用来确保 p1 的 xy 坐标小于 p2 的 xy 坐标,因为画的框不见得就是左下到右上这个方向的p1.x = end.x;p2.x = start.x;elsep1.x = start.x;p2.x = end.x;if(start.yend.y)p1.y = end.y;p2.y = start.y;elsep1.y = start.y;p2.y = end.y;学 IT 技能上我学院网 学 Unity 上我学院: foreach(GameObject obj in c

11、haracters)/把可选择的对象保存在 characters 数组里Vector3 location = camera.WorldToScreenPoint(obj.transform.position);/把对象的 position 转换成屏幕坐标if(location.xp2.x |location.yp2.y |location.z camera.farClipPlane)/z方向就用摄像机的设定值,看不见的也不需要选择了disselecting(obj);/上面的条件是筛选 不在选择范围内的对象,然后进行取消选择操作,比如把物体放到 default 层,就不显示轮廓线了elsese

12、lecting(obj);/否则就进行选中操作,比如把物体放到画轮廓线的层去学 IT 技能上我学院网 学 Unity 上我学院:效果如图:注意这种判定是以物体的 position 点为基准,如果物体中心不在几何中心可能会有奇怪的效果,但对作游戏来说模型中心在几何中心是基本要求,所以应该不是问题。当然也可以按照部分顶点相交来选中,但是那样程序就会复杂很多,要先解构物体的 mesh 顶点,然后把顶点变换到屏幕坐标,然后判定是否在方框范围内。实际上对大多数游戏来说划过中心点算作选中条件完全可以满足,足够有说服力了。附上一个自己作的小 Demo,综合了之前的显示边缘光、轮廓效果,按钮遮罩效果,加上框选

13、物体的效果。 鼠标左键按下画框 右键双击地面移动选中的群体 按住滚轮移动鼠标拖动地图,按住右键旋转鼠标转动视角,滚动滚轮缩放视角。学 IT 技能上我学院网 学 Unity 上我学院:语音借用的是那啥 3 的人类语音,你懂的。选择:双击右键移动目标,目标用一组粒子显示,到达目标或者目标改变时自动消失学 IT 技能上我学院网 学 Unity 上我学院:可以同时移动几组,有点像 1 代的 C;C.点按钮生成新的人物,选中按 delete 删除人物学 IT 技能上我学院网 学 Unity 上我学院:鼠标划过显示边缘光,单击目标或者画框选中目标显示轮廓线选中的目标会始终对着镜头,未选中的目标会随机行动学 IT 技能上我学院网 学 Unity 上我学院:Unity 的便利性显现无疑,基本无需复杂的几何、线代知识,也没有繁琐的外围代码,用几句判断语句搞定框选。加上所见即所得的集成开发环境,写到这样程度的 Demo 实际大概也就花了几个小时的人时,真正框选部分不超过 1 小时,有点像游戏开发的卡拉 OK,优势确实很明显。更多 Unity 教程,关注我学院网:

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号