unity3d 光源穿透墙壁碰撞问题,怎么能不穿透

【求助】Unity3d 碰撞问题,怎么能不穿透?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:62,641贴子:
【求助】Unity3d 碰撞问题,怎么能不穿透?收藏
Unity3d 碰撞问题,我做一个小赛车游戏,可是赛车接触到护栏时,会直接冲出去,如果速度慢的话可以,如果一直顶着撞,就出现抖动,求解决方法。
达内unity3d培训全程&实战教学&,unity3d专家讲师授课.免费unity3d课程试听中!到达内unity3d学院学习unity3d,只需4个月速成unity3d游戏工程师.
加刚体应该不穿透
碰撞体加厚,还有mesh collider容易穿透,慎用。
速度太快就会穿透,同求
Collider+Rigidbody
1,增加最高速度限制2,加厚collider3,用Physics.Raycast 判断但这样也只能减少穿透的概率,某种情况下还是会穿
物理引擎或者涉及到碰撞的位置移动都放到fixedupdate里面去处理,注意fixed timestep如果太大也会出现碰撞失效,还有就是楼上说的可以加大碰撞盒
我之前也遇到这个问题了。。而且如果速度快的话 如果遇见上高点的阶梯 还会有半个车身在地面之下、
网上找了几个说是护栏的碰撞加的不对
但是试了几次,找了好久没找到根本原因。
坐等大神解决。!!!
实现不嵌入1、加大触发范围2、记录触发时刻位置3、用**Stay()重置到指定位置实现不抖动1、禁用触发抖动产生的事件(比如禁用按钮,禁用Update里的某个调用)
istrriger不用勾
unity3d千锋VR培训0元入学,「高薪」就业!「预约申请2周免费试学」.火爆预约中!千锋VR培训,招生限大专以上学历,年龄30岁以下,符合条件即可报名,入学即签订就业协议!
一定会穿,因为更新的时候是用基础速度*时间,很有可能这个结果计算出来的时候车已经冲过了墙了,自然碰不到
rigidbody里的collision detection 改为连续动态试试
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或1143人阅读
Unity3D(39)
参考资料:
今天终于碰到了 资料1 里所说的点透问题(刚开始开到的时候没明白什么意思),重新再看了一下,又了解了一下相关知识(UICamera),今天又学到东西了。
基本知识上面参考资料里的都一样,只是根据我的实际问题总结汇总了一下。
1。当点击UIButton时,鼠标会透过button点到地面,人物会移动;
2。点击UIbutton弹出背包弹窗,点击弹窗边缘,人物也会移动。
解决办法:
1.给所有NGUI 物体对象都添加BoxCollider,并勾选 isTrigger,这样才能触发碰撞;
2.添加一个全局类 在Update()里 时时 检测碰撞,代码如下:
void Update()
if(HitTestUI())
//如果鼠标碰到了NGUI对象,则人物不能移动
private bool HitTestUI()
/********以下两种判读都可以*******/
//如果在主Camer上也挂一个UICamera,这两种判读会一直返回真(为什么呢???)
//如果有碰到NGUI对象,返回真
if(UICamera.hoveredObject != null) { }
print(&UICamera.Raycast___& + UICamera.Raycast(Input.mousePosition));
//如果从UICamer到当前鼠标位置的射线碰到了NGUI对象,返回真
//if(UICamera.Raycast(Input.mousePosition)) { }
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:11788次
排名:千里之外
转载:40篇
(2)(2)(1)(2)(1)(17)(18)移动页面点击穿透问题解决方案 | 黯羽轻扬
欢迎支持ayqy个人订阅号,每周义务推送1篇(only unique one)原创精品博文[Unity3D]射线碰撞检测+LayerMask的使用&转
射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射&。
用途:在unity中射线应用范围比较广,&多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动
1、Ray&Camera.main.ScreenPointToRay(Vector3&pos)&&&返回一条射线从摄像机到屏幕指定一个点
2、Ray&Camera.main.ViewportPointToRay(Vector3&pos)&&返回一条射线从摄像机到视口(视口之外无效)指定一个点
3、Ray&射线类&
4、RaycastHit&光线投射碰撞信息
5、bool&Physics.Raycast(Vector3&origin,&Vector3&direction,&float&distance,&int&layerMask)
& 当光线投射与任何碰撞器交叉时为真,否则为假。
&&bool&Physics.Raycast(Ray&ray,&Vector3&direction,&RaycastHit&out&hit,&float&distance,&int&layerMask)
& 在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。
&&bool&Physics.Raycast(Ray&ray,&float&distance,&int&layerMask)
& 当光线投射与任何碰撞器交叉时为真,否则为假。
&&bool&Physics.Raycast(Vector3&origin,&Vector3&direction,&RaycastHit&out&hit,float&distance,&int&layerMask)
& 当光线投射与任何碰撞器交叉时为真,否则为假。
&&注意:如果从一个球型体的内部到外部用光线投射,返回为假。
& 参数理解:
  origin&:&在世界坐标中射线的起始点
  direction:&射线的方向
  distance:&射线的长度
  hit:&使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。&
  layerMask:&只选定Layermask层内的碰撞器,其它层内碰撞器忽略。&选择性的碰撞
