核心系统
文章目录
- 核心系统
- 1、光源系统基础
- 1、光源组件
- 2、光面板相关
- 2、物理系统之碰撞检测
- 1、刚体 RigidBody
- 2、碰撞器 Collider
- 3、物理材质
- 4、碰撞检测函数
- 5、刚体加力
- 3、音效系统
- 1、音频文件导入
- 2、音频源和音频监听器脚本
- 3、代码控制音频源
- 4、麦克风输入相关
1、光源系统基础
Standrad Assets
Effects
LightCookies
LigthFlares
1、光源组件
1、面板参数
2、代码控制
Public Light ligth;
light.intensity = 0.5f;
2、光面板相关
设置
Window -> Rendering -> Lighting Settings
2、物理系统之碰撞检测
1、刚体 RigidBody
2、碰撞器 Collider
3、物理材质
4、碰撞检测函数
注意:碰撞和触发响应函数属于特殊的生命周期函数也是通过反射调用
1、物理碰撞检测响应函数
碰撞触发接触时会自动执行这个函数
private void OnCollisionEnter(Collision collision)
{
//Collision类型的参数包含了碰到自己对象的相关信息
1、碰撞到的对象碰撞器的信息
collision.collider
2、碰撞对象的依附对象(GameObject)
collision.gameObject
3、碰撞对象的依附对象的位置信息
collision.transform
4、接触点个数相关
collision.contactCount
//接触点具体坐标
ContactPoint[] pos = collision.contacts;
}
碰撞结束分离时会自动执行的函数
private void OnCollisionExit(Collision collision) { }
两个物体相互接触摩擦时会不停的调用该函数
private void OnCollisionStay(Collision collision) { }
2、触发器检测响应函数
private void OnTriggerEnter(Collider other)
{
}
private void OnTriggerExit(Collider other)
{
}
private void OnTriggerStay(Collider other)
{
}
3、要明确什么时候会响应函数
1、只要挂载的对象能和别的物体产生碰撞或者触发那么对应的这6个函数就能够被响应
2、如果是一个异形物体,刚体在父对象上,如果你想通过子对象上挂脚本检测碰撞是不行的必须挂载到这个刚体父对象上才行
3、要明确物理碰撞和触发器响应的区别
4、碰撞和触发器函数都可以写成虚函数在子类去重写逻辑
protected virtual void OnTriggerEnter(Collider other) { }
5、刚体加力
1、刚体自带添加力的方法
刚体加力:让其有一个速度,朝向某一个方向移动
1、首先应该获取刚体组件
Rigidbody rigidBody;
void Start()
{
rigidBody = GetComponent<Rigidbody>();
}
2、添加力
//相对世界坐标系,z轴正方向加力(受阻力影响)
rigidBody.AddForce(Vector3.forward * 10);
//相对本地坐标系,z轴正方向加力(受阻力影响)
方法一:
rigidBody.AddRelativeForce(Vector3.forward * 10);
方法二:
rigidBody.AddForce(transform.forward * 10);
3、添加扭矩力,旋转
相对世界坐标
rigidBody.AddTorque(Vector3.up * 10);
相对本地坐标
rigidBody.AddRelativeTorque(Vector3.up * 10);
4、直接改变速度(相对世界坐标系)
rigidBody.velocity = Vector3.forward * 5;
5、模拟爆炸效果(只对有代码的脚本的刚体有效果)
rigidBody.AddExplosionForce(10, Vector3.zero, 10);
2、力的几种模式
第二个参数为力的模式
rigidBody.AddForce(Vector3.forward * 10, ForceMode.Acceleration);
根据动量定理Ft = mv, F:力 t:时间 m:质量 v:速度
1、Acceleration
给物体一个持续的加速度,忽略质量 v = Ft/m
F:(0,0,10) t:(0.02s) m:默认为1
v = 10 * 0.02 / 1 = 0.2 m/s
每物理帧移动 0.2 m/s * 0.02 = 0.004 m
2、Force
给物体一个持续的力,与质量有关 v = Ft/m
F:(0,0,10) t:(0.02s) m:2kg
v = 10 * 0.02 / 2 = 0.1 m/s
每物理帧移动 0.2 m/s * 0.02 = 0.002 m
3、Impulse
给物体一个持续的力,与质量有关,忽略时间
F:(0,0,10) t:(默认为1s) m:2kg
v = 10 * 1 / 2 = 5 m/s
每物理帧移动 5 m/s * 0.02 = 0.1 m
4、VelocityChange
给物体一个瞬时速度,忽略质量和时间
F:(0,0,10) t:(默认为1s) m:默认为1
v = 10 * 1 / 1 = 10 m/s
每物理帧移动 10 m/s * 0.02 = 0.2 m
3、立场脚本
添加立场脚本 Constant Force
结束刚体休眠
if (rigidBody.IsSleeping())
{
rigidBody.WakeUp();
}
思考 让一个物体产生位移的几种方式
1.直接在Update生命周期函数中改变Transform当中的Position属性
2.直接在Update生命周期函数中使用Transform提供的APl TransLate这个方法
3.通过加力
rigidBody.AddForce
rigidBody.AddRelativeForce
4.通过改变刚体速度变量
rigidBody.velocity = Vector3.forward * 10;
3、音效系统
1、音频文件导入
1、常用格式
2、音频文件属性设置
2、音频源和音频监听器脚本
3、代码控制音频源
1、代码控制播放视频
AudioSource audioSource; //获取音频源
audioSource = GetComponent<AudioSource>();
if (Input.GetKeyDown(KeyCode.P))
audioSource.Play(); //播放
if (Input.GetKeyDown(KeyCode.S))
audioSource.Stop(); //停止
if (Input.GetKeyDown(KeyCode.Space))
audioSource.Pause(); //暂停
2、如何检测音效播放完毕
if (audioSource.isPlaying) { }
3、如何动态控制音效播放
1、直接在要播放音效的对象上挂载脚本,控制播放
2、实例化挂载了音效源脚本的对象(较少使用)
public GameObject obj;
Instantiate(obj);
3、用一个AudioSource来控制播放不同的音效
public AudioClip clip;
AudioSource aud = gameObject.GetComponent<AudioSource>();
aud.clip = clip;
aud.Play();
4、麦克风输入相关
1、获取设备麦克风信息
string[] strs = Microphone.devices;
for (int i = 0; i < strs.Length; i++)
{
print(strs[i]);
}
2、开始录制
参数1:设备名,传空使用默认设备
参数2:超过录制长度后,是否重头录制
参数3:录制时长
参数4:采样率
private AudioClip clip;
if (Input.GetKeyDown(KeyCode.Space))
{
clip = Microphone.Start(null, false, 10, 44100);
}
3、结束录制
if (Input.GetKeyUp(KeyCode.Space))
{
Microphone.End(null);
AudioSource au = GetComponent<AudioSource>();
if (au == null)
{
au = gameObject.AddComponent<AudioSource>();
}
au.clip = clip;
au.Play();
}
4、获取音频数据用于存储或传输
//声道数 * 剪辑长度
float[] f = new float[clip.channels * clip.samples];
clip.GetData(f, 0); //0为偏移位置
print(f.Length); //输出采样率