目录
1 给gameObject添加rigidbody
2 rigidbody的属性
2.1 基础属性
2.2 插值 详细
2.3 碰撞检测
2.4 constraints 冻结坐标轴的移动和旋转
2.5 layer Overrides
3 碰撞检测 collision Detection
3.1 每个gameObeject上都会创建时自带一个 Collider
3.2 Collider的绿色范围
3.3 两个物体要产生碰撞,至少1个物体需要有 rigidbody
4 用脚本去检测碰撞
4.1 脚本挂载的原则:谁的事情谁做的原则
4.2 脚本1: 挂在子弹上的 TestCollider.cs
4.3 脚本2: 挂在爆炸效果上的 TestColliderPeng.cs
4.4 测试效果
4.4.1 掉落爆炸前
4.4.2 碰撞到plane,发生碰撞,爆炸
4.4.3 爆炸后,爆炸效果自身也消失
1 给gameObject添加rigidbody
- 给gameObject添加一个新的component:rigidbody 刚体
- rigidbody 包含很多物理属性
- 重力
- 可碰撞
- 运动符合现实的物理原理
2 rigidbody的属性
2.1 基础属性
- rigidbody的基础属性
- mass: 质量
- drag:垂直的重力方向的阻力
- Angle drag: 角阻力,旋转阻力
- use Gravity: 重力
- is kinematic: 运动特性,不勾选则完全不受物理影响了
- interpolate: 插值
- collision Detection : 碰撞检测
2.2 插值 详细
- none
- interpolate //按上一帧做插值
- extrapolate //按下一帧做插值
2.3 碰撞检测
碰撞检测
- 离散的 //节省性能,非连续检测,离散的检测. 高速物体的碰撞检测可能失败
- 持续的 //地面一般搞成持续监测
- 连续动态 //子弹一般搞成连续动态
- 连续 // 处于以上几种的中间
2.4 constraints 冻结坐标轴的移动和旋转
2.5 layer Overrides
3 碰撞检测 collision Detection
可进行碰撞检测的componenet
- rigidbody
- mesh Collider
3.1 每个gameObeject上都会创建时自带一个 Collider
不同的gameObeject都有不同的Collider
- mesh Collider
- sphere Collider
- 。。。
3.2 Collider的绿色范围
- 比如,创建一个球体,默认半径时0.5。 和gameObject是合一的
- 这个 collider,可以通过,修改其 x,y,z 坐标,
- 可以修改radius半径,使其扩大,
- 可以把Collider 分离在外面,看的更清晰
- 但是一般不需要这么干
- 因为如果这么干,实际发生碰撞的是这个 Collider ,会和看到的不一致
3.3 两个物体要产生碰撞,至少1个物体需要有 rigidbody
- 两个物体要产生碰撞,需要这几个条件
- 每个物体都需要有 collider
- 至少1个物体需要有 rigidbody
4 用脚本去检测碰撞
准备工作
- 建1个子弹,黄色圆球
- 建1个爆炸效果,黄色平面
- 模拟爆炸过程
4.1 脚本挂载的原则:谁的事情谁做的原则
- 谁的事情谁来做,代码挂在谁身上
- 不要都写在一个脚本里
- 比如 碰撞,则脚本挂在 地面上也可以,挂在物体上也可以
爆炸消失
- 爆炸消失这个脚本,不适合挂在火焰本身上,而是挂在后续的爆炸上
- 新建脚本,爆炸脚本写在爆炸效果上,
4.2 脚本1: 挂在子弹上的 TestCollider.cs
- TestCollider.cs 挂在子弹上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestCollider : MonoBehaviour
{//创建一个prefabpublic GameObject Prefab;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){}//监听发生碰撞private void OnCollisionEnter(Collision collision){// 创建一个爆炸物体Instantiate(Prefab,transform.position,Quaternion.identity);//销毁自身Destroy(gameObject);//获取碰撞到的物体Debug.Log(collision.gameObject.name);}//监听碰撞持续private void OnCollisionStay(Collision collision){}//监听碰撞结束private void OnCollisionExit(Collision collision){Debug.Log("CollisionExit");}}
4.3 脚本2: 挂在爆炸效果上的 TestColliderPeng.cs
- TestColliderPeng.cs 挂在爆炸效果上
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestColliderPeng : MonoBehaviour
{float timer=0;// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){timer=timer+Time.deltaTime;if(timer>1){//销毁自身,gameObject就是自身Destroy(gameObject);}}
}
4.4 测试效果
4.4.1 掉落爆炸前
4.4.2 碰撞到plane,发生碰撞,爆炸
- 碰撞到plane,发生碰撞,爆炸
- 爆炸后,黄球自动消失(子弹消失)
4.4.3 爆炸后,爆炸效果自身也消失
爆炸后,爆炸效果自身也消失(爆炸结束)