如何让unity unity显示射线线steamvr的射线一直显示

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 1132|回复: 9
基于SteamVR_Unity_Toolkit自定义射线触发器简单结构
5722/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
蛮牛币2520
在线时间228 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
环境:HtcVive,Unity,C#,商店的SteamVR_Unity_Toolkit插件目前htc交互比较主流的还是那个实体射线交互,工具包自带的三种:GetComponent().DestinationMarkerEnterGetComponent().DestinationMarkerExitGetComponent().DestinationMarkerSet工具包自带的三种交互使用起来不太灵活,自己在VRTK_SimplePointer基础上拓展了一点功能,这里提供一个简单的例子:废话不多说直接上:/// &summary&/// 这是M,不多说/// &/summary&public class Msg_PointTrigger{& & public&&const string PointEnterMsg = &EnterTrigger&;& & public&&const string PointStayDownMsg = &PointStayDownMsg&;& & public&&const string PointStayUpMsg = &PointStayUPMsg&;& & public&&const string PointExittMsg = &ExittMsg&;& & /*& &&&* 这里只做了4种,后期可以跟进& &&&*/}1、这是Base模版,大概思路是,触发后根据消息解析做出相应处理,还是比较灵活的。public class SteamVR_PointTriggerBase : MonoBehaviour {& & //左右手柄输入器& & public SteamVR_TrackedObject rightT& & public SteamVR_TrackedObject leftT& & //左右射线头位置& & public Transform rightP& & public Transform leftP& & protected string& & /// &summary&& & /// 有响应& & /// &/summary&& & /// &param name=&msg&&&/param&& & public virtual void Trigger(string msg)& & {& && &&&this.msg =& && &&&ExplainMSg();& & }& & private&&void ExplainMSg()& & {& && &&&switch (msg)& && &&&{& && && && &case Msg_PointTrigger.PointEnterMsg :& && && && && & OnPointEnter();& && && && && & break;& && && && &case Msg_PointTrigger.PointStayDownMsg:& && && && && & OnPointStayDown();& && && && && & break;& && && && &case Msg_PointTrigger.PointStayUpMsg:& && && && && & OnPointStayUp();& && && && && & break;& && && && &case Msg_PointTrigger.PointExittMsg:& && && && && & OnExitState();& && && && && & break;& && && && &default:& && && && && & break;& && &&&}& & }& & /// &summary&& & /// 射线按下进入& & /// &/summary&& & protected virtual void OnPointEnter() { Debug.Log(&OnPointEnter&); }& & /// &summary&& & /// 射线按下且在物体上& & /// &/summary&& & protected virtual void OnPointStayDown()& &&&{& && &&&//以下时我目前根据项目加新增的,后期可以独立出来& && &&&EffectHighting.AddConstantHighting(gameObject);& && &&&if (null!=rightTracket)& && &&&{& && && && &SteamVR_Controller.Device rightDevice = SteamVR_Controller.Input((int)rightTracket.index);& && && && &if (rightDevice.GetTouch(SteamVR_Controller.ButtonMask.Trigger))& && && && &{& && && && && & Debug.Log(&右手Triger按下&);& && && && && &OnPointStayDownRightTriggerTouch();& && && && &}& && &&&}& && &&&if (null!=leftTracket)& && &&&{& && && && &SteamVR_Controller.Device leftDevice = SteamVR_Controller.Input((int)leftTracket.index);& && && && &if (leftDevice.GetTouch(SteamVR_Controller.ButtonMask.Trigger))& && && && &{& && && && && & Debug.Log(&左手Triger按下&);& && && && && & OnPointStayDownLeftTriggerTouch();& && && && &}& && &&&}& & }& & //这俩是临时加的为:当进入时左右手钩住扳机& & protected virtual void OnPointStayDownRightTriggerTouch() { }& & protected virtual void OnPointStayDownLeftTriggerTouch() { }& &&&//当射线在物体上时弹起发射线按钮& & protected virtual void OnPointStayUp() { Debug.Log(&OnPointStayUp&); }& & //退出& & protected virtual void OnExitState() {EffectHighting.ResetRemoveHightingEffect();Debug.Log(&OnExitState&); }2、使用的例子:如我写的一个控制灯的开关的功能,只需要利用其中一种就可以了:public class SteamVR_PointTriggerLights : SteamVR_PointTriggerBase{& & public bool isOn = false;& & //变色& & public void TrunColor(Color openColor, Color closeColor)& & {& && &&&if (isOn)& && &&&{& && && && &gameObject.GetComponent&MeshRenderer&().material.color = openC& && &&&}& && &&&else& && &&&{& && && && &gameObject.GetComponent&MeshRenderer&().material.color = closeC ;& && &&&}& & }& & //开关灯& & private void TurnLights(bool isOn)& & {& && &&&PointLightControler.instance.TurnLights(isOn);& & }& & protected override void OnPointEnter()& & {& && &&&base.OnPointEnter();& & }& & protected override void OnPointStayDown()& & {& && &&&base.OnPointStayDown();& & }& & protected override void OnPointStayDownRightTriggerTouch()& & {& && &&&base.OnPointStayDownRightTriggerTouch();& & }& & protected override void OnPointStayDownLeftTriggerTouch()& & {& && &&&base.OnPointStayDownLeftTriggerTouch();& & }& & //只个只用到了一种回调:当射线进入并在内部弹起后响应& & protected override void OnPointStayUp()& & {& && &&&base.OnPointStayUp();& && &&&isOn = !isOn;& && &&&TrunColor(Color.green, Color.red);& && &&&TurnLights(isOn);& && &&&Debug.Log(&OnPointStayUp&);& & }& & protected override void OnExitState()& & {& && &&&base.OnExitState();& & }}3、下面是改写的VRTK_SimplePointer,临时改的,还没有优化过,后期可以补上,思路就是利用射线检测判断一些情况的逻辑,主要是改了Update方法,附上参考一下 protected override void Update()& && &&&{& && && && &base.Update();& && && && &if (pointer.gameObject.activeSelf)& && && && &{& && && && && & RaycastHit pointerCollidedWith;& && && && && & Ray pointerRaycast = new Ray(transform.position, transform.forward);& && && && && & var rayHit = Physics.Raycast(pointerRaycast, out pointerCollidedWith, pointerLength, ~layersToIgnore);& && && && && & var pointerBeamLength = GetPointerBeamLength(rayHit, pointerCollidedWith);& && && && && & SetPointerTransform(pointerBeamLength, pointerThickness);& && && && && & //增加射线触发事件& && && && && & //是否检测到物体& && && && && & if (null!=pointerCollidedWith.collider)& && && && && & {& && && && && && &&&selectObj = pointerCollidedWith.collider.gameObject;& && && && && & }& && && && && & else& && && && && & {& && && && && && &&&/*& && && && && && && &* -------------NO1& && && && && && && &* 按下射线移出物体& && && && && && && &*/& && && && && && &&&if (null!=selectObj)& && && && && && &&&{& && && && && && && && &if (null != selectObj.GetComponent&SteamVR_PointTriggerBase&())& && && && && && && && &{& && && && && && && && && & selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointExittMsg);& && && && && && && && &}& && && && && && &&&}& && && && && && &&&selectObj = null;& && && && && && &&&canEnter = true;& && && && && & }& && && && && && && & //当检检测到物体时& && && && && & if (null != selectObj)& && && && && & {& && && && && && &&&//物体是VR交互物体& && && && && && &&&if (null != selectObj.GetComponent&SteamVR_PointTriggerBase&())& && && && && && &&&{& && && && && && && && &/*& && && && && && && && & * --------------NO2& && && && && && && && & * 射线按下Enter事件& && && && && && && && & */& && && && && && && && &if (canEnter)& && && && && && && && &{& && && && && && && && && & canEnter = false;& && && && && && && && && & if (transform.root.GetComponent&SteamVR_ControllerManager&().right.activeSelf)& && && && && && && && && & {& && && && && && && && && && &&&selectObj.GetComponent&SteamVR_PointTriggerBase&().rightTracket = transform.root.GetComponent&SteamVR_ControllerManager&().right.GetComponent&SteamVR_TrackedObject&();& && && && && && && && && && &&&selectObj.GetComponent&SteamVR_PointTriggerBase&().rightPoint = pointerTip.transform;& && && && && && && && && && &&&//Debug.Log(pointerTip.transform.position);& && && && && && && && && & }& && && && && && && && && & if (transform.root.GetComponent&SteamVR_ControllerManager&().left.activeSelf)& && && && && && && && && & {& && && && && && && && && && &&&selectObj.GetComponent&SteamVR_PointTriggerBase&().leftTracket = transform.root.GetComponent&SteamVR_ControllerManager&().left.GetComponent&SteamVR_TrackedObject&();& && && && && && && && && && &&&selectObj.GetComponent&SteamVR_PointTriggerBase&().leftPoint = pointerTip.transform;& && && && && && && && && & }& && && && && && && && && & selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointEnterMsg);& && && && && && && && &}& && && && && && && && &/*& && && && && && && && & * ------------NO3& && && && && && && && & * 射线按下Stay事件& && && && && && && && & */& && && && && && && && &selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointStayDownMsg);& && && && && && &&&}& && && && && & }& && && && &}& && && && &else& && && && &{& && && && && & if (null != selectObj)& && && && && & {& && && && && && &&&if (null != selectObj.GetComponent&SteamVR_PointTriggerBase&())& && && && && && &&&{& && && && && && && && &/*& && && && && && && && & * --------------------------NO4& && && && && && && && & * 当射线在检测物体内,弹按钮回掉& && && && && && && && & */& && && && && && && && &selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointStayUpMsg);& && && && && && && && &selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointExittMsg);& && && && && && && && &selectObj = null;& && && && && && &&&}& && && && && & }& && && && &}& && &&&}
[]: ztgg 发帖时在路边捡到 1
蛮牛币,偷偷放进了口袋.
每日推荐:
5722/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
蛮牛币2520
在线时间228 小时
坑爹的蛮牛,markdown居然不支持。。。
[]: ztgg 在网吧通宵,花了 2
每日推荐:
5722/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
蛮牛币2520
在线时间228 小时
[C#] 纯文本查看 复制代码废话不多说直接上:
/// &summary&
/// 这是M,不多说
/// &/summary&
public class Msg_PointTrigger
const string PointEnterMsg = &EnterTrigger&;
const string PointStayDownMsg = &PointStayDownMsg&;
const string PointStayUpMsg = &PointStayUPMsg&;
const string PointExittMsg = &ExittMsg&;
* 这里只做了4种,后期可以跟进
每日推荐:
5722/1000排名<font color="#FF昨日变化1主题帖子积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
熟悉之中, 积分 722, 距离下一级还需 278 积分
蛮牛币2520
在线时间228 小时
[C#] 纯文本查看 复制代码1、这是Base模版,大概思路是,触发后根据消息解析做出相应处理,还是比较灵活的。
public class SteamVR_PointTriggerBase : MonoBehaviour {
//左右手柄输入器
public SteamVR_TrackedObject rightT
public SteamVR_TrackedObject leftT
//左右射线头位置
public Transform rightP
public Transform leftP
/// &summary&
/// 有响应
/// &/summary&
/// &param name=&msg&&&/param&
public virtual void Trigger(string msg)
this.msg =
ExplainMSg();
void ExplainMSg()
switch (msg)
case Msg_PointTrigger.PointEnterMsg :
OnPointEnter();
case Msg_PointTrigger.PointStayDownMsg:
OnPointStayDown();
case Msg_PointTrigger.PointStayUpMsg:
OnPointStayUp();
case Msg_PointTrigger.PointExittMsg:
OnExitState();
/// &summary&
/// 射线按下进入
/// &/summary&
protected virtual void OnPointEnter() { Debug.Log(&OnPointEnter&); }
/// &summary&
/// 射线按下且在物体上
/// &/summary&
protected virtual void OnPointStayDown()
//以下时我目前根据项目加新增的,后期可以独立出来
EffectHighting.AddConstantHighting(gameObject);
if (null!=rightTracket)
SteamVR_Controller.Device rightDevice = SteamVR_Controller.Input((int)rightTracket.index);
if (rightDevice.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
Debug.Log(&右手Triger按下&);
OnPointStayDownRightTriggerTouch();
if (null!=leftTracket)
SteamVR_Controller.Device leftDevice = SteamVR_Controller.Input((int)leftTracket.index);
if (leftDevice.GetTouch(SteamVR_Controller.ButtonMask.Trigger))
Debug.Log(&左手Triger按下&);
OnPointStayDownLeftTriggerTouch();
//这俩是临时加的为:当进入时左右手钩住扳机
protected virtual void OnPointStayDownRightTriggerTouch() { }
protected virtual void OnPointStayDownLeftTriggerTouch() { }
//当射线在物体上时弹起发射线按钮
protected virtual void OnPointStayUp() { Debug.Log(&OnPointStayUp&); }
protected virtual void OnExitState() {EffectHighting.ResetRemoveHightingEffect();Debug.Log(&OnExitState&); }
2、使用的例子:
如我写的一个控制灯的开关的功能,只需要利用其中一种就可以了:
public class SteamVR_PointTriggerLights : SteamVR_PointTriggerBase
public bool isOn =
public void TrunColor(Color openColor, Color closeColor)
gameObject.GetComponent&MeshRenderer&().material.color = openC
gameObject.GetComponent&MeshRenderer&().material.color = closeC ;
private void TurnLights(bool isOn)
PointLightControler.instance.TurnLights(isOn);
protected override void OnPointEnter()
base.OnPointEnter();
protected override void OnPointStayDown()
base.OnPointStayDown();
protected override void OnPointStayDownRightTriggerTouch()
base.OnPointStayDownRightTriggerTouch();
protected override void OnPointStayDownLeftTriggerTouch()
base.OnPointStayDownLeftTriggerTouch();
//只个只用到了一种回调:当射线进入并在内部弹起后响应
protected override void OnPointStayUp()
base.OnPointStayUp();
isOn = !isOn;
TrunColor(Color.green, Color.red);
TurnLights(isOn);
Debug.Log(&OnPointStayUp&);
protected override void OnExitState()
base.OnExitState();
3、下面是改写的VRTK_SimplePointer,临时改的,还没有优化过,后期可以补上,思路就是利用射线检测判断一些情况的逻辑,主要是改了Update方法,附上参考一下
protected override void Update()
base.Update();
if (pointer.gameObject.activeSelf)
RaycastHit pointerCollidedW
Ray pointerRaycast = new Ray(transform.position, transform.forward);
var rayHit = Physics.Raycast(pointerRaycast, out pointerCollidedWith, pointerLength, ~layersToIgnore);
var pointerBeamLength = GetPointerBeamLength(rayHit, pointerCollidedWith);
SetPointerTransform(pointerBeamLength, pointerThickness);
//增加射线触发事件
//是否检测到物体
if (null!=pointerCollidedWith.collider)
selectObj = pointerCollidedWith.collider.gameO
* -------------NO1
* 按下射线移出物体
if (null!=selectObj)
if (null != selectObj.GetComponent&SteamVR_PointTriggerBase&())
selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointExittMsg);
selectObj =
canEnter =
//当检检测到物体时
if (null != selectObj)
//物体是VR交互物体
if (null != selectObj.GetComponent&SteamVR_PointTriggerBase&())
* --------------NO2
* 射线按下Enter事件
if (canEnter)
canEnter =
if (transform.root.GetComponent&SteamVR_ControllerManager&().right.activeSelf)
selectObj.GetComponent&SteamVR_PointTriggerBase&().rightTracket = transform.root.GetComponent&SteamVR_ControllerManager&().right.GetComponent&SteamVR_TrackedObject&();
selectObj.GetComponent&SteamVR_PointTriggerBase&().rightPoint = pointerTip.
//Debug.Log(pointerTip.transform.position);
if (transform.root.GetComponent&SteamVR_ControllerManager&().left.activeSelf)
selectObj.GetComponent&SteamVR_PointTriggerBase&().leftTracket = transform.root.GetComponent&SteamVR_ControllerManager&().left.GetComponent&SteamVR_TrackedObject&();
selectObj.GetComponent&SteamVR_PointTriggerBase&().leftPoint = pointerTip.
selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointEnterMsg);
* ------------NO3
* 射线按下Stay事件
selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointStayDownMsg);
if (null != selectObj)
if (null != selectObj.GetComponent&SteamVR_PointTriggerBase&())
* --------------------------NO4
* 当射线在检测物体内,弹按钮回掉
selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointStayUpMsg);
selectObj.GetComponent&SteamVR_PointTriggerBase&().Trigger(Msg_PointTrigger.PointExittMsg);
selectObj =
[]: 一个袋子砸在了 ztgg 头上,ztgg 赚了 1
每日推荐:
3229/300排名<font color="#FF昨日变化5主题帖子积分
偶尔光临, 积分 229, 距离下一级还需 71 积分
偶尔光临, 积分 229, 距离下一级还需 71 积分
在线时间33 小时
每日推荐:
3282/300排名<font color="#FF昨日变化11主题帖子积分
偶尔光临, 积分 282, 距离下一级还需 18 积分
偶尔光临, 积分 282, 距离下一级还需 18 积分
在线时间223 小时
这个真的6 最近一直在研究 射线与物体交互
[]: Sivona 乐于助人,奖励 2
每日推荐:
61415/1500排名<font color="#FF昨日变化1主题帖子积分
蛮牛粉丝, 积分 1415, 距离下一级还需 85 积分
蛮牛粉丝, 积分 1415, 距离下一级还需 85 积分
蛮牛币2873
在线时间569 小时
非常好!!!
[]: 一个袋子砸在了 ycmanniu 头上,ycmanniu 赚了 1
每日推荐:
4464/500排名<font color="#FF昨日变化主题帖子积分
四处流浪, 积分 464, 距离下一级还需 36 积分
四处流浪, 积分 464, 距离下一级还需 36 积分
在线时间162 小时
最近一直在研究 射线与物体交互
每日推荐:
3182/300排名<font color="#FF昨日变化4主题帖子积分
偶尔光临, 积分 182, 距离下一级还需 118 积分
偶尔光临, 积分 182, 距离下一级还需 118 积分
在线时间45 小时
看你这个帖子真费劲
[]: lzklzklzk 捡了钱没交公 蛮牛币 降了 1
每日推荐:
4417/500排名<font color="#FF昨日变化2主题帖子积分
四处流浪, 积分 417, 距离下一级还需 83 积分
四处流浪, 积分 417, 距离下一级还需 83 积分
在线时间163 小时
感谢楼主的方法,对我有很大的帮助
每日推荐:
Facebook相关行业专家现场解析国外游戏市场现状及开发者游戏出海大方向。Unity3D 射线指定层获取GameObject 注意 - CSDN博客
Unity3D 射线指定层获取GameObject 注意
这一篇是纯技术讨论,看过我前面文章的童鞋应该清楚,我的奔跑是靠鼠标响应的,鼠标点到哪就跑到哪,后来又有了界面,麻烦就来了,我的界面竟然能点 穿,我不希望点界面的时候还能点到界面后面的地面上,角色傻不拉几的往那跑,那肿么办呢,总不能每次点击都要判断点击的物体名称吧,那界面多了会累死的, 好在我们有标签和层这两个神器,所以我这里介绍两种方案,都能达到效果。
方案一:利用标签(Tag)拦截射线消息。
每个GameObject的Inspector面板最上方都有个Tag选项,也就是说我们可以给所有的物体加个标签,Unity3d已经默认有了几 个标签,这里我们可以自定义个UI的标签,然后把所有UI都用这个标签。点击Tag右方的选项,选Add Tag,Size调成2,Element 0的&#20540;改成UI。
然后你所有不想被点穿的UI都选成这个标签。
除了设置标签,还有一点很重要,就是界面要加碰撞器Collider,有的UI默认就有碰撞器,比如NGUI的按钮,你可以看到有一个Box Collider,如果没有的你就要自己加了,Size那里要调成这个UI的尺寸:
这样UI才能接收射线碰撞,然后代码可以这样写:
Ray&ray1&=&nguiCamera.camera.ScreenPointToRay(Input.mousePosition);&&
RaycastHit&hit1;&&
if&(Physics.Raycast(ray1,&out&hit1))&{&&
&&&&if&(hit1.collider.gameObject.tag&==&&UI&)&&
&&&&&&&&return;&&
上面的nguiCamera是获取的NGUI下的Camera,因为是这个Camera发出的射线与UI的碰撞,而不是Main Camera,这点要注意。其他的不解释了,很简单,自己看。
方案二、利用层(Layer)拦截射线消息
每个GameObject的Inspector面板最上方都也有个Layer选项,就在Tag旁边,unity3d已经有了几个层,我们新建个层, 也叫UI,点击Add Layer,可以看到从Layer0到Layer7都灰掉了,那是不能用的,从第八个起可以用,所以在第八个建个UI的层。
然后我们看一下Physics的Raycast的参数:
static function&Raycast&(ray&:&,&out
hitInfo&:&,&distance&:
float =&,&layerMask&:
int = kDefaultRaycastLayers) : bool
一般情况下我们只用前两个参数,distance表示射线距离,默认是无限远,重点是最后一个参数layerMask,专门处理layer过滤的,是个整型,怎么用呢,是靠layer的二进制位来操作的,看下面代码就清楚了:
Ray&ray1&=&nguiCamera.camera.ScreenPointToRay(Input.mousePosition);&&
RaycastHit&hit1;&&
LayerMask&mask&=&1&&&&LayerMask.NameToLayer(&UI&);&&
if&(Physics.Raycast(ray1,&out&hit1,&600,&mask.value))&{&&
&&&&return;&&
LayerMask的NameToLayer是通过层的名称返回该层的索引,这里是8,然后1&&8换算成LayerMask&#20540;,再用LayerMask的value就可以了。
注意也必须设置collider才能接收碰撞,这里才能判断到。
我这里提供了两个方案,如果有其他方案的欢迎留言,谢谢。
笔者补充内容:
&如果是在代码中自己创建GameObject指定Layer的方法和获取Layer进行射线的注意地方。
如下创建一个GameObject:
&&&&&&&&&&GameObject _newObj = new GameObject();
&&&&&&&&&&&&_newObj.layer = LayerMask.NameToLayer(&CommObj&); //指定Layer
&&&&&&&&&&&&_newObj.name = &Terrain0_Grass&;
&&&&&&&&&&&&print(LayerMask.NameToLayer(&CommObj&));
&&&&&&&&&&&&BoxCollider _collider = _newObj.GetComponent();
&&&&&&&&&&&&_collider = _collider == null ? _newObj.AddComponent() : _
&&&&&&&&&&&&_collider.center = Vector3.
&&&&&&&&&&&&_collider.size = new Vector3(10f, CommonDef.Layer0_Terrain_Grass, 10f);
&&&&&&&&&&&&MeshFilter _meshFilter = _newObj.GetComponent();
&&&&&&&&&&&&_meshFilter = _meshFilter == null ? _newObj.AddComponent() : _meshF
&&&&&&&&&&&&Mesh _mesh = ModelResManager.AddTerrainGrassMesh(10, 10);
&&&&&&&&&&&&_meshFilter.mesh = _
&&&&&&&&&&&&MeshRenderer _meshRender = _newObj.GetComponent();
&&&&&&&&&&&&_meshRender = _meshRender == null ? _newObj.AddComponent() : _meshR
&&&&&&&&&&&&//指向父子节点关系,只需指定其位置组件父子关系;
&&&&&&&&&&&&GameObject _subObj = GameObject.CreatePrimitive(PrimitiveType.Cube);
&&&&&&&&&&&&_subObj.transform.parent = _newObj.
以上是创建一个GameObject,赋上Collider组件用于射线碰撞检测,以下是获取指定Layer射线的方法:
&&&&&&&&&&LayerMask mask = 1 && LayerMask.NameToLayer(&CommObj&);
&&&&&&&&&&Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
&&&&&&&&&&RaycastHit _hitI
&&&&&&&&&&if (Physics.Raycast(ray, out _hitInfo, 1000f,&mask.value))
&&&&&&&&&&{
&&&&&&&&&&&&&m_currSelectObj = _hitInfo.collider.gameO
&&&&&&&&&&&&&m_mouseMovePos = _hitInfo.
&&&&&&&&&}
黑体字为获取指定Layer的mask&#20540;,用于射线检测。
本文已收录于以下专栏:
相关文章推荐
导引:因为项目中难免要多次进行获取子对象或者子对象的集合,所以写一个单独的类,用来做这些操作。然后再实际的项目中,只需要使用 transform 或者 gameobject
调用这些方法就可以快速的...
Unity3D获取两个GameObject间距
var a : GameO
var b : GameO
//a,b分别定义两个公共GameObject对象
functio...
转载自:/neverdie/p/3790879.html?utm_source=tuicool&utm_medium=referral
作者:王选易,...
一对多的观察者模式机制有什么缺点?
如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:在Unity中使用事件/委托机制(event/delegate)进行...
在unity3d5.0中 renderer后面不能使用material
需要通过GetComponent来获取组件所以代码应该这样写:using System.C
今天忽然想到这样的问题,我将一个GameObject作为参数传入,在函数内直接更改它。那么它应该是值传递还是引用传递呢?
GameObject是Unity中一个很重要的角色。对GameObject学习能够让我们更好的进行Unity开发,今天我们就来学习一下GameObject这个概念
【狗刨学习网】
Unity3D重要模块的类图
Unity3D是一个Component-Based的游戏引擎,并且为GamePlay Progrmmer提供了很多游戏性层上的支持。比如可以在图形界...
Unity3d使用脚本自如编辑GameObject在工作中,发现想对Scene内的Object进行程序化编辑,例如当一个父对象的中心感官上并不是这个物体的中心时,我们想对所有的子对象的transfor...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 unity3d 射线检测 的文章

 

随机推荐