6、RaycastHit[]&RaycastAll(Ray&ray,&float&distance,&int&layerMask)
&&&投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。
列子如下:
using&UnityEngine;
using&System.Collections;
public&class&RayTest&:&MonoBehaviour&{
&&&&//&Use&this&for&initialization
&&&&void&Start&()
&&&&&&&&mainCrma&=&Camera.main;
&&&&private&Camera&mainCrma;
&&&&private&RaycastHit&objhit;
&&&&private&Ray&_ray;
&&&&void&Update&()&
&&&&&&&&if&(Input.GetMouseButtonDown(0))&
&&&&&&&&&&&&_ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
&&&&&&&&&&&&Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//显示一条射线,只有在scene视图中才能看到
&&&&&&&&&&&&if&(Physics.Raycast&(_ray,&out&objhit,&100))&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&GameObject&gameObj&=&objhit.collider.gameObject;
&&&&&&&&&&&&&&&&Debug.Log("Hit&objname:"+gameObj.name+"Hit&objlayer:"+gameObj.layer);
&&&&&&&&&&&&}
layerMask参数:&&
Raycast (ray :
Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity,
layerMask : int = kDefaultRaycastLayers)
其实很简单:1 &&
10&&打开第10的层。
~(1 && 10)
打开除了第10之外的层。
打开所有的层。
(1 && 10) |
(1 && 8) 打开第10和第8的层。
列子如下:using&UnityEngine;
using&System.Collections;
public&class&LayerMaskTest&:&MonoBehaviour&{
&&&&//&Use&this&for&initialization
&&&&void&Start&()&
&&&&&&&&mainCrma&=&Camera.main;
&&&&&&&&mask&=&1&&(&LayerMask.NameToLayer("cube"));//实例化mask到cube这个自定义的层级之上。
&&&&//private&LayerMask&mask&1&&10;
&&&&private&LayerMask&mask;
&&&&private&Camera&mainCrma;
&&&&private&RaycastHit&objhit;
&&&&private&Ray&_ray;
&&&&void&Update&()&
&&&&&&&&if&(Input.GetMouseButtonDown(0))&
&&&&&&&&&&&&_ray=mainCrma.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标
&&&&&&&&&&&&Debug.DrawLine(_ray.origin,objhit.point,Color.red,2);//划出射线,只有在scene视图中才能看到
&&&&&&&&&&&&if&(Physics.Raycast&(_ray,out&objhit,&100,&mask.value))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&GameObject&gameObj&=&objhit.collider.gameObject;
&&&&&&&&&&&&&&&&Debug.Log("Hit&objname:"+gameObj.name+"--Hit&objlayerName:"+LayerMask.LayerToName&(10));
&&&&&&&&&&&&}
&&&&&&&&&&&&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。2783人阅读
Unity 3D(145)
当我用Unity3D自带的人物与代码是碰撞正常进行(即人物不能穿过墙),而当我换成自己的代码(控制前进后退,屏蔽了系统自带的代码)控制系统自带的人物时,这个人物表示毫无压力的就穿过了墙,请问这是怎么回事呀?求解释。我是新手还请大侠们赐教呀~~(分不多了,交流)这是前进代码,后退、向左向右差不多的。
你创建的墙应该是用Cube创建的吧,cube自带Box collider属性(unity3d的first person controller也带有)。如果你想自己创建的人物也能检测碰撞,随便加入一种碰撞都可以,盒碰撞·球碰撞·胶囊碰撞……加入方法:选中自己创建的人物,菜单栏中的“component&-----&physics&----&box collider(盒碰撞)&。还有你写的向前行走的代码:Vector3.forward*Time.deltaTime*Speed,加入time.deltatime 后运行起来不会产生帧的闪烁。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:771291次
积分:9921
积分:9921
排名:第1378名
原创:195篇
转载:291篇
评论:73条
难度:中级
类型:实战教学
难度:中级
类型:技术教程
难度:中级
类型:技术教程
(10)(5)(1)(2)(2)(1)(1)(1)(1)(98)(1)(1)(1)(1)(1)(1)(8)(7)(67)(82)(11)(1)(15)(3)(2)(8)(5)(1)(5)(10)(37)(34)(22)(10)(6)(3)(2)(8)(1)(3)(7)}

我要回帖

更多关于 unity3d 射线穿透 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信