文档章节

Unity 射线碰撞检测

Lohanry
 Lohanry
发布于 2016/12/21 00:27
字数 439
阅读 335
收藏 0

项目起因:

前段时间项目需要完成一个点击,拖动,缩放功能。并没有使用Ngui或者Ugui自带的手势识别的功能,是直接在Update中处理了这些事务。但是后来根据项目需求添加了一个按钮(其实为一个Sprite),发现点击事件与按钮的事件是相互冲突的。原因应该是Update是获取的屏幕的事件是和按钮同级别的,所以需要修改。最后使用的是射线碰撞检测。

1.射线检测原理:

  • 获取屏幕点击点的位置
  • 从主摄像机作出射线到屏幕点击点
  • 使用RayCast函数计算

2.代码实现:

首先对需要被检测的物体添加碰撞器。

Ray buttonRay;
RaycastHit myRayHit
void Update(){
    if (Input.touches.Count > 0 && Input.GetTouch(0).phase == TouchPhase.Ended) {
        //如果场景中存在多个摄像头,需要定义是哪个Camera。一般是用UI的那个。
        buttonRay = Camera.main.ScreenPointToRay (Input.GetTouch(0).position); 
        //用来划线
        //Debug.DrawLine (buttonRay.origin, myRayHit.point, Color.red, 2); 
 	    if (Physics.Raycast(buttonRay, out myRayHit){
 	        //这里可以通过myRayHit来获取碰撞到的东西。
 	        Debug.Log ("按钮");
        }else{
            Debug.Log ("点击");
        }
}

3.关键函数:

从摄像头到position的射线: {% highlight c# %} public Ray ScreenPointToRay(Vector3 position); {% endhighlight %}

检测在这个射线中碰撞到碰撞器

/*
Returns bool
bool True if the ray intersects with a Collider, otherwise false.
*/
public static bool Raycast(
        Vector3 origin, 
        Vector3 direction, 
        float maxDistance = Mathf.Infinity, 
        int layerMask = DefaultRaycastLayers, 
        QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

4.总结:

事实上射线碰撞也可以用在游戏中物体的拾取判断,这里原理是一样的我就不做例子了。对于手势的处理我觉得不应该放在update中处理,应该好好利用NGUI这些插件。当然多懂些原理也并没有什么坏处。

© 著作权归作者所有

Lohanry

Lohanry

粉丝 6
博文 10
码字总数 11765
作品 1
宁波
程序员
私信 提问
日常小节----unity小坑记(射线检测固定层级)

unity中射线检测需设定所需层级时,必须加上距离!!! //一条从主相机到屏幕点击点的射线 Ray ray = Camera.Main.ScreenPointToRay(Input.mousePosition); RaycastHit hit; //发射一条射线返...

秋叶逝水
06/08
0
0
关于UNITY学习,给新生建议

没有不可能,只有不努力。 本人自学UNITY,实力不敢称最好,但绝对不是小白,自己独立做出过游戏,AR。(用C#) 1、 导入模型一定要注意坐标,否则会很麻烦。本人因为这个吃了很多盐 2、 学u...

ちょうご
03/19
0
0
Hierarchy视图里的Transform和Camera组件

Hierarchy视图里的Transform和Camera组件 在Hierarchy视图里,选中Camera,然后在Inspector视图里查看其各组件,如图1-8所示。对于Transform和Camera组件,对于使用过Unity的读者来说再熟悉不...

大学霸
2015/04/10
72
0
【Unity3D基础概念】给初学者看的Unity概览(一):GameObject,Compoent,Time,Input,Physics

点击进入我的新博客 作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明。如果你喜欢这篇文章,请点推荐。谢谢! Unity3D重要模块的类图 最近刚刚完成了一个...

王选易
2014/05/29
1K
0
unity ray和line射线检测

RaycastHit 光线投射碰撞 Struct Structure used to get information back from a raycast. 用来获取从raycast函数中得到的信息反馈的结构。 参见:Physics.Raycast, Physics.Linecast, Phys......

小辉歌
01/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《JAVA核心知识》学习笔记 (21. JAVA 算法)

21. JAVA 算法

Shingfi
2分钟前
0
0
redis 命令

redis 秒杀用到的 原子锁 :$redis->decr('jili_reward_goods_stock_' . $gifts_id) redis 秒杀用到的原子锁在秒杀过程中库存量增加 $redis->incrBy('key1', 10); redis 键查看重复:$redis-......

小小小壮
2分钟前
0
0
像智能手机一样管理云端应用:阿里云联合微软全球首发开放应用模型(OAM)

2019 年 10 月 17 日上午 9 点 15 分,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟在 QCon 上海《基于云架构的研发模式演进》主题演讲中,正式宣布: “今天,我们同微软联合发布...

阿里巴巴云原生
11分钟前
0
0
SpringBoot配置数据源

默认数据源 Springboot默认支持4种数据源类型,定义在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 中,分别是: org.apache.tomcat.jdbc.pool.DataSource......

Gx_ww
14分钟前
0
0
Java应用在docker环境配置容器健康检查

在《极速体验docker容器健康》一文已体验了docker容器健康检查功能,今天就来给java应用的容器加入健康检查,使应用的状态随时都可以被监控和查看。 实战环境信息 操作系统:macOS Catalina ...

程序员欣宸
16分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部