0%

Unity2D - 射线

Debug.DrawLine

官方API说明

由于射线不可见, 所以测试时可以使用DrawLine绘制辅助线.
描述:在指定的起始点与结束点之间绘制一条直线

public static void DrawLine(
    Vector3 start, 
    Vector3 end
);

public static void DrawLine(
    Vector3 start, 
    Vector3 end, 
    Color color
);

public static void DrawLine(
    Vector3 start, 
    Vector3 end, 
    Color color, 
    float duration
);

public static void DrawLine(
    Vector3 start, 
    Vector3 end, 
    [Internal.DefaultValue("Color.white")] Color color, 
    [Internal.DefaultValue("0.0f")] float duration, 
    [Internal.DefaultValue("true")] bool depthTest
);
star世界空间中的点作为该直线的起始点
end世界空间中的点作为该直线的结束点
color该直线的颜色
duration该直线的可见长度应为多长
depthTest该直线是否应被靠近此摄像机的对象遮挡

duration是在第一次显示该直线后该直线可见的时间长短(单位为秒). 如果持续时间为零, 则该直线仅显示一帧.

1
2
3
4
// 辅助线可视化
Debug.DrawLine(transform.position, transform.up * 15, Color.green);
// 游戏对象自旋转, rotateSpeed(旋转速度): float变量.
transform.Rotate(0, 0, rotateSpeed * Time.deltaTime);

Time.deltaTime:当前帧和上一帧之间的时间
transform.right:世界空间中变换的红轴; 旋转游戏对象时, 表示游戏对象的X轴的红色箭头也会改变方向.
transform.Up:世界空间中变换的绿轴; 旋转游戏对象时, 表示游戏对象的Y轴的红色箭头也会改变方向.

Vector3
back用于编写Vector3(0, 0, -1)的简便方法.
forward用于编写Vector3(0, 0, 1)的简便方法.
up用于编写Vector3(0, 1, 0) 的简便方法.
down用于编写Vector3(0, -1, 0)的简便方法.
left用于编写Vector3(-1, 0, 0)的简便方法.
right用于编写Vector3(1, 0, 0)的简便方法.
one用于编写Vector3(1, 1, 1)的简便方法.
zero用于编写Vector3(0, 0, 0)的简便方法.

Physics2D.Raycast

官方API说明

用来向场景中的碰撞体投射射线;
描述:从概念上说, 射线投射类似于从空间中的某个点朝特定方向发射一条光束. 在该过程中, 可以检测并报告与光束接触的任何对象.

public static RaycastHit2D Raycast(
    Vector2 origin, 
    Vector2 direction
);

public static RaycastHit2D Raycast(
    Vector2 origin, 
    Vector2 direction, 
    float distance
);

public static RaycastHit2D Raycast(
    Vector2 origin, 
    Vector2 direction, 
    float distance, 
    int layerMask
);

public static RaycastHit2D Raycast(
    Vector2 origin, 
    Vector2 direction, 
    float distance, 
    int layerMask, 
    float minDepth
);

public static RaycastHit2D Raycast(
    Vector2 origin, 
    Vector2 direction, 
    [Internal.DefaultValue("Mathf.Infinity")] float distance, 
    [Internal.DefaultValue("DefaultRaycastLayers")] int layerMask, 
    [Internal.DefaultValue("-Mathf.Infinity")] float minDepth, 
    [Internal.DefaultValue("Mathf.Infinity")] float maxDepth
);
origin射线在2D空间中的起点
direction表示射线方向的矢量
distance射线的最大投射距离
layerMask过滤器, 用于仅在特定层上检测碰撞体.
minDepth仅包括Z坐标(深度)大于或等于该值的对象.
maxDepth仅包括Z坐标(深度)小于或等于该值的对象.

该函数返回一个RaycastHit2D对象, 该对象引用了射线命中的碰撞体(如果未命中任何对象, 则结果的碰撞体属性将为NULL).

当该对象添加了Collider 2D组件时, 射线会探测自身的碰撞体. 需进行设置:

1
Physics2D.queriesStartInColliders = false;

LayerMask

官方API说明

描述:指定要在Raycast中使用的层
GameObject最多可以使用Editor支持的32个LayerMask. 这些Layers中的前8个Unity指定; 以下24个可由用户控制.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
RaycastHit2D hitInfo;
// 3:探测Mask给定的层; 4 6:探测Default层; 5:探测Default之外的层; maxDistance(探测最大距离): float变量.
//optional 1:
hitInfo= Physics2D.Raycast(transform.position, transform.up);
//optional 2:
hitInfo = Physics2D.Raycast(transform.position, transform.up, maxDistance);
//optional 3:
hitInfo = Physics2D.Raycast(transform.position, transform.up, maxDistance, mask);
hitInfo = Physics2D.Raycast(transform.position, transform.up, maxDistance, mask.value);
hitInfo = Physics2D.Raycast(transform.position, transform.up, maxDistance, 256); //2^8(第8层)
//optional 4:
hitInfo = Physics2D.Raycast(transform.position, transform.up, maxDistance, LayerMask.GetMask("Default"));
//optional 5:
hitInfo = Physics2D.Raycast(transform.position, transform.up, maxDistance, ~LayerMask.GetMask("Default"));
//optional 6:
hitInfo = Physics2D.Raycast(transform.position, transform.up, maxDistance, 1 << LayerMask.NameToLayer("Default")); //左移运算符:需要移位的数字 << 移位次数

value:将层遮罩值转换为整数值

public static int GetMask(
    params string[] layerNames
);

public static string LayerToName(
    int layer
);

public static int NameToLayer(
    string layerName
);

RaycastHit2D

官方API说明

描述:在2D物理中, 有关射线投射检测到的对象的返回信息.

centroid用于执行投射的图元的质心
collider射线命中的碰撞体
distance从射线原点到撞击点的距离
fraction射线上发生命中的距离的分数
normal射线命中的表面的法线矢量
point世界空间中射线命中碰撞体表面的点
rigidbody附加到命中的对象的Rigidbody2D
transform命中的对象的变换
-------------------本文结束 感谢阅读-------------------