Rigidbody(刚体组件):加了此组件游戏物体就变成刚体了
----Mass(质量,单位kg):重力G = 质量m * 重力加速度g(g=9.81 m/s^2)
--------冲量守恒定理 动量守恒定律:m1v1+m2v2=m1v1'+m2v2'
----Drag(空气阻力):和摩擦力不同,与物体不接触也有
----Angular Drag(旋转角阻力):物体自身旋转与空气的阻力,值越大,旋转越慢
----Use Gravity(是否使用重力):默认勾选,Gravity的值可以修改,默认值-9.81

自由落体(匀变速运动)需要掌握的三个公式
轻重物体的自由下落速度是相同的,即重力加速度的大小都是相同的。
加速度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(刚体抖动修正):当你的刚体遇到抖动时,可以选择其中一种去解决,下一帧,上一帧
--------修正刚体运动的下一帧,让变化进行平滑过度

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

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

 
刚体的作用
1、受到力的影响发生位移
2、和其他游戏物体发生碰撞
 
发生碰撞的必要条件是什么?
1、所有想要发生碰撞的游戏物体都必须带有碰撞器组件,Edit Colider:编辑碰撞器的轮廓
2、至少一方带有刚体组件,最好是运动的一方(长时间不动,刚体会休眠的)
3、如果一方是运动学刚体,想要发生碰撞,另外一方必须是非运动学刚体
Collision:是发生碰撞信息的集合(另外一个物体的信息)
collider:和我发生碰撞的另外一个物体的碰撞器
contactPoint[] contacts:碰撞点数组
obsolete:弃用
gameObject:和我发生碰撞的另外一个物体
other:另外一个物体的组件
relativeVelocity:发生碰撞的相对速度
rigidbody:另外一个物体的刚体
transform:另外一个物体的坐标

 
Is Trigger(触发器):就是将Collider碰撞器身上的对勾勾上,就变成了触发器,没有碰撞效果。
发生触发的必要条件是什么?
1、所有想要发生触发的游戏物体都必须带有碰撞器组件
2、至少一方带有刚体组件,最好是运动的一方(长时间不动,刚体会休眠的)
3、和碰撞不同,和运动学刚体没有必要关系,只要是刚体就行,无论是不是运动学刚体
只要一方有触发器,两方都没有碰撞效果,但两方都会调用触发器

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不允许将场景里的游戏物体拖到预制体里,一旦切换场景就会丢失游戏物体。

 
工程之间迁移资源
1、拖拽生成预制体(母体)
2、导出资源包
3、导入资源包
4、拖拽预制体到层级面板(蓝色就是克隆的预制体,红色表示丢失了预制体),断掉预制体关联,可恢复正常颜色

Unity复习

墙体碰撞
冻结墙体的位置和旋转,防止被撞动,也可以防止刚体进入休眠(还是会碰撞,只是不会动)
不冻结墙体,经过几秒钟,就会进入休眠,休眠状态依然可以碰撞(运动学刚体和非运动学刚体)

判定休眠状态: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标签,给游戏物体分类,通过获取标签,判断是哪个物体的

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletMove : MonoBehaviour {
public float moveSpeed = ;
// Use this for initialization
void Start()
{
Destroy(gameObject, );
}
// 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(, ));
// 子弹销毁
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 = ;
public float rotSpeed = ;
// 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 = ;
} }
// 物理相关的 写在 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 = ;
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () { }
public void GetDamage(int dmg)
{
hp -= dmg;
if(hp <= )
{
hp = ;
Destroy(gameObject);
}
}
}

敌人控制

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyControl : MonoBehaviour {
public float moveSpeed = ;
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 = ;
// Use this for initialization
void Start () {
spawnInterval = Random.Range(, );
} // 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(, );
timeCount = ;
} }
}

