物理射线

基础内容

Posted by AIaimuti on April 5, 2020

物理射线原理分析

1.物理射线简介

1.何为物理射线?

从一个点往一个方向,发射一根无限长的射线,这根射线与场景中的其余的游戏物体的碰撞体组件相碰撞,射线即结束。
由于射线可以与物理组件Collider 相交互,所以“射线”也称之为“物理射线”。

2.物理射线的应用范围?

超人的激光眼,X 战警镭射眼。

2.物理射线相关方法

1.通过摄像机创建射线

演示:按下鼠标左键发射射线。
Camera.main
代表tag 设置为“MainCamera”的摄像机的Camera 组件的引用。

m_Camera.ScreenPointToRay(Vector3)
摄像机组件(对象)下的一个方法。
屏幕点转化为射线,这个方法会返回一个Ray 类型的射线。
这个屏幕点通常写鼠标的点击位置,这样的话,就代表从摄像机的位置开始,往鼠标点击点这个方向,发射一根射线。

Input.mousePosition
鼠标所在的位置值。

Ray
射线,一个结构体。

代码完整格式:
ray = Camera.main.ScreenPointToRay(Input.mousePosition);

2.检查射线与其他物体的碰撞

RaycastHit
一个结构体,用于存储射线的碰撞信息。

Physics.Raycast(Ray, out RaycastHit)
物理类下面有一个静态方法叫做Raycast(),射线检查。
这个方法有16 个重载方式,我们现在使用第3 种重载方式。

第3 种重载:
检查这根射线,如果射线与场景中的物理碰撞了,返回值为真,并且将碰撞信息存储到RaycastHit 类型的变量中。

物理射线使用步骤
第一步:创建一根射线。
第二步:检查这根射线与其他物体的碰撞,得到碰撞信息。
第三步:通过碰撞信息对碰撞到的物体进行处理。

物理射线之打砖块案例

1.射线打砖块案例

1.功能需求

使用物理射线,实现打砖块游戏案例:
1)在场景中使用嵌套循环生成一堵墙壁;
2)摄像机发射射线,鼠标点击屏幕,就往鼠标点击的方向发射子弹;
3)子弹与墙壁碰撞,发生物理碰撞事件。

2.使用嵌套循环生成一堵墙壁

使用两层for 循环,实例化生成Cube,组成一堵墙壁。
墙壁需要和子弹发生碰撞效果,所有Cube 要加上刚体组件。

3.射线碰撞检测发射子弹

RaycastHit.point
获取射线碰撞点。

Vector3 向量计算方向:
向量A - 向量B = 一个从B 点到A 点的方向。
也就是说,终点减去起点,可以获取到一个从起点到终点的方向。

2.打砖块案例细节优化

1.掉落到地面下的砖块并没有消失

砖块掉落到地面以下后,自动销毁它。

实现思路:
在砖块上挂载一个脚本,当它的位置低于地面的时候,销毁。

2.发射出去的子弹也没有消失

子弹掉落到地面以下后,自动销毁它。

实现思路:
1)可以和之前的砖块进行同样的操作,但是落在地面上的不会销毁。
2)使用时间判断,子弹发射出去后,几秒后自动销毁自身。

3.让砖块的颜色五颜六色

实现思路: 当砖块实例化出来后,获取他的渲染组件,然后找到这个组件的材质球下面的颜色,进行随机生成颜色。
任何颜色都是红(R),绿(G),蓝(B)三种颜色搭配组成的。
在unity 的脚本中颜色的取值范围是0~1。

4.Debug 绘制射线

射线是“虚无”的一个东西,就和WIFI 信号一样,真实存在,但我们看不到。
但有些时候,我们需要看到射线。
Debug.DrawRay(Vector3, Vector3,Color):绘制射线
第一个Vector3 是起点位置;
第二个Vector3 是目的点减去起点得到的一个方向;
Color 就是射线的显示颜色。

注意:Debug 绘制的射线,只能在Scene 窗口看到,运行后看不到。
如果想在运行后也看到,可以使用LineRenderer 组件绘制。