使用Unity3D Physics来工作

2023-05-16

这个教程将教你如何用Unity3D构建一个小球击倒柴火堆的游戏!在这个过程中,你将了解到关于使用物理引擎的重要性和你这么做后可以减少无数小时的手工动画的时间。继续阅读!


有什么完整的现代游戏引擎会缺少物理引擎呢?每一个当前的游戏引擎,不管它是3D的还是2D的,都有一个某种类型的物理库,Unity也不例外。想要在你的游戏里,用实时的物理来模拟复杂对象之间的交互是很理想的。一个物理引擎可以减少大量手工编码和动画来达到逼真的行动,能轻易的进行碰撞检测,并且能快速的引进一系列新的游戏机制到你的游戏里。

在本教程中,我们将使用Unity的物理引擎来构建一个3D的类似BoomBlox和愤怒小鸟一样类型的击倒类游戏。我们将学习到如何给对象不同的物理属性,使它们能够互相碰撞,并且甚至当碰撞过于猛烈的时候允许他们被摧毁。




什么是物理引擎?

一个物理引擎的工作是模拟当有外力作用到对象上时他们间相互反应。这些外力可以是常数,像重力或者一辆车的动力,也可以是其他短暂并且强大的,像爆炸。一个物理模拟有时被称作“SendBox(沙盒)”,因为仅仅只有在模拟之中的对象才受到挤压。事实上,不是所有的对象在你的游戏里都需要一部分的模拟。这很重要,因为玩家的动作常常不切实际却还要反应现实的碰撞。

项目设置
-点击文件>新项目
-浏览到一个合适的文件夹并且命名项目为CannonBowl
-点击创建
-点击gameobjects>创建其他>方向光源
-点击文件>保存场景
-命名场景为Main
-点击保存

Colliders(碰撞器)

碰撞器是物理引擎用来执行碰撞检测的。与网格对象不同,当他们互相接触的时候他们自己知道。他们是简单形状,像方块、球形或者胶囊形,分配你的gameobjects并且跟随他们周围。你可以将它们想象成类似“力场”的东东。

方便的是,每当一个gameobjects被创建,它会自动分配一个合适的碰撞器。一个立方体会得到一个BoxCollider(立方体碰撞器),一个球体会得到一个SphereCollider(球体碰撞器),一个圆筒会得到一个CapsuleCollider(柱体碰撞器),等等。




最后,我们将需要一些积木去被击倒:

-点击gameobjects>创建其他>立方体
-重命名立方体为WoodBlock
-设置积木的位置为 0,0,0。这将会把积木放置在世界的中心
-下载Wood.jpg
-拖动Wood.jpg进入你的项目面板去将它变为纹理
-拖动木头纹理到场景中的积木上,这将为我们自动生成木头材料并且应用到积木上
-从层级面板上拖动积木到项目面板将其转化为预制件(应该就是组件吧)

如果我们按下运行,积木啥事都不会干。虽然它有一个碰撞器,但是它缺乏一个刚体,所以它不受任何物理力的效果。

Rigidbodies(刚体)

在一个物理引擎中,刚体是最关键的元素。它在物理模拟中附加在任意一个gameobjects上。

-在项目面板上选择积木组件
-点击组件>物理>刚体




默认情况下,一个刚体受到重力和空气阻力的影响,也是众所周知的阻力。如果我们按下播放,积木将开始掉落,加速,并且当重力和阻力平衡后达到最终速度。

Build a Structure(构建一个结构)

我们将需要创建更多元素为了来构建一个适当的水平。首先,当我们增加一些让积木能放在地面上的土地。

-点击gameobjects>创建其他>平面
-重命名片面为Ground
-设置Ground的位置为0,0,0
-下载Grass.jpg
-拖动Grass.jpg进入你的项目面板制造一个纹理
-将草地纹理拖入到场景上地面上

地面将自动被给定一个网格碰撞器,这将阻止任何的刚体穿过它。按下播放,积木就该掉下来,并且停在地面上。