Unity3D学习笔记(四):物理系统碰撞和预制体的更多相关文章

  1. java之jvm学习笔记四(安全管理器)

    java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...

  2. javascript学习笔记(四) Number 数字类型

    数字格式化方法toFixed().toExponential().toPrecision(),三个方法都四舍五入 toFixed() 方法指定小数位个数  toExponential() 方法 用科学 ...

  3. muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制

    目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...

  4. kvm虚拟化学习笔记(四)之kvm虚拟机日常管理与配置

    KVM虚拟化学习笔记系列文章列表----------------------------------------kvm虚拟化学习笔记(一)之kvm虚拟化环境安装http://koumm.blog.51 ...

  5. Linux学习笔记(四) vi编辑器

    一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...

  6. Linux学习笔记(七) 查询系统

    1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...

  7. MySql学习笔记四

    MySql学习笔记四 5.3.数据类型 数值型 整型 小数 定点数 浮点数 字符型 较短的文本:char, varchar 较长的文本:text, blob(较长的二进制数据) 日期型 原则:所选择类 ...

  8. unity3d学习笔记(一) 第一人称视角实现和倒计时实现

    unity3d学习笔记(一) 第一人称视角实现和倒计时实现 1. 第一人称视角 (1)让mainCamera和player(视角对象)同步在一起 因为我们的player是生成的,所以不能把mainCa ...

  9. ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁

    作者:Grey 原文地址: ZooKeeper学习笔记四:使用ZooKeeper实现一个简单的分布式锁 前置知识 完成ZooKeeper集群搭建以及熟悉ZooKeeperAPI基本使用 需求 当多个进 ...

随机推荐

  1. javascript打开制定窗口大小的页面

    <a  onclick="window.open ('页面链接', 'newwindow', 'height=680, width=400, top=0, left=0, toolba ...

  2. Python中的__init__.py的作用

    当用 import 导入该目录时,会执行 __init__.py 里面的代码 因此在__init__.py文件中,把深层的包的路径缩短,别的地方就可以在引用到目录级别时引到深层的包.

  3. iphone传照片还是用QQ比较好

    之前设置相机格式为高效,通过用91助手的苹果助手导出来文件格式为HEIC,window下没法打开.网上介绍用微信传,发现传的是缩略图,不清楚.最后选择通过qq传比较高清.注意,如果从相册中进行选择的话 ...

  4. vue学习之npm

    任何一门计算机语言都包含了丰富的第三方库,npm就是JavaScript这门语言的第三方库管理工具,本文详细介绍了JavaScript的包管理工具,npm. 在计算机中安装好Node.js之后,默认已 ...

  5. libSVM简介及核函数模型选择

    1. libSVM简介 训练模型的结构体 struct svm_problem //储存参加计算的所有样本 { int l; //记录样本总数 double *y; //指向样本类别的组数 struc ...

  6. 机器学习理论基础学习14.1---线性动态系统-卡曼滤波 Kalman filter

    一.背景 动态模型 = 图 + 时间 动态模型有三种:HMM.线性动态系统(kalman filter).particle filter 线性动态系统与HMM的区别是假设相邻隐变量之间满足线性高斯分布 ...

  7. 013-安装VNC服务

    (1)#001-安装#光盘iso文件安装mount /dev/cdrom /mntcd /mnt/Packagesrpm -ivh tigervnc*rpm -ivh tigervnc按两次tab键 ...

  8. c++练习-快速排序

    这个例子将长度为r的数列a从按照从小到大作排列 快速排序的思想简单说来就是 在a中依次先选定一个数key,将这个数依次与a中的其他数做对比,如果比key小则放到key前面,如果比key大就放到key后 ...

  9. MySQL从删库到跑路(四)——MySQL数据库创建实例

    作者:天山老妖S 链接:http://blog.51cto.com/9291927 一.创建数据库 1.创建数据库 创建数据库,指定数据库的默认字符集为utf8.create database sch ...

  10. [转] Matlab编程规范(MATLAB Programming Style Guidelines)

    转自: Jerry Zitao Liu的博客 主要是参考了下面这篇文章,简洁总结在这里. MATLAB Programming Style Guidelines 简洁总结如下: 表示object的数量 ...