Unity3D笔记三 物理引擎
一、物理引擎
1、物理引擎就是模拟真实世界中物体碰撞、跌落等反应,通过Ballance、愤怒的小鸟来理解什么是物理引擎。Unity的物理引擎使用的是NviDIA的PhysX。
2、选中一个游戏对象,主菜单->Component->Physics->Rigidbody,这样就添加了刚体组件。一旦给一个GameObject添加刚体组件,它就会受重力、碰撞等的反应、无法进入等。地面用Plane。加光照效果会更好。
3、Rigidbody组件的属性:Mass:质量,一般不用大于10;Drag:摩擦力。Use Gravity、Freezze Position、Freeze Rotation等。
4、材质:可以设定刚体是橡胶的、木头的、冰。Import Packages->Physic Materials,修改**Collider的Material指向相应材料即可。
1、
2、
3、
4、
4、添加刚体组件

远离屏幕 负值
二、给'力'
1、可以给游戏对象一个力,这样对象可以响应,比如愤怒的小鸟。注意添加了刚体组件才能给力,否则rigidbody为null。
2、rigidbody.AddForce(Vector3.up*10,ForceMode.Impulse);给一个向上为10的力,Impulse表示冲击力。点击鼠标给小球一个向上的力。
3、rigidbody.AddForce(new Vector3(3,3,0),ForceMode.Impulse);给一个x为3,y为3,抛物线出去。
4、实现向鼠标点击的地方发射球。
1)屏幕(鼠标)坐标转向世界标;
Camera.mainCamera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,3));//表示z方向的假定深度,因为屏幕是二维没有深度,越大越靠里
2)实现见备注:vector2-vector1表示从vector1指向vector2的向量
using UnityEngine;
using System.Collections; public class Add : MonoBehaviour { // Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
Vector3 ve = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 3));//屏幕坐标->世界坐标 目标点的坐标 z轴3个单位
Vector3 dir = ve - Camera.main.transform.position;//目标点-摄像机点的位置
this.gameObject.rigidbody.AddForce(dir * 2, ForceMode.Impulse);
}
}
}
三、推箱子
屏幕坐标 世界坐标 用摄像头
动态创建游戏对象
1、使用CreatePrimitive方法创建对象,创建出的对象不需要Add之类的就可以显示出来:
GameObject cube=GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position=new Vector3(0,0,0);
cube.AddComponent(typeof(Rigidbody));
cube.name="";//设定名字
cube.renderer.material.color=Color.red;
玩:点击鼠标就创建一个Cube,连续点击
调用AddComponent方法来动态为GameObject增加组件(脚本、RigidBody等所有Component菜单下的)
2、动态创建出来的对象运行时在Hierarchy中可以看到,可以帮助检查内存泄露。
3、Destroy(obj)是立即销毁游戏对象,比如被打死后消失:测试,点击鼠标右键销毁。注意:
Destory(this.gameObject);
4、实现炮弹发射和生成4*4个箱子的功能,及时销毁不用的箱子和子弹:OnBecameInvisible事件
using UnityEngine;
using System.Collections; public class Add : MonoBehaviour { // Use this for initialization
void Start () {
//初始化对象
//GameObject gameObject =GameObject.CreatePrimitive(PrimitiveType.Cube);//创建一个正方体
//gameObject.transform.position = new Vector3(0, 3, -4);
} // Update is called once per frame
void Update ()
{
#region 世界坐标
//if (Input.GetMouseButtonDown(0))
//{
// Vector3 ve = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 3));//鼠标点击的地方 屏幕坐标->世界坐标 目标点的坐标 z轴3个单位
// Vector3 dir = ve - Camera.main.transform.position;//目标点-摄像机点的位置
// this.gameObject.rigidbody.AddForce(dir * 2, ForceMode.Impulse);
//}
#endregion #region 单击鼠标创建对象
//if (Input.GetMouseButtonDown(0))
//{
// GameObject gameObject = GameObject.CreatePrimitive(PrimitiveType.Cube);
// gameObject.transform.position = new Vector3(0, 0, 0);
// gameObject.AddComponent<Rigidbody>();
//}
#endregion #region 销毁对象
//if (Input.GetMouseButtonDown(0))
//{
// var sphere =GameObject.Find("Sphere");
// Destroy(sphere, 2);
//}
#endregion
}
}
打箱子
using UnityEngine;
using System.Collections; public class DaPao : MonoBehaviour { // Use this for initialization
void Start () {
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
cube.transform.position = new Vector3(i, j, -1);
cube.AddComponent<Rigidbody>();//添加刚体
cube.AddComponent<Destroy>();//Destroy.cs 类中的OnBecameInvisible
}
}
} // Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown(0))
{
GameObject bullet = GameObject.CreatePrimitive(PrimitiveType.Sphere);//创建子弹 ['bʊlɪt]
bullet.transform.position = Camera.main.transform.position;
bullet.AddComponent<Rigidbody>();
bullet.AddComponent<Destroy>();
Vector3 vector = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,3));
bullet.rigidbody.AddForce((vector - Camera.main.transform.position)*8, ForceMode.Impulse);//向量角度太小打不倒箱子,向量的角度增加8
//不增加这个不但打不到箱子,还不能打指定箱子
}
}
}
新增一个销毁对象的方法
using UnityEngine;
using System.Collections; public class Destroy : MonoBehaviour { // Use this for initialization
void Start () { } // Update is called once per frame
void Update () { }
//当游戏对象离开摄像头时销毁对象
void OnBecameInvisible()
{
Destroy(this.gameObject);
}
//赋给箱子和球
}

