7.Unity刚体与碰撞

7.Unity刚体与碰撞

首页游戏大全重力触发Gravity Trigger更新时间:2024-06-05
7.刚体与碰撞7.1 刚体

使用刚体(Rigidbody)组件可以让对象使用 Unity 内置的物理引擎。

添加刚体组件时先选中对象,单击 Add Component -> Physics -> Rigidbody 即可。

刚体属性:

  1. Discrete :相对于彼此来测试所有的对象。
  2. Continuous : 在检测极快的对象碰撞时使用,对性能影响较大。
  3. Continuous Dynamic : 对于离散对象使用离散检测,对应连续对象使用连续检测
7.2 碰撞

碰撞器(Collider)组件是投射在对象周围的边界,当其他对象进入其中时可以检测。

对象不需要刚体也能发生碰撞,碰撞只需要所设计的两个对象具有一个碰撞器对象即可。

7.2.1 碰撞器

对于没有碰撞器的对象,可以通过 Add Component -> Physics 选择一个碰撞器即可。

碰撞器的属性:

在对象上可以使用不同形状的多个碰撞器。Mesh Collider(网格碰撞器)是一种具有 3D 模型的精确形状的碰撞器。虽然看上去有用,但在实际中使用会极大地降低性能。所以在实际中,同时使用多个碰撞器组成复杂的碰撞器才是最有效的方法。

7.2.2 物理材质

创建物理材质,在 Project 窗口中右击选择 Create -> Physic Material。

物理材质的属性:

使用物理材质时,只需要将物理材质拖拽到对象上。

7.2.3 物理碰撞

碰撞器的 Is Trigger 不勾选的情况下为物理碰撞。物理碰撞的事件如下:

状态

Collision 模式

调用次数

碰撞时

OnCollisionEnter2D|OnCollisionEnter

一次

碰撞的过程中

OnCollisionStay2D|OnCollisionStay

持续调用

碰撞结束时

OnCollisionExit2D|OnCollisionExit

一次

7.2.4 触发碰撞

碰撞器的 Is Trigger 勾选的情况下为触发碰撞,触发器可以检测碰撞,当检测到碰撞后会调用如下方法:

状态

Trigger 模式

调用次数

碰撞时

OnTriggerEnter2D|OnTriggerEnter

一次

碰撞的过程中

OnTriggerStay2D|OnTriggerStay

持续调用

碰撞结束时

OnTriggerExit2D|OnTriggerExit

一次

other 是进入触发器的UI下的引用,使用该变量可以操作相应的对象。

要让触发器工作,必须涉及到一个刚体,如果不带刚体的对象进入触发器,则什么也不会发生。

示例:

创建新的项目,在场景中添加一个立方体和一个球体,立方体的位置(-1,1,-5),球体的位置(1,1,-5)。

给立方体创建脚本 TriggerScript,给球体创建脚本 MovementScript,并挂载。

TriggerScript 脚本如下:

using System; using System.Collections; using System.Collections.Generic; using UnityEngine; public class TriggerScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { } private void OnTriggerEnter(Collider other) { print(other.gameObject.name " has entered the cube"); } private void OnTriggerStay(Collider other) { print(other.gameObject.name " is still in the cube"); } private void OnTriggerExit(Collider other) { print(other.gameObject.name " has left the cube"); } }

MovementScript 脚本如下:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class MovementScript : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { float mx = Input.GetAxis("Mouse X") / 10; float my = Input.GetAxis("Mouse Y") / 10; transform.Translate(mx, my, 0); } }

运行场景,移动鼠标,观察控制台输出。

7.3 光线投射

光线投射是发出一根假设的射线(即光线)并观察它撞上某个物体之后的动作。使用光线投射可以是实现瞄准、确定视线、测量距离等动作。Unity 中使用 Raycast 方法来实现光线投射。常用的 Raycast 方法:

1.bool Raycast(Vector3 origin, Vector3 direction, float distance, LayerMask mask);

2.bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hit, float distance);

hit - 包含了被撞上的任何对象

示例:

创建新项目,向场景中添加 4 个球体,命名为 Sphere1 ~ Sphere4,位置分别为:(-1,1,-5),(1,1.5,-5),(-1,-2,5),(1.5,0,0)。

创建脚本如下:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class RayController : MonoBehaviour { // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { float dirX = Input.GetAxis("Mouse X"); float dirY = Input.GetAxis("Mouse Y"); transform.Rotate(dirY, dirX, 0); CheckForRayCastHit(); } void CheckForRayCastHit() { RaycastHit hit; if (Physics.Raycast(transform.position, transform.forward, out hit)) { print(hit.collider.gameObject.name "destroyed!"); Destroy(hit.collider.gameObject); } } }

运行游戏,移动鼠标,观察球体的销毁和控制台消息。

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved