unity3d射线的原理,基础⽤法
射线:射线是3D世界中⼀个点向⼀个⽅向发射的⼀条⽆终点的线,在发射轨迹中与其他物体发⽣碰撞时,它将停⽌发射。
Ray射线类和RaycastHit射线投射信息类是射线中常⽤的两个⼯具类。
⽤途:射线多⽤于碰撞检测(如:射击游戏⾥是否击中⽬标)、⾓⾊移动、判断是否触碰到3D世界中的哪些物体对象,进⽽操作等。
基础API:
Ray 射线类 :【使⽤⿏标拾取或者判断⼦弹是否碰到對象,需要往特定⽅向发射射线。⽅向可能是世界坐标中的⼀个⽮量⽅向,或屏幕上某⼀点。针对后者,提供了两个API,如下:】
1、Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回⼀条射线Ray从摄像机的近⼝點nearClip到屏幕指定⼀个点;若射线未碰撞到物体[需要含有碰撞器组件],碰撞点hit.point的值是(0,0,0);pos:利⽤实际像素值表⽰射线到屏幕上的位置。pos的x或者y分量由0增到最⼤值,射线將由⼀边移到另⼀边。但pos是在屏幕上,故z分量始终是0;
2、Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回⼀条射线Ray从摄像机到视⼝(视⼝之外⽆效)指定⼀个点;pos:⽤單位化⽐例值的⽅式表⽰射线到屏幕上的位置。
RaycastHit 光线投射碰撞信息:
1、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
射线与碰撞器发⽣碰撞时返回真,否则未穿过任何碰撞器则返回false。【origin:在世界坐标中射线起点;direction:射线的⽅向⽮量;distance:射线长度,即起点到设定的终点的距离,默认是⽆限长;layerMask:显⽰层掩码,指定层次的碰撞器碰撞,其他层次的碰撞則会被忽略掉。】
2、 bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
在场景中投下可与所有碰撞器碰撞的⼀条光线,并返回碰撞的信息,包括位置等的信息。
3、 bool Physics.Raycast(Ray ray, float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
4、 bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
当光线投射与任何碰撞器交叉时为真,否则为假。
注:如果从⼀个球型体的内部到外部⽤光线投射,返回为假。
distance: 射线的长度
hit: 使⽤c#中out关键字传⼊⼀个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。选择性的碰撞
5、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
投射⼀条光线并返回所有碰撞,也就是投射光线并返回⼀个RaycastHit[]结构体。
6、layerMask:共有32個层,对应使⽤⼀个32位整数的个位來表⽰每个层级,这个位为1⽰使⽤该层,為0表⽰不使⽤该层。
将代码直接拖拽到主相机上,或者其他对象⾝上:
using UnityEngine;
using System.Collections;
public class RayTest : MonoBehaviour {
void Start () {
}
void Update ()
{
if(Input.GetMouseButton(0))
{
Ray ray = Camera.main.usePosition);//从摄像机发出到点击坐标的射线
RaycastHit hitInfo;
if(Physics.Raycast(ray,out hitInfo))
unity3d入门{
Debug.igin,hitInfo.point);//scene視圖可看到DrawLine(Vector3 origin,Vector3 end,Color col):衹有儅發⽣碰撞時,在Scene視圖才可以看到畫出的射綫。
GameObject Obj = llider.gameObject; Debug.Log("click object name is " + Obj.name); if(Obj.tag == "xx")//当射线碰撞⽬标为名字為xx的對象,执⾏以下操作 { } } } } }若有不對之處,還請幫忙指正哦。
射线的讲解很清楚的⼀個链接:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论