Rigidbody(刚体组件):加了此组件游戏物体就变成刚体了



----Mass(质量,单位kg):重力G = 质量m * 重力加速度g(g=9.81 m/s^2)



--------冲量守恒定理 动量守恒定律:m1v1+m2v2=m1v1'+m2v2'



----Drag(空气阻力):和摩擦力不同,与物体不接触也有



----Angular Drag(旋转角阻力):物体自身旋转与空气的阻力,值越大,旋转越慢



----Use Gravity(是否使用重力):默认勾选,Gravity的值可以修改,默认值-9.81




Unity3d篮球自由落体游戏包 unity物体自由落体_游戏

Unity3d篮球自由落体游戏包 unity物体自由落体_ide_02



自由落体(匀变速运动)需要掌握的三个公式



轻重物体的自由下落速度是相同的,即重力加速度的大小都是相同的。



加速度a(单位时间速度变化量) = 重力加速度g



初速度Vo=0



末速度Vt=gt



1、vt = v0 + gt



2、h = 1/2 * gt^2(h是下落的高度,g是重力加速度,t是运动时间)



3、2as = vt^2 - v0^2



平抛运动:平抛+自由落体



抛物线运动:上抛+自由落体



----Is Kinematic(此刚体是否为运动学刚体):不会受到力的影响(改变运动和旋转),只能使用transform让运动学刚体动起来。



--------让物体移动三种方法:改坐标,施加力,加动画。



----Interpolate(刚体抖动修正):当你的刚体遇到抖动时,可以选择其中一种去解决,下一帧,上一帧



--------修正刚体运动的下一帧,让变化进行平滑过度




Unity3d篮球自由落体游戏包 unity物体自由落体_ide_03

----Collision Detection(碰撞检测频率):越往下检测的精度就越高,相应的,性能消耗就越大,所以不推荐大家使用高精度的检测。(子弹:射线检测,客户端都是骗人的)



防止物体运动速度过快,穿过其他物体。




Unity3d篮球自由落体游戏包 unity物体自由落体_触发器_04

----Constraints:约束(冻结)某一根轴,或者位移,或者旋转,冻结偏移度

Unity3d篮球自由落体游戏包 unity物体自由落体_Unity3d篮球自由落体游戏包_05



 



刚体的作用



1、受到力的影响发生位移



2、和其他游戏物体发生碰撞



 



发生碰撞的必要条件是什么?



1、所有想要发生碰撞的游戏物体都必须带有碰撞器组件,Edit Colider:编辑碰撞器的轮廓



2、至少一方带有刚体组件,最好是运动的一方(长时间不动,刚体会休眠的)



3、如果一方是运动学刚体,想要发生碰撞,另外一方必须是非运动学刚体



Collision:是发生碰撞信息的集合(另外一个物体的信息)



collider:和我发生碰撞的另外一个物体的碰撞器



contactPoint[] contacts:碰撞点数组



obsolete:弃用



gameObject:和我发生碰撞的另外一个物体



other:另外一个物体的组件



relativeVelocity:发生碰撞的相对速度



rigidbody:另外一个物体的刚体



transform:另外一个物体的坐标



Unity3d篮球自由落体游戏包 unity物体自由落体_Unity3d篮球自由落体游戏包_06



 



Is Trigger(触发器):就是将Collider碰撞器身上的对勾勾上,就变成了触发器,没有碰撞效果。



发生触发的必要条件是什么?



1、所有想要发生触发的游戏物体都必须带有碰撞器组件



2、至少一方带有刚体组件,最好是运动的一方(长时间不动,刚体会休眠的)



3、和碰撞不同,和运动学刚体没有必要关系,只要是刚体就行,无论是不是运动学刚体



只要一方有触发器,两方都没有碰撞效果,但两方都会调用触发器




Unity3d篮球自由落体游戏包 unity物体自由落体_游戏_07

 



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CollisionTest : MonoBehaviour {
    //检测碰撞
    //Collision是类,是发生碰撞信息的集合(另一个物体的信息)
    //两个物体,发生接触的时候
    private void OnCollisionEnter(Collision collision)
    {
        Debug.Log("我进来了!");
        Debug.Log(collision.gameObject.name);
    }
    //两个物体,持续接触的时候
    private void OnCollisionStay(Collision collision)
    {
        Debug.Log("我在里面了!");
    }
    //两个物体,发生分离的时候
    private void OnCollisionExit(Collision collision)
    {
        Debug.Log("我出来了!");
    }
    //触发器检测
    //Collider是碰撞器的引用,包含于collision
    //触发器和触发器或碰撞器,发生接触的时候
    private void OnTriggerEnter(Collider other)
    {
        Debug.Log("触发了!");
    }
    private void OnTriggerStay(Collider other)
    {
       
    }
    private void OnTriggerExit(Collider other)
    {
       
    }
}



 



预制体Prefab:



存档:序列化,就像类的实例化



读档:反序列化



预制体,在检视面板多出三个按钮



选择,还原,应用改变到游戏物体



场景里的游戏物体和资源文件夹的预制体,两者的生命周期不同,Unity不允许将场景里的游戏物体拖到预制体里,一旦切换场景就会丢失游戏物体。




Unity3d篮球自由落体游戏包 unity物体自由落体_ide_08

 



工程之间迁移资源



1、拖拽生成预制体(母体)



2、导出资源包



