unity3d 多层级检测_unity3d 层级设置 - CSDN
  • Unity中的分层射线检测

    千次阅读 2015-12-13 00:36:57
    这是我所写的第一篇有关Unity的博文,介绍的是我最近学习uinty时遇到的一个有关射线检测的问题以及后来解决的一些思路,射线检测; if (Input.GetMouseButton(0)) { Ray ray = camera.ScreenPointToRay(Input....
    这是我所写的第一篇有关Unity的博文,介绍的是我最近学习uinty时遇到的一个有关射线检测的问题以及后来解决的一些思路,射线检测;
      if (Input.GetMouseButton(0))
            {
                Ray ray = camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitinfo;
                if (Physics.Raycast(ray, out hitinfo))
                {
                    print(hitinfo.collider.name);
                    if (hitinfo.collider.name == this.gameObject.name )
                    {
                        
                        if (dir == direction.left)
                        {
                            player.GetComponent<gamecontrol>().revolve_in_2D_left();
                        }
                        else if (dir == direction.right)
                        {
                            player.GetComponent<gamecontrol>().revolve_in_2D_right();
                        }
                    }
                }
            }
    	
    	}

    以上是我写的一个点击触发UI按钮的脚本,在这之中的ray是我们自己定义的一条射线,后面的函数则是为其定义,在这里说一下,定义射线的方法有2种,一种是使用函数ScreenPointToRay(Vector3 startposition);用这个函数定义的是一条起点为startposition,方向为摄像机过起点的方向的射线。而后面的RaycastHit类型的变量的作用是的到射线碰撞时所产生的相关信息,包括碰撞的物体的名字,刚体组件,和transform组件。有了这些我们就可以很容易的判断出射线是否碰撞到了我们的目标物体。还有一种方法是使用函数ViewportPointToRay(Vector3   postion),用这个函数定义的是一条从摄像开始,透过从相机的近裁剪面上的视口POSITION(x,y)坐标的一条射线。不过这种方法平时使用的不是很多。

    但是这种射线检测存在一个问题,就是假如当空间内的要求被物体在某些时刻被其他物体阻挡的话,就可能无法检测到被要求的物体,因为射线的终点就是被碰撞到的物体,这个时候我们就需要用到一个分层的方法,首先我们可以在layer面板上添加层级,将我们要检测的物体和不需要检测的物体放在不同的layer下面,然后我们在使用Physice.Raycast这个函数的时候可以在后面添加一个参数LayerMask型的变量mask,这种重载方法下我们的射线的检测碰撞的时候就只会检测改层的物体,而不会受到其他物体的干扰

    下面是我的样例代码:

    void Update () {
            if (Input.GetMouseButton(0))
            {
                Ray ray = camera.ScreenPointToRay(Input.mousePosition);
                RaycastHit hitinfo;
                if (Physics.Raycast(ray, out hitinfo,200,mask))
                {
                    print(hitinfo.collider.name);
                    if (hitinfo.collider.name == this.gameObject.name && (hitinfo.collider.tag == "right_button" || hitinfo.collider.tag == "left_button"))
                    {
                        
                        if (dir == direction.left)
                        {
                            player.GetComponent<gamecontrol>().revolve_in_2D_left();
                        }
                        else if (dir == direction.right)
                        {
                            player.GetComponent<gamecontrol>().revolve_in_2D_right();
                        }
                    }
                }
            }
    	
    	}


    下面是一个我自己制作的小游戏,这个游戏中的小球是会旋转的,而控制小球旋转的是2个我用射线检测的方法制作的2个UI按钮,当小球旋转到一定角度的时候,小球的位置会阻挡摄像机的射线,但是设置分层之后,就没有了这个问题,小球就不会被射线检测到

    展开全文
  • unity3d鼠标检测

    2020-07-30 23:32:31
    unity3d用户鼠标行为的检测方法和函数用法
  • [Unity3D]射线碰撞检测+LayerMask的使用

    万次阅读 2019-07-26 09:54:16
    教程请访问: ... 射线:射线是3D世界中一个点向一个... 用途:在unity中射线应用范围比较广,用于碰撞检测(如:子弹飞行是否击中目标)、角色移动 等。 相关API: 1、RayCamera.main.Sc...

    更多教程请访问:

    http://dingxiaowei.cn/

     

    射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
    用途:在unity中射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动 等。
     

    相关API:

    1、Ray Camera.main.ScreenPointToRay(Vector3 pos)   返回一条射线Ray从摄像机到屏幕指定一个点

    2、Ray Camera.main.ViewportPointToRay(Vector3 pos)  返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点

    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 (_rayout objhit100)) 
                {
                    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 << 0) 打开所有的层。

    (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 objhit100mask.value))
                {
                    GameObject gameObj = objhit.collider.gameObject;

                    Debug.Log("Hit objname:"+gameObj.name+"--Hit objlayerName:"+LayerMask.LayerToName (10));
                }
                
            }
            
        }
    }
     
     创建2个cube,一个layer设置为:cube  一个layer设置为:Default
    运行如下:
    图片

     

     

     

    展开全文
  • Unity3d OnDrop触发条件

    千次阅读 2019-07-10 15:59:29
    Unity3d OnDrop触发条件 Unity3d OnDrop触发条件 刚开始接触UGUI,把新知识记录一下 OnDrop作用 检测拖拽事件(OnDrag)放下的操作 OnDrop依赖于OnDrag,先有OnDrag后OnDrop才可能被触发 拖拽放下时如果可以检测...

    Unity3d OnDrop触发条件

    Unity3d OnDrop触发条件

    刚开始接触UGUI,把新知识记录一下

    OnDrop作用

    检测拖拽事件(OnDrag)放下的操作

    1. OnDrop依赖于OnDrag,先有OnDrag后OnDrop才可能被触发
    2. 拖拽放下时如果可以检测OnDrop事件的物体上方有其他物体遮挡住的当前物体,OnDrop事件也不会触发,因为屏幕射线被阻截了
      可以在物体上添加Canvas Group组件,去掉Blocks Raycasts属性(当前组件物体下面包括当前物体的所有子物体是否接受屏幕射线检测)的勾去掉,下面检测OnDrop事件的物体就可以正常触发了
      在这里插入图片描述
    3. OnDrop事件在OnEndDrag事件(整个拖拽事件结束时调用的函数)之前执行
      先记着以后再完善
    展开全文
  • unity3d 2d 射线检测

    千次阅读 2015-09-01 18:39:10
    Physics2D.LinecastNonAlloc 直线投射不分配内存 C# ⇒ static int LinecastNonAlloc(Vector2 start, Vector2 end, RaycastHit2D[] results, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf....

    Physics2D.LinecastNonAlloc 直线投射不分配内存
    C# ⇒ static int LinecastNonAlloc(Vector2 start, Vector2 end, RaycastHit2D[] results, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);

    start:直线在世界空间的开始点。
    end :直线在时间空间的结束点。
    results:返回与直线相交的物体数组。 返回结果的数量(int)。
    layerMask:只在某些层过滤检测碰撞器。
    minDepth:只包括Z坐标(深度)大于这个值的对象。
    maxDepth:只包括Z坐标(深度)小于这个值的对象。

    具体 实例`using UnityEngine;
    using System.Collections;

    public class test : MonoBehaviour {
    
        public Transform targetpos;//目标位置//
        RaycastHit2D [] ray;
        int hitNumber =0;//检测返回与直线相交的物体数量//
        // Use this for initialization
        void Start () 
        {
            ray=new RaycastHit2D[5] ;
        }
        void FixedUpdate()
        {
            HitTest ();
        }
         void  HitTest()
        {
            hitNumber = Physics2D.LinecastNonAlloc (gameObject.transform .position,targetpos.transform.position ,ray,1<<LayerMask.NameToLayer("GameModel"));
            for (int i = 0; i < hitNumber; i++) {
                Debug.DrawLine(gameObject.transform .position ,ray[i].transform.position,Color.red);
                print ("ray{"+i+"}.name"+ray[i].transform.name);
            }
        }
    }

    1<<LayerMask.NameToLayer("GameModel") //在哪个层显示,mask 只在”GameModel”层显示。

    这里写图片描述

    展开全文
  • Unity 3D中的射线与碰撞检测

    万次阅读 2016-09-06 22:44:46
    在进行碰撞检测时,我们最常用的工具就是射线,Unity 3D的物理引擎也为我们提供了射线类以及相关的函数接口。本文将对射线的使用进行一个总结。 射线是在三维世界中从一个点沿一个方向发射的一条无限长的线。在射线...
  • Unity层级面板

    千次阅读 2020-03-31 13:35:51
    Unity层级面板 入坑程序员也差不多一年有余了,但是一直没有养成写博客的良好习惯,这是不好滴,正好心血来潮,记录自己的一次学习心得,也供大家参考学习,大神请绕道走。 主要实现Unity中的Hierarchy层级面板...
  • Unity层级碰撞

    千次阅读 2018-09-16 23:46:50
    没有同学遇到过这种情况:在游戏开发3D游戏中很常见,比如让一个物体能...先给一个官方资料:http://docs.unity3d.com/Documentation/Components/LayerBasedCollision.html 第一步:当然在实现效果之前你要为这几...
  • Unity3d之骨骼动画

    千次阅读 2014-12-09 14:24:31
    在这个系列,我们将关注Unity引擎提供的基于骨骼动画工具。它的主要思想是为了把它应用到你自己的游戏来介绍和教基本的2D动画原理。在这节课中,我们将添加闲置,跳跃和动画。 在开始这个课程前,我们将感谢...
  • unity 3d中的射线与碰撞检测

    千次阅读 2018-03-17 12:28:14
    在网上看到一篇对射线简单梳理的文章,觉得对自己很有帮助,特此引用:原文章 射线的创建和显示 ...注意,射线的方向在设置时如果未单位化,Unity 3D会自动进行单位归一化处理。射线Ray的构造函...
  • Unity3d场景快速烘焙【2019】

    万次阅读 多人点赞 2019-12-26 19:09:28
    刚刚接触Unity3d的童鞋花了大量的时间自学,可总是把握不好Unity3d的烘焙,刚从一个坑里爬出来,又陷入另一个新的坑,每次烘焙一个场景少则几个小时,则几十个小时,机器总是处于假死机状态,半天看不到结果,...
  • Unity中的射线检测做一个记录 射线检测: 记录一下Unity中射线检测的基本用法: if (Input.GetMouseButtonDown(0)) //点击了鼠标左键 { //以主摄像机,将屏幕上的一个点转换为射线 Ray ray=Camera....
  • unity3d 射线检测RayCast

    千次阅读 2018-07-21 11:49:05
    射线检测即对一个碰撞器进行检测,这个检测是一条射线,这条射线由我们自己设置 RayCast有10个重载这里以其中一个为例 代码例子 RaycastHit hit 此为射线碰撞到的物体碰撞器, 以out hit传入 当射线碰撞到物体...
  • /// <summary> /// 是否显示玩家 /// </summary> /// <param name="isShow"></param> public void SetShowPlayer(bool isShow) { if (!isShow) { ...
  • 使用Unity3D的50个技巧:Unity3D最佳实践

    万次阅读 多人点赞 2014-09-01 09:58:21
    关于使用Unity3D的50条最佳实践。
  • Havok物理引擎与Unity3D的结合

    万次阅读 2017-07-12 22:43:53
    目前3D手游的开发主要工具是使用Unity3D引擎,于是,如何在Unity3D的开发过程中结合入物理功能变一个需要仔细考虑的问题。 我们考察的2种物理效果实现方案:Unity3D物理引擎和Havok物理引擎。 Unity3d物理引擎介绍...
  • Unity3D常见面试题

    万次阅读 多人点赞 2017-08-11 20:20:00
    Unity3D常见面试题
  • LayerMask实际上是一个位码操作,在Unity3D中一共有32个Layer层,并且不可增加。 在Unity官方中给出的描述是: Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来做射线检测时忽略...
  • 本系统主要用于自动监测与检测各类型资源是否正常及满足指定规范,并在第一时间把出现的问题输出到控制台与保存到文件,以供对应的负责人及时修正。   为什么   你可能经常遇到的问题 资源名字或路径不规范...
1 2 3 4 5 ... 20
收藏数 1,047
精华内容 418
关键字:

unity3d 多层级检测