现在,我们需要一个结构去击倒(囧啊,这句翻译的真坑爹)。选择积木并且按下Ctrl+d(在windows下)或者Cmd+d(在osx上),复制积木几次。使用缩放和移动工具,拉伸并且放置积木在如下图所示的地方。




注意:使用精确的数字来转换是一个好主意。积木应该互相依靠在一起,但是没有重叠。重叠将导致物理引擎崩溃并且做出不可预料的事情来。

Camera Controls(摄像机控制器)

现在,我们已经创建了我们的美丽的结构,让我们来写一段脚本,它将允许我们移动摄像机,让我们能像上帝一样从任意角度欣赏赞美咱自己创建的的东东(同样囧,这翻译的...)

-点击资源>创建>C#脚本
-重命名脚本为Cannon(因为最后我们的摄像机将做些事)
-拖动脚本到主摄像机上
-双击脚本编辑它

接下来的脚本将使得摄像机绕着世界中心盘旋,而且在这过程中还不断的上上下下。


public class Cannon : MonoBehaviour {
  void LateUpdate() {
    float x = Input.GetAxis("Mouse X") * 2;
    float y = -Input.GetAxis("Mouse Y");

    // vertical tilting
    float yClamped = transform.eulerAngles.x + y;
    transform.rotation = Quaternion.Euler(yClamped, transform.eulerAngles.y, transform.eulerAngles.z);

    // horizontal orbiting
    transform.RotateAround(new Vector3(0, 3, 0), Vector3.up, x);
  }
}


在最后阶段,让我们做一个十字准星到我们的摄像机上,这样可以更简单的对准目标:
-点击gameobjects>创建>平面
-重命名平面为Crosshair
-设置Crosshair的位置到0,0,0
-下载Crosshair.png
-拖动Crosshair.png进入项目面板
-拖动Crosshair纹理到场景面板中的Crosshair平面上
-在检测中,右键点击网格碰撞器组件并且移除它以便它在场景中不再影响到其他物理对象




Shooting Cannonballs(发射加农炮)

应该能看到我们的结构已经好了,但是这是假定在物理上!我们需要一种方法击倒它来看看物理效果。我们需要发射!


【此处本来有个swf,但是这个swf好像链接不到。。。】

-点击gameobjects>创建其他>球体
-重命名球体为Cannonball
-设置Cannonball的位置为0,0,0
-当选中Cannonball,点击组件>物理>刚体
-将Cannonball从层次面板中拖到项目面板,把它变成一个预制组件


