版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40695551/article/details/78503630
Unity5权威讲解之菜鸟读书笔记(三)
11. Rigidbody 组件是模拟碰撞等物理效果的重要组件,具备以下属性,如表所示。
属性 | 含义 |
---|---|
Mass | 相对质量,其单位不是现实中的1kg.1g等。假设A物体的质量为1,B物体的质量为10,那么可以解释为“B物体的质量 是A物体的10倍” |
Drag | 用于移动的摩擦系数 |
Angular Drag | 用于旋转的摩擦系数 |
Use Gravity | 是否模拟重力效果 |
Is Kinematic | 如果勾选该属性,Unity 将不进行物理模拟使模型移动,而是通过Transtorm组件移动。也就是说,模型此时不受物理引擎的影响 |
Interpolate | 使用物理模拟时,模型如果发生停止暂停等现象,可以使用该属性使画面更为流畅。 Interpolate:使当前帧适应前一一顿的位置,使模型移动更自然 Extrapolate 推测下一顿的位置变化,使模型移动更自然 |
Collision Detection |
游戏中模型运动过快时,可能导致物理引擎来不及检测到碰撞。因此,该属性帮助引擎进行更细致的检测碰撞。检测顺序为Discrete- Continuous一Continuous Dynamic |
Freere Position | 阳止模型义Y Z轴中某轴向上移动 |
Freeze Rotation |
阳止模型X、Y Z轴中以某一轴为基准旋转 |
将制作子弹所需的所有组件以及脚本不加到Bu let 游戏对象。需要注意,子弹模
型无需添加任何组件,因为它只是单纯的视觉模型。(父对象和子对象)
12.子弹脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletCtrl : MonoBehaviour {
//子弹破坏力
public int damage = 20;
public float speed = 100.0f;
// Use this for initialization
void Start () {
GetComponent<Rigidbody>().AddForce(transform.forward * speed);
}
// Update is called once per frame
void Update () {
}
}
函数:GetComponent<Rigidbody>().AddForce(transform.forward * speed);
13.Collider组件
碰撞感知条件:1.发生碰撞的两个游戏对象都要添加Collider组件。
2.两个游戏对象至少一方有Rigidbody 组件。
处理速度最快的Collider:Sphere Collider
顺序: Sphere Collider > Capsule Collider >Box collider.
碰撞事件表
函数名 | 触发条件 | ls Trigger 选项 |
---|---|---|
void OnCollisionEnter | 两个物体间碰撞开始时 | 否 |
void OnCollisionStay | 两个物体间碰撞持续时 | 否 |
void OnCollisionExit | 两个物体分开时 | 否 |
void OnTriggerEnter | 两个物体间碰撞开始时 | 是 |
void OnTriggerStay | 两个物体间碰撞持续时 | 是 |
void OnTriggerExit | 两个物体分开时 | 是 |
On Trigger函数会贯穿物体(在游戏中主要用作传感器例如角色开滑动门等)
On collision函数只会碰撞物体(用于子弹等。。)
一个简单的碰撞函数
子弹射在墙上消失。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WallCtrl : MonoBehaviour {
private void OnCollisionEnter(Collision coll)
{
if (coll.collider.tag == "BULLET")
{
Destroy(coll.gameObject);//删除发生碰撞的物体
}
}
}
14.子弹发射逻辑
*制作子弹发射位置(FirePos)
*检测并处理发射事件
子弹发射函数。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FireCtrl : MonoBehaviour {
public GameObject bullet;
public Transform firePos;//子弹发射坐标。
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(Input .GetMouseButtonDown(0))
{
Fire();
}
}
void Fire()
{
CreateBullet();
}
void CreateBullet()
{
Instantiate(bullet, firePos.position, firePos.rotation );//动态生成子弹预设
}
}
15.播放音频的函数代码
private AudioSource source = null;
public AudioClip fireSfx
void start (){
//获取组件后分配变量
source = GetComponent <AudioSource>() ;
}
void fire (){
source.PlayOneShot(fireSfx , 0.9f);
}