Unity 物理系统 -- 射线简介

Unity 物理系统 -- 射线简介

 

有关射线(Ray)的几个结构体(类):

  • Physics (物理类):RayCast()用来发射一条射线;
  • Ray(Struct):表示射线本身的对象
  • RaycastHit(struct):射线和其他碰撞器的碰撞信息

绘制射线函数

  • Debug.DrawLine(transform.position,Vector3.forward * 10,Color.blue,10f);
  • Debug.DrawRay(transform.position,Vector3.left * 10,Color.red);

注:

  1. 第一个参数是绘制出来的位置
  2. 第二个参数是绘制出来的点,默认是1,可以乘一个float类型的数值来增加其射线长度
  3. 第三个参数是颜色
  4. 第四个参数是射线区域,如果改变了射线方向,则射线会形成一个区域,为float类型,值越大,停留的时间越长.

 

射线检测

射线检测的相关参数概念:

  • RaycastHit hit:光线投射碰撞(此变量用于存储此射线碰到了哪些物体的信息)
  • Camera.main.ScreenPointToRay(位置):屏幕位置发射线:返回一条射线从摄像机通过一个屏幕点

注:

  1. 产生的射线是在世界空间中,从相机的近裁剪面开始并穿过屏幕position(x,y)像素坐标(position.z被忽略)。
  2. 屏幕空间以像素定义。屏幕的左下为(0,0);右上是(pixelWidth,pixelHeight)。

 

相关API:

  1. Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到屏幕指定一个点
  2. Ray 射线类
  3. RaycastHit 光线投射碰撞信息
  4. bool Physics.Raycast注意:如果从一个球型体的内部到外部用光线投射,返回为假。

参数理解:

  • origin : 在世界坐标中射线的起始点
  • direction: 射线的方向
  • distance: 射线的长度
  • hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
  • layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞过滤物体。可以在TagManager中编辑tag和Layer。然后设置物体的Layer层级,在摄像机中设置camera.cullingmask,可以控制摄像机的渲染层级,用在射线上,可以控制射线碰撞什么,不碰撞什么。
  • 返回布尔类型,当光线投射与任何碰撞器交叉时为真,否则为假。注意:如果从一个球型体的内部到外部用光线投射,返回为假。

 

射线的5个参数:

RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)

投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

  • Physics.Raycast(射线 ray, 光线投射碰撞到的物体 out hit, 射线长度 distance);

  • Physics.Raycast(位置 position, 方向 forward, 光线投射碰撞到的物体 out hit, 射线长度 distance);

  • Physics.Raycast(位置 position, 方向 forward, 光线投射碰撞到的物体 out hit, 射线长度 distance, 遮罩过滤层 layerMask 1<<8);

注:

  1. 第一个参数是射线的起点
  2. 第二个参数是射线的方向
  3. 第三个参数是碰撞的信息
  4. 第四个参数是射线的长度
  5. 第五个参数是遮罩过滤层(二进制的形式写的,所以我们用的时候需要使用简单的左移运算(<<)
public class RayDemo : MonoBehaviour {

    //创建一个平面,当点击这个平面的某一点时,从摄像机发射一个子弹打向这个点.
    Ray ray;
    RaycastHit rh;

	void Start () {
        //ray = new Ray(Vector3.zero,Vector3.forward);   //创建一条射线,

        //Physics.Raycast(Vector3.zero, Vector3.forward);
        //if(Physics.Raycast(ray,out rh, 0.5f))
        //{
        //    print(rh.point);   //碰撞点
        //}
	}

    void Update()
    {
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);   //鼠标位置发射线

        if (Input.GetMouseButtonDown(0))                     //按下鼠标左键
        {
            if (Physics.Raycast(ray, out rh, 10f))           //发射一个射线
            {
                Destroy(rh.transform.gameObject);            //射线碰到物体消失
                Debug.Log(rh.point);                         //打印碰撞的点
            }
        }
    }
}

通过层对射线进行设定:

public class Ray1Demo : MonoBehaviour
{
    GameObject go;
    void Start()
    {
        go = GameObject.Find("Cube2");
    }
    void Update()
    {
        go.transform.Rotate(new Vector3(0, 1, 0));
        RaycastHit hit;
        Vector3 fwd = transform.TransformDirection(Vector3.forward);
        if (Physics.Raycast(transform.position, fwd, out hit, 100, 1 << 8))
        {	//1位移8,这个参数表示只能检测到参数中的层
		//射线碰撞层级为8,其他层级忽略。
            Destroy(hit.collider.gameObject);
        }
    }
}