3、导入资源包



4、拖拽预制体到层级面板(蓝色就是克隆的预制体,红色表示丢失了预制体),断掉预制体关联,可恢复正常颜色




Unity3d篮球自由落体游戏包 unity物体自由落体_触发器_09

 

Unity复习

Unity3d篮球自由落体游戏包 unity物体自由落体_Unity3d篮球自由落体游戏包_10



墙体碰撞



冻结墙体的位置和旋转,防止被撞动,也可以防止刚体进入休眠(还是会碰撞,只是不会动)



不冻结墙体,经过几秒钟,就会进入休眠,休眠状态依然可以碰撞(运动学刚体和非运动学刚体)




Unity3d篮球自由落体游戏包 unity物体自由落体_游戏_11

判定休眠状态:GUILayout.Label("Sleep :" + rig.IsSleeping());



判定碰撞状态:void OnCollisionEnter(Collision collision) { Debug.Log("有碰撞到");}



唤醒休眠刚体:void Update () { rig.WakeUp();}



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WallTest : MonoBehaviour {
    Rigidbody rig;
    private void Awake()
    {
        rig = GetComponent<Rigidbody>();
    }
    // Use this for initialization
    void Start()
    {
          // 可以碰撞的 (运动学干刚体和非运动学刚体)
          // 冻结的时候 刚体会进入休眠吗?    不会                 
          // 如果不冻结的状态 经过几秒种以后 就会进入休眠状态       
    }
    private void OnGUI()
    {
        GUILayout.Label("Sleep :" + rig.IsSleeping());
    }
    void OnCollisionEnter(Collision collision)
    {
        Debug.Log("有碰撞到");
    }
    // Update is called once per frame
    void Update () {
        rig.WakeUp();   // 唤醒
              
       }
}



子弹



加刚体,去重力,不下落



tag标签,给游戏物体分类,通过获取标签,判断是哪个物体的




Unity3d篮球自由落体游戏包 unity物体自由落体_触发器_12

子弹销毁:延时销毁,集中销毁



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletMove : MonoBehaviour {
    public float moveSpeed = 10;
    // Use this for initialization
    void Start()
    {
        Destroy(gameObject, 10);
    }
       // Update is called once per frame
       void Update () {
              
       }
    void FixedUpdate()
    {
        transform.Translate(Vector3.up * moveSpeed * Time.deltaTime);
    }
    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject.tag == "Enemy")
        {
            // 敌人掉血
            EnemyInfo enemyInfo = collision.gameObject.GetComponent<EnemyInfo>();
            if(enemyInfo) enemyInfo.GetDamage(Random.Range(5, 25));
            // 子弹销毁
            Destroy(gameObject);
        }
    }
}



角色控制



Instantiate实例化一个子弹,Instantiate是有返回值的,可以用于修改子弹的移动速度,Space.World改成世界的Y轴



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerControl : MonoBehaviour {
    // 子弹的预制体
    public GameObject bulletPrefab;     // 资源面板中的
    // 生成的位置
    public Transform firePos; 
    public float moveSpeed = 1;
    public float rotSpeed = 1;
       // Use this for initialization
       void Start () {
              
       }
       
       // Update is called once per frame
       void Update () {
        if(Input.GetKeyDown(KeyCode.Space))
        {
            // 发射子弹 在某个位置 实例化一个子弹
            GameObject bullet = Instantiate(bulletPrefab, firePos.position, firePos.rotation);
            BulletMove bulletMove = bullet.GetComponent<BulletMove>();
            bulletMove.moveSpeed = 20;
        }
              
       }
    // 物理相关的 写在 FixedUpdate
    private void FixedUpdate()
    {
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime * Input.GetAxis("Vertical"));
        transform.Rotate(Vector3.up * rotSpeed * Time.deltaTime * Input.GetAxis("Horizontal"), Space.World);
    }
}



敌人信息



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyInfo : MonoBehaviour {
    public int hp = 100;
       // Use this for initialization
       void Start () {
              
       }
       
       // Update is called once per frame
       void Update () {
              
       }
    public void GetDamage(int dmg)
    {
        hp -= dmg;
        if(hp <= 0)
        {
            hp = 0;
            Destroy(gameObject);
        }
    }
}



敌人控制



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyControl : MonoBehaviour {
    public float moveSpeed = 1;
    Transform playerTrans;
       // Use this for initialization
       void Start () {
        GameObject player = GameObject.Find("Player");
        if(player)
        {
            playerTrans = player.transform;    // 如果没有找到主角 会报 空引用
        }
    }
       
       // Update is called once per frame
       void Update () {
        transform.LookAt(playerTrans);
        transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
              
       }
}



敌人生成点:需要生成的预制体,需要生成的位置



using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SpawnEnemy : MonoBehaviour {
    // 需要生成的预制体
    public GameObject enemyPrefab;
    float spawnInterval;
    float timeCount = 0;
       // Use this for initialization
       void Start () {
        spawnInterval = Random.Range(5, 11);
    }
       
       // Update is called once per frame
       void Update () {
        timeCount += Time.deltaTime;
        if(timeCount >= spawnInterval)
        {
            Instantiate(enemyPrefab, transform.position, Quaternion.identity);  //  Quaternion.identity 表示没有旋转
            spawnInterval = Random.Range(5, 11);
            timeCount = 0;
        }
              
       }
}