public class Cannon : MonoBehaviour {
  public GameObject projectilePrefab;



因为我们要从摄像机上直接发射炮弹,我们能编辑我们已经存在的Cannon脚本。首先我们增加一些公共属性在我们预制好了的类的顶部。


void FixedUpdate () {
  if (Input.GetButtonDown("Fire1")) {
    GameObject projectile = Instantiate(projectilePrefab, transform.position, transform.rotation) as GameObject;
    projectile.rigidbody.AddRelativeForce(new Vector3(0, 0, 2000));
  }
}



Boundaries(边界)

你可能已经注意到,如果一个炮弹被发射的足够远,它会从地面的边缘掉落下去。这个炮弹将继续存在,只要游戏继续运行并且它的物理状态将继续被计算,最终将一切都拖慢。我们需要创建一个边界,并且销毁一切离开这个边界的任何gameobjects。

-点击gameobjects>创建空
-重命名它为Boundary
-设置Boundary的x,y和z的位置为0
-当Boundary被选中,点击组件>物理>盒子碰撞器
-在检测中,确保是触发的。
-设置盒子碰撞器的中心为0,25,0
-设置盒子碰撞器的大小为50,50,50




现在,我们需要创建脚本来销毁那些离开边界的对象了。

-点击资源>创建>C#脚本
-重命名脚本为Boundary
-将脚本拖动到层级面板中的Boundary对象上
-编辑脚本并且增加以下代码


public class Boundary : MonoBehaviour {
  void OnTriggerExit(Collider other) {
    Destroy(other.gameObject);
  }
}



Causing Destruction(造成破坏)

我们需要一种方法来赢得当前关卡,如果我们的积木受到足够的冲击,它们将被摧毁。

-点击资源>创建>C#脚本
-重命名脚本为Block
-拖动脚本到项目面板中的Block组件上
-双击项目面板中的脚本来编辑它

在这个脚本中,我们给组件一个公共生命属性让它可以在编辑器中被调整。这允许不同的积木有不同数额的生命。


public class Block : MonoBehaviour {
  public float health = 20;



当碰撞被检测到,冲击的数值将被算出。更大的撞击将造成更大的伤害。任何超过轻轻一击的碰撞都要减去积木的生命值。如果积木的生命值降到了0以下,那么这个积木就会被销毁。然后检测看看有多少个其他的积木留在场景中。如果仅仅只有一个积木被销毁(这句很奇怪,看代码应该是全部的积木都被销毁才对),那么游戏结束,并且它将被重新加载到场景上,重玩一次。


void OnCollisionEnter(Collision collision) {
  // apply collision damage
  if (collision.relativeVelocity.magnitude > 0.5) {
    health -= collision.relativeVelocity.magnitude;
  }

  // destroy if health is too low
  if (health <= 0) {
    Destroy(gameObject);

    // restart the scene if this was the last box
    GameObject[] boxes = GameObject.FindGameObjectsWithTag("Box");
    if (boxes.Length <= 1) {
        Application.LoadLevel("Main");
    }
  }
}



Concrete Blocks(混凝土砖)

到现在为止,我们只是用了木头积木。他们轻并且相对较弱,使得结构很容易被破坏并且显而易见的它将会被怎么被移动。我们需要创建另一种积木,一种既沉重并且强壮的积木。

-在项目面板中,复制木头积木组件(Ctrl+d在windows中,Cmd+d在Osx中)
-重命名复制的积木为ConcreteBlock
-下载Concrete.jpg
-拖动Concrete.jpg进入项目面板
-拖动混凝土纹理到项目面板中的ConcreteBlock组件上
-当组件被选中,使用检测器更新它的生命值到50
-在刚体组件中,增加Mass到5使得它更重
-拖动混凝土积木组件进场景

尝试用混凝土积木重新摆放一些交叉的积木。混凝土积木将更难的被撞击击倒、掉落,并且更难被炮弹摧毁。




Finished Game(完成游戏)

下面是运行在Web播放器中的完成的游戏。使用鼠标对摄像机轨道上的物体按下Ctrl或者鼠标左键射击。


[u3d=600,400]http://tuts-authors.s3.amazonaws.com/mobile.tutsplus.com/Ian Zamojc/2012/08/07/WebPlayer.unity3d[/u3d]

总结

本教程仅仅只是粘到了U3D物理引擎能做的一点点边。恒力,爆炸力,物理材料,铰链,弹簧,布偶等。虽然这看起来可能很可怕,Unity物理引擎的元素都组合在一起,使它容易理解并容易在你的游戏中实现物理效果。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Unity3D Physics来工作 的相关文章

  • 对Unity3D 静态批处理和动态批处理的理解

    Draw Call就是CPU调用图像编程接口 像OpenGL或者 DirectX 简单来说 Draw Call就是由CPU发起的一个命令 添加到一个命令缓冲区 当GPU完成了上一次的渲染任务之后 会从命令缓冲区的命令队列中再取出一个并执行
  • 如何将重力应用于弹跳球应用程序?

    我编写了一个相当简单的java应用程序 它允许您拖动鼠标 并根据您拖动鼠标的长度 它会朝那个方向射出一个球 并在球移动时从墙壁上弹起 这是一个快速截图 替代文本http img222 imageshack us img222 3179 ba
  • python球物理模拟

