unity3d/2dunity2d 刚体 重叠addforce如何才能立即停下来,我人物移动每次都会滑行一会

(十一)Unity5新特性----实战2D游戏
日期: 18:07:18
来源:ITeye
(十一)Unity5新特性----实战2D游戏
在本教程中,将了解到U5新功能,你通过本教程,您将了解以下内容:
Changes in Component Access
Physics Effectors
Adding Constant Force
Audio Mixer
你可以先下载空的资源项目:。将其解压缩,然后在 Unity 中打开StarterProject\Assets\Scenes\Main.unity 场景。您应该看到如下所示内容:
是一个繁星满天的夜晚背景,相机已经设置了。前景包含在原始形状的建筑物,由几个精灵组成
游戏的目标是你驾驶你的飞船飞过建筑物和轰炸建筑物。建筑物命中几个后,一座建筑将开始抽烟。当你继续撞向大楼,将会有更多的烟从大楼排放,直到整个大厦坍塌。
若要赢了,你的船必须避开所有导弹并摧毁每一幢楼宇。当大量吸烟瓦砾只不过是这座城市,可以降落在市政厅的废墟和宣布你已经中和平。听起来很容易吗?
已经为你写了所有的粒子系统和最必要的脚本。你的工作是为了用Unity5 最新和最好的功能完成游戏。
首先说使用Force!
运行游戏,你会看到。首先,选择Hierarchy 中的Spaceship ,向它添加New Script组件。使它命名为ShipController的C#脚本.,还记得如何添加新的脚本吗? 打开这个脚本,添加下面两个变量:
private Rigidbody2D shipR
private float force = 150.0f;shipRigidBody 代表Rigidbody 2D中的force 变量拥有多少力值,您将使用它来移动该船。您可能想知道为什么你需要一个变量来保存Rigidbody 2D组件。毕竟,在以前版本,您需要访问该组件是使用Unity的变量来访问它rigidbody2D即可。如果有一个刚体,附加到该对象,将对其变量进行填充。如果对象没有被附加,它将为 null。
但是在Unity 5 发生大的变化。
简而言之,Unity开发人员认为这些访问器不太一致。更重要的是,这些访问器创建依赖关系遍及各个子系统,因此,为了保持发展灵活、 除了transform组件, Unity废弃的所有访问者。这意味着你现在要创建所有组件的变量,除了transform。
不幸的是,Unity依然使用旧名称,所以如果你的变量的名字命名和访问器相同了,你会得到一个警告你的本地变量隐藏继承的.
当然了Unity5提供了脚本升级的功能,从之前的旧脚本升级为现在的新脚本:
继续,在Start():方法中添加:
shipRigidbody = GetComponent&Rigidbody2D&();在Update():中添加如下:
if (Input.GetKeyDown(KeyCode.RightArrow)) {
shipRigidbody.AddForce(new Vector2(force, 0));
if (Input.GetKeyDown(KeyCode.LeftArrow)) {
shipRigidbody.AddForce(new Vector2(-force, 0));
if (Input.GetKeyDown(KeyCode.UpArrow)) {
shipRigidbody.AddForce(new Vector2(0, force));
if (Input.GetKeyDown(KeyCode.DownArrow)) {
shipRigidbody.AddForce(new Vector2(0, -force));
}到现在为止你就可以控制飞船了:如下图
无形的墙会影响到游戏效果和玩家的船。这导致了一些关于无形墙应该如何表现的问题:
到墙上应该停止所有的势头吗?
它应该灵活一些像发挥橡胶墙反弹Player吗?
或者应该向左飞行超出后从右边出现吗?
为了本教程中,您将实现中间的选项,因为它有反作用的越来越严重的挑战。Unity 5 点之前,在墙上需要大量的代码,从而使反弹流畅和自然。但是到了Unity5,你只需要做是添加新的组件称为effector.用鼠标右键单击Hierarchy 中,从下拉中选择Create Empty。有三个空的游戏对象。
这些墙的作用是会使Player反弹回来。您将创建三面墙。一是顶部和另外左右。你也可以放一个在屏幕的底部,但建筑物将最终阻止Player。当玩家已摧毁所有建筑物,确实会发生的问题。在这种情况下,他们将会穿越地面。要解决此问题,您可以添加盒碰撞器,可能使Player发生爆炸的。怎么弄都可以的!
选择您创建的第一个空的游戏对象。单击其Hierarchy 中的名称,重命名为Top Barrier。在Inspector中设置其位置为以下: X: 2.3 Y: 8.21 Z:0.对于其Scale,指定下列值:X:48.27 Y: 2.33 Z: 2.33.
这些都是由统一使用的基本单位。在 3D 空间中,在Unity的一个单位对应一米,在现实生活中。采用Unity 2D、 你可以对应到实际像素单位。若要了解更多关于这,
注:在 2D 游戏中,Unity忽略 Z scale 和所有碰撞器碰撞有无限的 z 深度,所以无所谓什么 Z 值。接下来,在Tag 标签下拉列表中,选择添加标签.Add Tag.
ags and Layers对话框应出现与扩大的标签部分。单击加上签名,然后将名称添加:Barrier。当你工作的碰撞时,在教程的后面这将是重要。
一旦你添加了新的标签,在Hierarchy 中选择Top Barrier,从标签下拉列表,选择的Barrier。看起来应该类似于以下内容:
在Hierarchy选择第二个空的GameObject 重命名为:Left Barrier.
在 Inspector设置位置为:X: -14.68 Y: 1.23 Z: 0.和设置Scale为:X: 2.33 Y: 30.17 Z: 2.33. 从Tag 下拉选择 Barrier.
同样选择第三个空的GameObject重名名为:Right Barrier. 在面板Inspector设置位置为:X: 15.6 Y: 1.23 Z: 0和设置Scale 为:X: 2.33 Y: 30.17 Z: 2.33. 设置Tag为Barrier.
祝贺你弄完了, 现在应该是看看反弹的效果了effector.
effector效果的事情 在Unity5 effector是总是应用在精灵上。你有四个种类的effector可供您使用。
Surface Effector:表面效应: 沿碰撞器的表面施力,允许您创建像表面的东西移动。
Point Effector:点效应: 定义点,可以吸引或排斥的使用force。
Area Effector地区效应: 适用于特定区域内的定向force。
Platform Effector平台效应: 可帮助您创建平台式游戏平台,完成与单向碰撞和设置的选项,来控制摩擦和弹力的平台边缘。Unity提供了很好地突出了一切你可以用效应器的图像:
为你的障碍,您将使用区域效应,所以,当这艘船飞进效应器这基本上会把这艘船反弹回去。为了使效应器工作,相应的游戏物体需要附加到它的碰撞体。碰撞体必须是一个触发器,并且碰撞体必须标记为要使用的效应。如果这些条件得不到满足效应器是不工作的,并且Unity会让你知道。
要做到这一点,在Hierarchy中选择Top Barrier和首先将Box Collider 2D 组件添加到它身上。在Inspector,请检查这碰撞体是触发器和效应器使用的选项。接下来,向它添加Area Effector 2D 。你Top Barrier 应如下所示:
注意: 您会发现地区效应有一大堆的选项,并且我敢打赌,你想要简要地了解它们。Collider Mask确定那些层将会受到影响,当对象进入该地区。现在,将保持选中所有对象。Force Direction确定力的角度方向。值的范围从-359.99 到 359.99,它真的只是定义一个圆顺时针或逆时针的方向移动。下面的图像显示,作为零指向移动逆时针沿圆 ;负值表示顺时针移动。
Force Magnitude允许您设置该地区的力量强度,虽然力变化允许您定义一个范围,以提供一些随机分配到force 的每一次碰撞。、角阻力的选项允许您进一步自定义该地区的影响。事实上,你可以使用仅拖动值和没有力值创建减缓输入的任何对象的面积。Force Target确定在哪个对象上的点力获取应用。当设置为刚体,forces 适用对象的重心,而将它设置为碰撞体适用在碰撞点处的force。
现在回到创造这个游戏。选择Top Barrier,设置它的 Force Direction为 270。这意味着该force 将向下推。接下来,将力的大小Force Magnitude 设置为45。这将压低这艘船,但不是很难的玩家会失去控制。
运行场景和飞起来了。你会发现当你撞到天花板你被反弹回来后。
现在做相同Left Barrier 和Right Barrier。
实现你的防御 让我们面对现实吧,如果你有了外星人的宇宙飞船,威胁你的城市,你想要它离开。对付外星人的威胁是用一连串的导弹射击打它。 我已经创建了导弹与相关联的粒子系统。你的工作是为了让它飞。有很多方式做到这一点,但Unity5 有更简单的方法去做。从Prefab 的文件夹中,将导弹missile 拖到场景。把它放在建筑物附近所以你可以看到它的起飞。
若要使这种导弹飞,您将添加一些不小的力量。Unity使这成为可能与推出的Constant Force 2D组件,超出你的预料: 它不断地适用特定数量的force。在Hierarchy中选定missile ,添加一个Constant Force 2D组件。你有三个选项:
Force: 力: 取某个值并将其应用相对于世界坐标
Relative Force:相对力量: 定义相对于该对象的本地坐标系统的力
Torque: 扭矩: 用于创建角运动的力
让导弹仍处于选中状态,设置上图组件,将Force的 Y值设置为20。单击Apply 将此更改保存回预置体。
现在运行场景,导弹发射,但是当它撞到顶部,反弹下来,仍保持着跳跃。显然刚刚设置的物理定律应该与导弹无关。因为顶部壁垒只该影响这艘船,所以要正确的设置一下:
在Hierarchy中选择Spaceship,并单击Add New Layer.
你会得到提示,是否应用到飞船的child。单击是的改变child。这意味着层值将应用于任何此对象的子对象。
接下来选择Hierarchy面板上的 Top Barrier
在组件Area Effector 2D 上, 单击 Collider Mask. 取消一切,只选择Spaceship。(最快的方式做到这一点是首先选择Nothing,然后选择Spaceship.)
现在,效应器将只是在船上工作的。
一个单一的导弹对飞船是足够的警告,但是如果你想要打下来外来入侵者,你会需要更大的火箭显示。为你已经准备了一个GameManager对象。在Hierarchy中选择GameManager ,你会看到几个字段。
Game Manager中的Missile 字段引用着missile prefab ,当运行时创建火箭. 从Prefab 文件夹, 拖拽missile 到这个字段。
Max Missiles字段确定多少导弹一次显示在屏幕上。默认值是 10,但感觉自由地增加它,如果你感觉有点虐待狂 ;当你在处理未知的情报时,10 是有点保守。 最后,Max Time Between Missiles是你想要每一次导弹发射之间传递时间总量。默认值为 5 秒,但再一次,如果你正渴望对外星人的惩罚吧就降低的价值。
导弹的地方,选择Hierarchy 中的导弹并从您的场景删除它。
运行场景。马上,事情变得有趣。当然,你有导弹到处飞,但外星人在某种程度上毫发无伤。还有没有碰撞检测,所以入侵者都是从你微不足道的进攻性措施有效免疫。
此外,如果继续看,你会发现有一些导弹是从左翼到右翼的曲线运动。这是故意的还是代码中的错误?
不要太紧张,导弹明显是受到力的作用了,这是因为我们还没有设置Left Barrier和 RightBarrier 的Collider Mask中的area effectors 。 在前面我们只是设置了 Top Barrier。
它是一个意外惊喜。它提供随机的难易的程度,因此玩家必须考虑飞亦可垂直飞行的导弹和随机从左到右。
为飞船配置炸弹:
对于此任务,需要一颗子弹发射器配在外星人的飞船。在你Prefab 的文件夹中查找并拖动bullet 到您的场景的子弹。你想要你的子弹飞下来。为子弹bullet添加组件Constant Force 2D,并将其Force’s 的 Y值设置为-20。点击Inspector 上面的Apply。然后,从你的场景中删除子弹。
现在填写飞船发射子弹的代码:
打开ShipController.cs脚本, 添加实例变量船发射子弹的代码:
public GameO
public GameO
private bool isAlive =
launcher存储子弹的起始点。通过使用一个游戏对象,你可以直观地确定要射的子弹的位置。bullet包含对子弹的预置体的引用。最后, isAlive是一个简单的标志,指示Player是否活着还是死了。接下来,在Update(),添加以下内容:
if (Input.GetKeyDown(KeyCode.Space))
if (isAlive) {
Instantiate(bullet,launcher.transform.position, Quaternion.identity);
这段代码,宇宙飞船开始发射一枚炸弹,每次玩家按下空格键时,前提飞船没有被摧毁。在Hierarchy中选择宇宙飞船,并在Inspector中的Ship Controller (脚本)组件,您将看到的Launcher 和Bullet 的字段。飞船有一个子游戏物体命名Launcher。将此子对象拖动到飞船的Launcher 字段。此外,子弹从Prefab 文件夹拖动bullet到飞船的Bullet 字段 。
为飞船爆炸做准备!打开ShipController.cs和向类中添加以下实例变量:
private SpriteRenderer spriteR
private ParticleS既然你需要船爆炸,你需要访问的 SpriteRenderer 和 ParticleSystem 的组件。在Start(),请添加以下内容:
explosion = GetComponent&ParticleSystem&();
spriteRenderer = GetComponent&SpriteRenderer&();这使您能够访问您的代码中的组件。接下来,添加下面的方法:void OnTriggerEnter2D(Collider2D collider) {
if (isAlive && collider.gameObject.tag != "Barrier") {
shipRigidbody.velocity = Vector3.
spriteRenderer.enabled =
explosion.Play();
由于所有的碰撞体都是触发器,则使用OnTriggerEnter2D。首先,你检查Player是否还活着,该触发器不是一个障碍barrier。如果玩家不是活着的,设置Player的速度为零。这样在太空中由此产生的爆炸会保持固定。接下来,您禁用 SpriteRenderer组件,有效地隐藏在视图中的飞船。然后你开始爆炸粒子系统,以标示这艘船已经牺牲。最后,您标记Player是死的。运行现场和在移动的宇宙飞船!
出现尴尬的一幕,飞船被自己的子弹击中,解决问题吧1
要解决此问题,请选择Prefab 文件夹中的子弹。像你早些时候一样的,在Inspector 中,创建一个Add Layer。名称的为Bullet,然后将这个新的图层分配给bullet prefab。最后,选择Edit\Project Settings\ Physics 2D,,然后你会看到一大堆的物理选项。你在图表底部有兴趣,该值指示layers 层是否可以彼此交互。
取消选择Spaceship 和Bullet ,以指示这些layers 上的物理对象不应该发生碰撞的交集处的复选框。这些在Unity5之前就有了,但当然值得一提。
销毁的声音: 首先,添加一个小的背景音乐。在Hierarchy 中选择GameManager ,并向其添加Audio Source组件。从Sounds 文件夹中,将backgroundMusic拖动到声音源的AudioClip字段。请检查Loop 复选框。运行
当您运行场景时,你应该听到的音乐。现在,对于一些声音效果。Audio Sources已添加到必需的对象和他们的 AudioClips 已经到位。首先,添加当建筑倒塌的声音。在Scripts 文件夹中,找到Building.cs ,在 MonoDevelop 中打开它。将下面的实例变量添加到Building类:
private AudioSource collapseS
您将使用collapseSound来存储对该建筑的AudioSource组件的引用。已经列入的起始项目的建筑有其AudioSource添加。接下来添加以下Start():collapseSound = GetComponent&AudioSource&();这获取到AudioSource的引用,所以您可以在代码中调用它。接下来,用以下内容替换Update()的内容:if (isDestroyed && onScreen()) {
transform.position = new Vector3( transform.position.x,
transform.position.y - Time.deltaTime * speed,
transform.position.z);
if (!collapseSound.isPlaying) {
collapseSound.Play();
} else if (isDestroyed && !onScreen()) {
collapseSound.Stop();
如果该建筑是在屏幕上,指定为销毁,这段代码检查以看collapseSound 是否播放。如果不是,就可以开始播放,然后移动大厦离屏。保存该脚本并回到Unity。运行场景,当你摧毁一个建筑,你应该听到崩溃的声音。接下来,打开ShipController.cs在 MonoDevelop中,并向类中添加以下实例变量:public SoundManager soundM在Update(),添加下面的行,上方的行调用Instantiate:soundManager.DropBomb();现在将以下行添加到之前设置shipRigidbody.velocity OnTriggerEnter2D(),:soundManager.ExplodeShip();
当这艘船爆炸的时候,那应该添加声音很好听。在Hierarchy中选择的Spaceship 。现在,您会看到一个Sound Manager字段。将Hierarchy 中SoundManager的游戏对象拖到Sound Manager字段。
从Scripts 文件夹中,在 MonoDevelop 中打开Bullet.cs 。当你做过,添加一个实例变量来存储组件的引用:
private SoundManager soundM在Start():函数中添加代码:
GameObject gameObject = GameObject.Find("SoundManager");
soundManager = gameObject.GetComponent&SoundManager&();
通过将以下行添加到OnTriggerEnter2D(),只是在调用explosion.Play():soundManager.HitBuilding();
Unity5 的音频混音器 在以前版本的Unity,你将不得不调整level 的每个AudioSource,而在Unity 5,您可以调整它们从一个中央位置调整Audio Mixer。 你可以在你的项目中,有几个mixers 。选择您Sounds 的文件夹,然后右键单击它并选择Create\Audio Mixer.。命名新对象Game Mixer.若要查看该混合器mixer,请双击它,或者选择Window\Audio Mixer ,使下方的面板上:默认情况下,所有搅拌机mixers 都在一组称为主组,您一次可以应用effects 到所有的音频源。
例如,每个组具有应用于它允许您更改组的大小,甚至在游戏进行过程中的衰减效果。搅拌机mixer 伟大的事情之一就是在编辑器中,玩游戏时所做的当你停止播放将更改保存。这允许您调整音频,直到它是完美的,以便您可以恢复它们,当你停下来。
你要添加几个组。单击Groups的 加号创建一个新组,并将其命名Music。请再次单击加号按钮,然后创建一组命名的Sound Effects。最有可能的是,您的组看起来像那些如下所示:
新创建的组是作为当前所选择的组的子节点children ,当您创建第二个新的组,所以它成为了Music的一个孩子。这不是真正想要的效果,若要修复,只需拖动Sound Effects 组出Music ,并重新设置其父级为Master 。现在选择Sound Effects组并添加新的子组,命名为崩溃的大厦Collapsing Buildings。现在,您应该看到三个搅拌器mixers:
现在您需要将搅拌机mixer 组分配给每个在你的场景中 AudioSources组件上。首先,在Hierarchy中选择GameManager ,然后看看它在Inspector中的Audio Source 组件。单击打开右侧圆的输出字段以打开选择 AudioMixerGroup对话框,然后选择对话框里面的Music 。
您需要直接音频输出到每个大厦到Collapsing Buildings组。 在Hierarchy 中选择BuildingA ,然后按住 shift 键单击BuildingH
一次选择所有建筑物 (BuildingB, BuildingC, BuildingD, BuildingE, BuildingF, BuildingG, 和BuildingH))。这一招可以同时编辑所有选定对象的公共字段。 在Inspector中设置的Audio Source组件的输出字段为Collapsing Buildings..最后,将SoundManager音频源的输出设置为Sound Effects组。现在,运行你的场景。你的混频器mixer 将会苏醒过来。
若要更改级别Level,请单击Audio Mixer面板顶部的Edit in Play Mode按钮。请牢记你的场景同时要Play。一旦你按下该按钮,您可以更改Level。如果你将一组的音量调低,这将降低所有的小组音量。
在音量控制下面有三个按钮。 S 按钮意味着独奏曲Solo。它沉默所有其他轨道。M按钮静音的代名词,并允许您只是沉默那条轨道。按B键代表,它允许您忽略任何您已经添加到轨道的音频效果。
要向组中添加效果,只需单击Add… 按钮以提供一系列的影响。要试试它,单击Collapsing Buildings下方的按钮 Add…并添加 Echo 效应。
现在轰炸建筑成灰烬,听到建筑的效果。
在这一点上,随时玩你的游戏,并继续完善。在 GameManager,暂时最大导弹将值设置为0所以你可以专注于对死亡的恐惧音频。你只滑动表面的Unity的新的音频混合器。此外可以做事情,比如隐藏组并将其保存为视图可帮助您专注于不同的编辑任务,并拍下快照来保存不同的设置组 — — 进行比较或只是为了不同的情况。在这里下载。
本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
《Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新》 下拉刷新在如今移动开发中应用如此广泛和普遍,以至于谷歌干脆在SDK中给予支持。在android-support-v4包中,谷歌增加了SwipeRefreshLayout,该组件提供基础的下拉刷新表现能力和开放出来供开发者调用的基本接口。现在给出一个简单的代码例子加以说明。 代码工程简要说明:以一个SwipeRefreshLayout包裹ListView,SwipeRefreshLayout接管ListView的下
好久没有写博客了,以后多写些博客,对自己是一种提升,对大家也是一种帮助
最近特别痴迷storyboard和xib的可视化编程,在写项目的时候遇到个问题就是如何使UILabel自适应高度,查了好多文章博客,没有太好的办法,我就自己手动搞了搞,实现了自己想要的效果,下面分享出来
相信大家都遇到这种情况,label没有根据text的字数来自适应高度
那么如何使UILabel自适应高度呢?
在可视化编程下我们需要这么做
转载请注明出处,谢谢 http://blog.csdn.net/harryweasley/article/details/ 本篇博客的主要目的,是介绍怎样将数据库文件保存到手机系统文件,并且可以显示各个省市地的名字。 数据库一共有三个表,他们分别是(后面我将上传整个文件和数据库文件) 省表 CREATE TABLE IF NOT EXISTS `fs_province` ( `ProvinceID` bigint(20) NOT NULL, `ProvinceName` varchar(5
Linux中的文件权限很重要,如何查看和修改文件的权限呢? 1. 查看权限
主要使用ls命令,即list查看文件的详细信息。具体ls命令的详细使用方法可以man到,我们经常用到的就是: ls -al
查看当前目录下所有文件的详细信息;(-a表示所有文件,-l表示详细信息) 那么输出结果是什么呢?如下: drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh 上面这条结果就包含了ls查询所有文件的详细信息,那么每个字段都代表什么意思呢? 所有的信息包
最近流行的一种界面效果,是瀑布流的header固定,也叫sticky header或者parallax。对于UITableView,可以比较方便地让table header固定,但是对于UICollectionView,原生的iOS API比较难以实现。本文推荐一个开源组件,专门用于实现这种效果: CSStickyHeaderFlowLayout 整体效果 贴个整体示意图 配合autolayout使用 首先需要注意的是,这个组件必须配合autolayout来使用。比如整个header分为4个部分,我想固定
核心动画 标签(空格分隔): ios进阶 Core Animation,中文翻译为核心动画,它是一组非常强大的动画处理API,使用它能做出非常炫丽的动画效果,而且往往是事半功倍。也就是说,使用少量的代码就可以实现非常强大的功能。 Core Animation是直接作用在CALayer上的,并非UIView 核心动画的框架结构 Core Animation的使用步骤 如果不是xcode5之后的版本,使用它需要先添加 QuartzCore.framework 和引入对应的框架 QuartzCore/Quart
在我们实际开发当中,会碰见一些布局结构类似或者相同的界面,例如应用的设置界面、tab按钮界面等。这时候,对于初学者来说,xml里面一个个绘制出来或许是最初的想法;可能随着经验的积累,又学会一招,就是使用include标签,导入类似或者相同的布局,提高了性能又减少了代码;再以后呢,自定义控件又可以实现这一目的。本文就是简单的使用自定义的组合控件模仿猫眼底部菜单栏。
1.自定义组合控件属性:在res/values目录下创建attrs.xml文件 declare-styleable
Android基础入门教程——1.2 开发环境搭建 标签: Android基础入门教程 现在主流的Android开发环境有: ①Eclipse + ADT + SDK ②Android Studio + SDK ③IntelliJ IDEA + SDK 现在国内大部分开发人员还是使用的Eclipse,而谷歌宣布不再更新ADT后,并且官网也去掉了集成Android开发环境的Eclipse下载链接,各种现象都表示开发者最后都终将过渡到Android Studio,当然这段过渡时间会很长,但如果你是刚学Andr
比如我现在知道一个点的经度和纬度了,然后我想算出以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度,请问怎么算呢? PHP代码我网上找了一个算出来好像不对呀 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 获取当前位置三公里内最大、最小经纬度
* 查找一定范围内的经纬度值
* 传入值:纬度
上门洗车APP --- Android客户端开发 之 项目结构介绍 前言 虽然公司项目较紧,但还是抽出时间给大家继续更新。
o_O"~ 感谢大家的关注,很高兴和大家共同学习。 前面给大家分享了项目中的以下内容: 上门洗车APP --- Android客户端开发 前言及业务简介 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(一) 上门洗车APP --- Android客户端开发 之 网络框架封装介绍(二) 之前有很多朋友私信过来说想打包一份源码学习,由于本项目也是还在开发
Copyright (C)
ITfish.net刚体如何做匀速直线运动?【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:81,955贴子:
刚体如何做匀速直线运动?收藏
看例子void FixedUpdate ()
rigidbody.AddForce(new Vector3(0,0,500));
}这样子貌似就做z轴的直线运动了。但是:1、如何做匀速运动呢,上面这种是加速运动吧?2、如何做到指定速度的匀速运动,比如8米/s的直线匀速运动这样。3、如何获得当前物体的运动速度?我这样子写void FixedUpdate ()
rigidbody.AddForce(new Vector3(0,0,500));
Debug.Log("speed:" + rigidbody.velocity.ToString());
打印出来的速度是(0.0,0.1,0.0)
,我根本没有y轴的力,为什么会出现y轴的速度呢?而且z轴的速度却是0。物体实际运动是正常的,在z轴移动了,就是这个打印出来的值不正确。4、我把给的力调成100,发现物体移动一段时间就停止了。上面这段代码的意思不是持续性地给一个500N的力吗?我物体摩擦力设置为0,应该物体做匀加速直线运动啊,怎么会停止呢?
匀速运动就不用加力了,rigidbody.transform.position();不就可以了,每一帧set位置的时候要记得计算位移距离,如果你想让速度是x方向为v的话,那么对于x方向来说v*Time.deltaTime就可以了,用力来操控速度其实也很简单,不过需要比较复杂的物理计算。
好吧,没有看到你的项目有些东西不好说,首先说匀速运动吧,其实对于物体来说匀速运动和静止状态是不受力的,你可以给一个物体一个力使他的速度达到一定值之后,把这个里去除,如果不受力物体就会匀速运动了,Y 方向的力,多半有可能是重力导致,如果不想让物体受重力影响把UseGravity点掉就可以了。
我的工程很简单,就是一个cube放在另外一个大的cube上,想让他移动。我现在改成这样
void FixedUpdate ()
float axisV = Input.GetAxis("Vertical");
if(axisV * rigidbody.velocity.z & maxSpeed)
rigidbody.AddForce(new Vector3(0,0,axisV * moveForce * Time.deltaTime));
if(Mathf.Abs(rigidbody.velocity.z) & maxSpeed)
rigidbody.velocity = new Vector3(rigidbody.velocity.x, rigidbody.velocity.y,Mathf.Sign(rigidbody.velocity.z)
Debug.Log("speed:" + rigidbody.velocity.ToString());
}一直按前进,就会给物体一个前进的力,能实现达到一个最大速度匀速的状态,但是有两个问题:1、不知道为什么,我只给了z轴的力,现在x轴会有速度,而且速度还不小,z轴速度有8的时候,x轴的速度有12、我放开按键,不再给物体作用力,但是为什么物体会慢慢停下来呢?我rigidbody的drag和angular drag值都设为0了,应该没有阻力了啊。
我发现是我取刚体的速度值有问题。我以为rigidbody.velocity是刚体的移动速度,但是好像不是这样的。现在物体无视重力,不和其他物体接触。代码:void Update () {
Debug.Log("update speed:" + rigidbody.velocity.ToString());}void FixedUpdate (){
float axisV = Input.GetAxis("Vertical");
rigidbody.AddForce(new Vector3(0,0,axisV * 1000 ));
Debug.Log("fixed speed:" + rigidbody.velocity.ToString());}两个输出的值不一样。。如果我一直按住前进的话,update中输出的值最后会稳定在(0,0,20)这样子,但是fixedupdate中输出的值(0,0.1,0)~(0,0.2,0)这样子,明显不准确。最终有两点疑问:1、如何正确获得刚体的移动速度。。我看官方的赛车例子,直接在fixedUpdate里面使用rigidbody.velocity这个值来判定速度的。2、为什么放开前进按钮,不再给物体施力后,物体运动就停止了。现在又没有摩擦,也无阻力啊。
我找到为什么速度这么奇怪的原因了。如果我单纯的使用cube,那么物体运动是会合乎物理学的,速度值输出来在fixedupdate中和update中也会一样。但是现在我是用了3D Platformer Tutorial包里面的Lerbz模型,还是用了他自带的动画。就是这些动画造成速度值不正确,把这些动画去掉了就好了。但是现在又有问题:1、为什么使用重力,当我加z轴方向的力的时候,x轴会有速度?不使用重力才正常。2、我使用了idle、run两种动画,为什么这些动画会影响刚体的速度?我要怎么调呢?看吧主的视频里,我把动画的Bake Into Pose这选项勾选了。
我穿越好几年了,刚体还是玩不转!
登录百度帐号推荐应用}

我要回帖

更多关于 unity3d 刚体不受重力 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信