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. Mysql中Left Join 与Right Join 与 Inner Join 与 Full Join的区别

    看看Left Join 与Right Join 与 Inner Join 与 Full Join对表进行操作后得到的结果. 在数据库中新建两张表,并插入要测试的数据. 新建表: USE [Test] ...

  2. [py][mx]django注册-邮件激活

    人生,学习,就是一段旅途, 说是放弃,其实是自信心作祟. 因为不同时间段状态,譬如晚上和早上刚来状态不一样.做相同事情容器失去自信而放弃. 坚持可以打破这个魔咒 还有就是有些问题得分割, 不要让压死牛 ...

  3. 在vue init webpack my-project卡住的问题

    在安装完node.js后,也用cnpm代替了npm,然后使用cnpm在node.js的安装路径下安装了vue-cli:cnpm install --global vue-cli.然后使用vue ini ...

  4. u-boot SPL的理解

    uboot分为uboot-spl和uboot两个组成部分.SPL是Secondary Program Loader的简称,第二阶段程序加载器,这里所谓的第二阶段是相对于SOC中的BROM来说的,之前的 ...

  5. Saving Princess claire_(hdu 4308 bfs模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Jav ...

  6. ios 工作日志

    1.设计模式 1.1 想用一个controllerK控制多个页面的切换 但是每一个页面必须要引用这个controller,这样才能控制进度, 所以必须是弱引用.controller必须被某一个实例强引 ...

  7. SQL Expression Language Tutorial 学习笔记二

    11. Using Textual SQL 直接使用 SQL 如果实在玩不转, 还是可以通过 test() 直接写 SQL. In [51]: s = text( ...: "SELECT ...

  8. [lr & ps] 色彩空间管理

    色彩空间 • 定义 色彩空间,Color Space,又称作色域.在色彩学中,人们建立了许多色彩模型,以一维.二维.三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间.我们经 ...

  9. 关闭Oracle 11g的DPR特性

    关闭Oracle 11g的DPR(Direct Path Read)特性 查看event参数值: SQL> show parameter event NAME TYPE VALUE ------ ...

  10. zw版【转发·台湾nvp系列Delphi例程】HALCON Roberts1

    zw版[转发·台湾nvp系列Delphi例程]HALCON Roberts1 procedure TForm1.Button1Click(Sender: TObject);var img, img1: ...