    我看过 Peter Colling Ridge 的精彩教程 http www petercollingridge co uk pygame physical simulation 我正在扩展 PyParticles 脚本该代码可以在网站上获
  • python中圆中均匀分布点的生成器

    我的任务是在不可见圆的同心环上生成均匀 或多或少 间隔的点 该函数应采用半径列表以及给定半径绘制的点数作为参数 例如 对于半径为 0 的情况 应在 0 0 处绘制 1 个点 对于半径为 1 的圆 应沿圆的圆周绘制 10 个点 间隔角度为 2
  • 有没有办法重新格式化方程以从公式中获取未知变量?

    我正在制作一个应用程序 我想在其中使用数学和物理的公式 方程 我在每个公式中都包含了一个计算器部分 以便用户能够插入他的值并获得方程的结果 问题是 我需要为每个未知变量重新格式化方程 是否有脚本 或者至少有某种算法能够做到这一点 我正在使用
  • Bullet/ammo.js 中的刚体(形状)来自 Three.js 中的网格

    我将bullet ammo js 与 Three js 一起使用 我有一个 3d 网格 我想使用精确的形状与软体进行碰撞检测 有没有办法从网格 在 Three js 中 创建 3D 刚体 在项目符号中 这是一个例子 http kidzins
  • 找到发射弹丸的角度以到达特定点

    所以 Dani 在他的稍微新的视频中 gt 制作游戏 但我只有 3 天 https youtu be S7Dl6ATRK2M 制造了一个拥有弓箭的敌人 5 39 我试图重新创建它 但没有运气 我也找不到他使用的网站 今天我发现了这个http
  • 如何让物体忽略重力(AndEngine)?

    我有一个精灵 有身体 在场景中弹跳 它需要不受重力影响 但也能够与场景中的其他物体发生碰撞 这意味着我无法使用运动体 我试过 body PhysicsFactory createCircleBody mPhysicsWorld this B
  • 在科学环境中进行编程实践? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 背景 去年 我在一所大学的物理研究小组实习 在这个组中 我们主要使用的是LabVIEW http en wikipedia org w
  • 2D 软体:凝胶状和可塑性?

    我正在使用 Matter js 物理学来尝试创建软体 我能够创建这样的身体 但我不确定这是否是我想要的 软体 确实 这个物体并不完全是刚性的 并且在碰撞和被拖动时具有弹性的感觉 我一直在寻找与凝胶有相似之处的身体 这张图片可能在视觉上有助于
  • 移动的球从静止的球弹起的角度

    假设有两个球 其中一个在笛卡尔坐标平面内移动 而另一个则静止不动 在某个时刻 移动的球与惰性球发生碰撞 假设移动的球沿直线行进 根据以下信息 如何得出移动的球将被推进的新角度 移动球的中心坐标 X0 Y0 半径 R0 和撞击前的行进角度 A
  • 使两个物理对象不发生碰撞,但在 Unity 中检测碰撞

    我有一个 Unity 项目 其中有一个 2D 游戏世界 其中包含静态碰撞器 以使几何体对于居住在其中的角色来说是实体的 玩家是一个动态碰撞器 具有非运动学刚体 还有一个敌人角色 它也是一个动态碰撞器 两个角色都像我期望的那样在地板上行走并撞
  • 三角形 - 三角形相交测试

    我想知道是否有一些教程或指南来理解和在 3D 环境中实现三角形 三角形相交测试 我不需要知道交叉点发生在哪里 只需要知道发生了交叉点 我本来打算按照理论 pdf 来实现它 但我很困惑 计算三角形 2 的平面方程 如果三角形 1 的所有点都在
  • 有哪些算法可以让我模拟行星物理?

    我有兴趣制作一个 太阳系 模拟器 它可以让我模拟行星和恒星的旋转力和引力 我想说的是 模拟我们的太阳系 并以不同的速度模拟它 即观察地球和其他行星绕太阳旋转数天 数年等 我希望能够添加行星并改变行星质量等 看看它会如何影响系统 有谁有任何资
  • 二维轨道物理

