在游戏中,点击捡起物品可以说是比较常见的需求,今天这篇博文主要就其中用到的技术做一个简单的介绍:射线检测与LayerMask
首先新建场景,在场景中新建一个Cube,并在MainCameara挂上脚本,
testRayAndLayerMask.cs
using UnityEngine;
public class testRayAndLayerMask : MonoBehaviour
{
public LayerMask layerMask;
// Use this for initialization
void Start ()
{
//layerMask = 1 << 8;
//layerMask = 1 << LayerMask.NameToLayer("Cube");
}
// Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
Debug.Log("点击");
RaycastHit raycastHit;
if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out raycastHit, 100, layerMask))
{
Debug.Log("有碰撞");
}
else
{
Debug.Log("无碰撞");
}
}
}
}
添加Layer为Cube:
把Cube的LayerMask设置为Cube
先看一下运行效果:
第一种情况:
先把脚本的LayerMask设置为Nothing
运行效果(显示无碰撞)
第二种情况:
把脚本的LayerMask设置为Cube
运行效果(显示有碰撞)
先说一下原理吧:
这里Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out raycastHit, 100, layerMask),表示对点击做射线检检测,检测长度为100,检测层为layerMask,意思是只对layerMask做射线检测
第一种情况为不对任何层作射线检测,所以返回false
第二种情况为对Cube层作射线检测,所以返回true
这里的LayerMask的设置可以用代码进行设置
//layerMask = 1 << 8; 打开下标为8的LayerMask
//layerMask = 1 << LayerMask.NameToLayer("Cube"); 打开名字为Cube的LayerMask
//layerMask = 0 << 8; 关闭下标为8的LayerMask
//layerMask = 0 << LayerMask.NameToLayer("Cube"); 关闭名字为Cube的LayerMask
这里我提供的只是一种思路,可以想象一种场景就是:只对可以捡起的物品进行点击的射线检测,那么就可以对那些物品设置一个特定的LayerMask做射线检测。
这篇博文就到这里,我们在下一期再见!