Unity3D笔记三 物理引擎的更多相关文章
- 【Unity 3D】学习笔记三十六:物理引擎——刚体
物理引擎就是游戏中模拟真是的物理效果.如两个物体发生碰撞,物体自由落体等.在unity中使用的是NVIDIA的physX,它渲染的游戏画面很逼真. 刚体 刚体是一个很很中要的组件. 默认情况下,新创的 ...
- Unity3D游戏开发初探—3.初步了解U3D物理引擎
一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...
- [原]Unity3D深入浅出 - 物理引擎之刚体部件(Rigidbody)
在虚拟世界中,任何物体都是没有活力的,要想变的真实,Rigidbody是必不可少的组件,下面介绍Rigidbody的各个属性: Mass:质量 Drag:阻力,对象在运动时遇到的空气阻力,0表示没有空 ...
- 瘸腿蛤蟆笔记29-cocos2d-x-3.2 Box2d物理引擎dynamics模块介绍
转载标明出处:http://blog.csdn.net/notbaron/article/details/38611335 上篇回想 本篇名言:奋斗.寻觅.发现,而不屈服.[诗人丁尼生] 上篇中,我们 ...
- Unity3D实践系列09, 物理引擎与碰撞检测
在Unity3D中,一个物体通常包含一个Collider和一个Rigidbody.Collider是碰撞体,一个物体是Collider,才可以进行碰撞检测.Collider组件中的"Is T ...
- Chipmunk-js物理引擎学习笔记
一.基本概念## 空间:在Chipmunk中,空间是所有对象容器.因此,刚体.形状.链接节点等对象都需要添加到空间中.空间控制这些对象的相互作用. 刚体:物理上的刚体指的是在运动和受力作用后,形状和大 ...
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- [原]Unity3D深入浅出 - 物理引擎之碰撞体(Colliders)
通常Colliders会与Rigidbody一起使用,没有添加碰撞体的刚体会彼此相互穿过. 常用碰撞体有以下几种: Box Collider:盒子碰撞体,是一个立方体外形的碰撞体,可调整为不同大小的长 ...
- 【AwayPhysics学习笔记】:Away3D物理引擎的简介与使用
首先我们要了解的是AwayPhysics这个物理引擎并不是重头开始写的新物理引擎,而是使用Flascc技术把一个已经很成熟的Bullet物理引擎引入到了Flash中,同时为了让as3可以使用这个C++ ...
随机推荐
- Winform控件:打开文件对话框(OpenFileDialog)
OpenFileDialog类提供了用户打开文件的功能,它有如下属性: 属性 InitialDirectory:设置对话框的初始目录. Filter: 要在对话框中显示的文件筛选器,例如," ...
- node-webkit连接mysql
一.安装node.js mysql驱动库 node-webkit里面没有mysql模块的,我们需要安装mysql模块.我们可以使用npm(Node package manager)进行安装.这里使用到 ...
- absolute绝对定位的非绝对定位用法
总结: position为absolute的元素如果没有设置left, top等值与left:0;top:0;的的效果是不一样的.例如一个div中有个absolute属性元素,其没有left或是top ...
- 13 款最棒的 jQuery 图像 360° 旋转插件
在 web 页面上使用 jQuery 图像 360 度旋转插件是最美也是最方便的显示图像的方式.这些超级棒的 360° 图像选择插件允许用户更详细的分析产品或者文章.jQuery 图像旋转插件可以让用 ...
- web.xml配置文件元素详解
一.web.xml配置文件常用元素及其意义 1 <web-app> 2 3 <!--定义了WEB应用的名字--> 4 <display-name></disp ...
- window,centos双系统坏了
在centos中格式化SD卡的时候,操作错误,误将windows系统C盘的给格式化了.C盘是ntf格式的,现在却变为了fat32的格式. 重启系统,发现还是可以进入到centos,但是window进入 ...
- linux ffmpeg编译配置安装详解
http://www.111cn.net/sys/linux/53039.htm ffmpeg是一开源的可跨平台使用的一个图形处理插件,这可以进行录制.转换以及流化音视频,同时可以对视频进行截图,下面 ...
- php -- or 的用法
经常看到这样的语句: $file = fopen($filename, r) or die("抱歉,无法打开: $filename"); or 在这里是这样理解的,因为在PHP中并 ...
- PHP 获取图像信息 getimagesize函数
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息. 语法:array getimagesize(s ...
- 双十二“MathType”限时6折特惠
MathType是由美国Design Science公司开发功能强大的公式编辑器,专门用来对数学公式的编辑,与常见的文字处理软件和演示程序配合使用,能够在各种文档中加入复杂的数学公式和符号.双十二期间 ...