    我正在为游戏开发 2D 物理引擎 我使用简单的迭代方法让重力和质量起作用 我知道我最终必须升级 我可以手动推动群众并观察他们移动 一切都按照我的预期进行 现在我正在尝试用一颗围绕行星的简单圆形轨道上的卫星提前设置游戏世界 为此 我需要在给定
  • 对推力从当前速度矢量到目标矢量的平滑变化进行编程

    TL dr 我不确定如何计算一个矢量与另一个矢量之间的推力的平滑过渡 我正在编写一个简单的游戏 敌人在开放空间 没有墙壁 中追赶玩家 我独立计算敌人的 x 和 y 速度 如果敌人朝着玩家的方向前进 则加速它们 如果敌人走错路 则快速减慢它们
  • Box2D:如何手动渲染身体

    我成功地将 Box2D 安装到我的项目中 但我怎样才能渲染身体呢 假设我正在使用支持绘制多边形的东西 我只想找出主体多边形顶点的当前位置 以便用引擎绘制它 如果你能帮助我 我将非常感激 我找到了 void Box2DUtils DrawBo
  • 碰撞时阻止移动

    我正在 XNA 中开发 2d 游戏 目前正在上物理课 我当前的任务是在一个物体与另一个物体碰撞时阻止它 我让我的游戏在两个物体发生碰撞时调用此函数 public void BlockMovement gameObject target yo
  • 车祸最低门槛

    我正在使用加速度计来检测车祸 我遇到了检测车祸所需的最小阈值的问题 检测车祸所需的最低阈值是多少 Override public void onSensorChanged SensorEvent event float x event va
  • C# 中的 N 体模拟

    我正在尝试使用 Runge Kutta 4 或 Velocity Verlet 集成算法在 C 中实现 N 体模拟 在我转向更多数量的粒子之前 我想通过模拟地球绕太阳的轨道来测试模拟 但是 由于某种原因 我得到的不是椭圆轨道 而是一个奇怪的

随机推荐

  • 【论文翻译】-- GaitSet: Regarding Gait as a Set for Cross-View Gait Recognition

    本文是复旦大学发表于 AAAI 2019 的工作 截至目前CASIA B正确率最高的网络 英文粘贴原文 xff0c google参与翻译但人工为主 有不对的地方欢迎评论 粉色部分为本人理解添加 xff0c 非原文内容 目录 摘要 1 介绍
  • FreeRTOS学习-中断管理

    1 简介 中断管理是一个操作系统中最核心的功能之一 在FreeRTOS中 xff0c 中断总是可以打断task xff08 尽管是最高优先级的task xff09 xff0c 而task永远不可能打断中断ISR xff08 interrup
  • FreeRTOS学习-共享资源的同步访问

    1 简介 对于多任务的系统 xff0c 对于某个共享资源 xff08 全局变量 xff0c 外设等 xff09 的并发访问容易引起数据的不一致性 xff0c 这将会导致一些意外的结果 而共享资源的同步访问则是为了解决这个问题而提供的一种同步
  • ST-Link的LED指示灯说明

    自ST LINK V2以来的所有ST LINK板都实现了一个标有 COM 的LED 无论是在外壳上还是在PCB上 一般 COM 是由红 绿两个LED组合 xff0c 有常亮 常灭 闪烁等 xff0c 两个LED同时亮呈现橙色 ST Link
  • linux基本命令练习----答案版

    linux基本命令练习 答案版 切换用户 su sudo 切换到root用户 span class token comment 第一种方式切换root用户 span span class token function sudo span s
  • WARNING: You are using pip version 19.2.3, however version 20.0.2 is available

    最近用到python时出错 xff08 如下图所示 xff09 xff0c WARNING You are using pip version 19 2 3 however version 20 0 2 is available You s
  • Chrome保存整个网页为图片