/*
注:
  1 << 10 打开第10的层。
  ~(1 << 10) 打开除了第10之外的层。默认层不算,要手动添加的才可以
  (1 << 10) | (1 << 8) 打开第10和第8的层。
		//射线碰撞层级为8,其他层级忽略。
            Destroy(hit.collider.gameObject);
        }
    }
}

注:
  1 << 10 打开第10的层。
  ~(1 << 10) 打开除了第10之外的层。默认层不算,要手动添加的才可以
  (1 << 10) | (1 << 8) 打开第10和第8的层。

*/

 

### 回答1: Unity物理系统常用的方法包括: 1. 创建碰撞体:使用Colliders组件来添加碰撞体,如BoxCollider、SphereCollider和CapsuleCollider等。碰撞体负责检测对象之间的碰撞和触发事件。 2. 添加刚体:使用Rigidbody组件来给物体添加刚体属性。刚体可以模拟物体的质量、重力、速度、受力等物理属性,并与其他物体进行交互。 3. 碰撞检测:利用OnCollisionEnter、OnCollisionExit和OnCollisionStay等方法来检测对象之间的碰撞。可以在碰撞发生时触发相应的事件或执行特定的操作。 4. 触发器:使用Trigger来进行触发器的判定,使用OnTriggerEnter、OnTriggerExit和OnTriggerStay等方法来触发相应的事件。 5. 物理材质:通过给对象添加PhysicMaterial来模拟物体的摩擦力和弹性等特性。可以调整材质的属性来改变物体之间的碰撞效果。 6. 接触点信息:使用Collision和Collider组件来获取碰撞点的信息,如碰撞点的坐标、法线方向、碰撞力等。 7. 约束和关节:可以使用关节和约束来模拟物体之间的连接和限制。常见的约束和关节包括HingeJoint、FixedJoint和SpringJoint等。 8. 物理效果:可以模拟物体的运动效果,如重力、摩擦力、空气阻力等。可以使用AddForce、AddTorque等方法来给物体施加力或扭矩。 9. 物理射线:使用Physics.Raycast和Physics.RaycastAll等方法来进行射线检测。可以检测射线与物体之间是否发生碰撞,并获取碰撞点的信息。 10. 物理特效:使用Particle System组件来添加粒子效果,如火花、烟雾、水花等。可以通过设置粒子的速度、大小和颜色等属性来模拟物理现象。 以上是Unity物理系统常用的方法,可以用来实现物体之间的碰撞、运动、连接等物理效果。 ### 回答2: Unity物理系统常用方法包括: 1. 添加碰撞器(Collider):在物体上添加碰撞器组件,可以使物体参与碰撞检测和物理模拟。 2. 添加刚体(Rigidbody):在具有碰撞器的物体上添加刚体组件,使物体具有物理属性,如重力、施力和受力的效果。 3. 碰撞检测:使用碰撞器进行碰撞检测,可以通过判断是否发生碰撞来进行相关处理,比如触发事件、改变游戏状态等。 4. 物理模拟:通过刚体组件和物理材质(Physic Material)来模拟物体的物理行为,如弹力、摩擦力、空气阻力等。 5. 使用力(Force):通过添加力的方式来施加物体的作用力,可实现物体的移动、旋转等效果。 6. 刚体运动控制:通过改变刚体的速度、角速度或应用力矢量来控制物体的运动,以实现自定义的物理模拟效果。 7. 碰撞事件:当物体发生碰撞时,可以通过碰撞事件(OnCollisionEnter、OnCollisionStay、OnCollisionExit)来触发特定的逻辑或动作。 8. 触发器(Trigger)和触发事件:触发器是一种特殊的碰撞器,不会产生物理效果,但可以检测两个物体之间的触发事件(OnTriggerEnter、OnTriggerStay、OnTriggerExit)。 9. 射线投射:通过创建射线(Ray)对象并进行投射,可以检测物体是否被射线所穿过,常用于射线检测碰撞或点击选择物体。 10. 物理层和层掩码:通过设置物理层和层掩码,可以对不同物体进行过滤,控制碰撞或触发事件的发生。 以上是Unity物理系统常用的一些方法,在游戏开发中,熟练掌握这些方法可以实现丰富多样的物理效果和交互体验。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈言必行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值