    打开需要保存为图片的网页 然后按F12 xff0c 接着按Ctrl 43 Shift 43 P 在红框内输入full 来自 xff1a https www cnblogs com ChouXiaoShou p ChromeScreensho
  • 用node实现一个postgresql操作定时器

    已知数据库 xff0c 我要用node js实现定时任务 xff0c 定时user表下的vip字段重置所有记录为0 首先 xff0c 你需要使用Node js中的node schedule模块来设置定时任务 你可以在你的项目中安装node
  • Vue获取网页微信登录二维码

    首先安装npm install vue wxlogin save dev lt template gt lt div id 61 34 app 34 gt lt div id 61 34 wxbox 34 gt lt wxlogin app
  • jeecg-boot配置字典遇到的问题

    在online报表生成代码后 xff0c 配置的数据字典一直不生效 xff0c 显示空值最后在官方文档发现需要后端加一个注解 xff0c 如下图所示 xff1a 文档链接 xff1a http doc jeecg com 1273944
  • 配置pycharm 编译器时遇到的一些问题

    今天在配置完pycharm 编译器运行代码时 xff0c 突然出现一个报错 Fatal Python error Py Initialize unable to load the file system codec ImportError
  • chrome浏览器起始页被hao123劫持了怎么办?

    对于一个强迫症来说 xff0c 起始页被修改了 xff0c 真的很难受 hao123真的很烦 第一种情况 修改了你浏览器的默认起始页 xff0c 在设置中去修改就可以了 第二种情况 在这里面添加了他的网站 xff0c 删除或者从新生成一个快
  • COMODO杀毒软件Linux版

    科摩多Linux杀毒软件 CAVL 提供同样出色的防病毒保护 xff0c 同时附带一个额外的完全可配置的反垃圾邮件系统 具有按访问和按需求病毒扫描 xff0c CAVL还采用了基于云计算的对未知文件的分析 xff0c 针对零日恶意软件提供了
  • ubuntu系统下安装windows并引导双系统

    首先 xff0c 感谢wenbusy xff0c 给了我很大的帮助 xff0c 以下部分内容来自于该博主 windows系统安装ubuntu很容易 xff0c 但在ubuntu下如何安装windows构成双系统并成功引导 xff1f 本文来
  • 3.4 小乌龟git使用说明

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言一 安装二 使用步骤1 设置语言2 添加你的git 用户名和邮箱3 创建git空项目3 1 方法1 本地创建3 2 方法2
  • WinScp连接Win7

    本机安装WinScp 目标Win7安装OpenSSH 下载openSSH https github com PowerShell Win32 OpenSSH releases下载后解压放在C xff1a ProgramFiles目录下设置环
  • DEBIAN_FRONTEND noninteractive参数

    DEBIAN FRONTEND这个环境变量 xff0c 告知操作系统应该从哪儿获得用户输入 如果设置为 noninteractive xff0c 你就可以直接运行命令 xff0c 而无需向用户请求输入 xff08 所有操作都是非交互式的 x
  • RFC3630 - TE Extensions to OSPF Version 2中文

    Traffic Engineering TE Extensions to OSPF Version 2 该标准是RFC2370的更新 标准RFC2370是关于OSPFv2的Opaque LSA的扩展 xff0c 在被更新以后 xff0c 已
  • 【分享】免梯子的chatGPT,玩 ChatGPT 的正确姿势

    火了一周的 ChatGPT xff0c HG 不允许还有小伙伴不知道这个东西是什么 xff1f 简单来说就是 xff0c 你可以让它扮演任何事物 xff0c 据说已经有人用它开始了颜色文学创作 因为它太火了 xff0c 所以 xff0c 本
  • 使用Unity3D Physics来工作

    这个教程将教你如何用Unity3D构建一个小球击倒柴火堆的游戏 xff01 在这个过程中 xff0c 你将了解到关于使用物理引擎的重要性和你这么做后可以减少无数小时的手工动画的时间 继续阅读 xff01 有什么完整的现代游戏引擎会缺少物理引