为啥用unity 3d做的物体添加Rigidbody属性,并设置重力运行后直接穿过地面,而不是停在地面上?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥用unity 3d做的物体添加Rigidbody属性,并设置重力运行后直接穿过地面,而不是停在地面上?相关的知识,希望对你有一定的参考价值。

你的物体可能是过速穿越了.
你在物体的Rigidbody组件中找到Collision Detection改成Continuous.
如果还是不行的话就试一试改成Continuous Dynamic.
(This has a big impact on physics performance, leave it set to Discrete, if you don't have issues with collisions of fast objects)
(这对物理表现有很大的影响,如果你不关心与高速物体的碰撞,那么就让其为默认的不连续模式Discrete)
场景中最好不要有过多的采用这种检测碰撞的方式.

参考资料:Unity 组件手册

参考技术A 那是你的物体勾了tigger 那个属性,或者是地面勾了那个属性。tigger是能进入内部的,通常做判断触发范围 参考技术B 物体和地面,都要添加 collider 碰撞体组件,才能产生碰撞。
rigidbody,只是用来给物体添加物理特性,比如重量重力阻力等等。

为啥在 Unity 中静音如此困难?

【中文标题】为啥在 Unity 中静音如此困难?【英文标题】:Why is it SO Hard to Just Mute a Sound in Unity?为什么在 Unity 中静音如此困难? 【发布时间】:2019-01-09 08:21:14 【问题描述】:

我整天都在寻找解决这个问题的方法,但我根本找不到。在 Unity 3D 中使用 JavaScript,我有一个脚本,当玩家在 X 轴上的速度达到某个点时,我想在其中播放声音,如果不是在那个点,那么声音将被静音。而且我相信我的所有结构都是正确的,只是那行代码说要静音不起作用的音频。我尝试了各种不同的组合,但每种组合都出现错误。

脚本如下所示:

#pragma strict

var playing = false;
var audioSource = GetComponent.<AudioSource>();

function Update () 
    if (transform.GetComponent.<Rigidbody>().velocity.x <= 2.5 && 
transform.GetComponent.<Rigidbody>().velocity.x >= -2.5)
    
        Mute();
     else 
        Unmute();
    


function Mute () 
    audioSource.mute = true;


function Unmute () 
    audioSource.mute = false;
    Sound();


function Sound () 
    if (transform.GetComponent.<Rigidbody>().velocity.x >= 2.5 && playing == 
false)
    
        playing = true;
        GetComponent.<AudioSource>().Play();
        yield WaitForSeconds(2);
        playing = false;
    
        if (transform.GetComponent.<Rigidbody>().velocity.x <= -2.5 && 
playing == false)
    
        playing = true;
        GetComponent.<AudioSource>().Play();
        yield WaitForSeconds(2);
        playing = false;
    

我遇到了各种不同的错误,但我似乎得到最多的错误是“UnityException:GetComponentFastPath 不允许从 MonoBehaviour 构造函数(或实例字段初始值设定项)调用,在 Awake 或改为开始。从游戏对象 'Ball' 上的 MonoBehaviour 'motioncheck' 调用。我不确定这意味着什么,因为我对 JavaScript 还是有点了解。

我觉得只是静音不应该这么难。我将假设这个问题的答案非常简单,而且我真的很愚蠢。这就是通常发生的事情,哈哈。

与此同时,我将继续在互联网上横冲直撞,寻找这个问题的答案。

【问题讨论】:

【参考方案1】:

你的静音代码没问题。

"UnityException: GetComponentFastPath 不允许从 MonoBehaviour 构造函数(或实例字段初始值设定项),调用它 改为唤醒或开始。从 MonoBehaviour 'motioncheck' 调用 游戏对象'Ball'。”我不确定这意味着什么,因为我仍然 有点像 JavaScript。

看这个:

var audioSource = GetComponent.<AudioSource>();

这是一个 Unity API,您必须从函数内部调用它们的函数。 AwakeStart 函数适用于初始化组件变量。

var audioSource : AudioSource;
function Start() 

    audioSource = GetComponent.<AudioSource>();


请注意,Unityscript/Javascript 现在是 discontinued。他们不再对此更新文档,您也无法再从编辑器创建新脚本。它现在仍然有效,但编译器将很快被删除。请在完全取消对 C# 的支持之前学习并开始使用它。

【讨论】:

非常感谢!它现在完美运行。我不知道 GetComponent 仅在 Start 或 Awake 函数中可用,但是,现在我知道了!是的,我会尝试学习 C#。我知道 Unity 突然摆脱了一堆 JavaScript 功能,但我不知道他们打算删除它。据我所知,C# 很像 JavaScript,所以应该不会太难。 只是一些改动,但学习起来并不难。很高兴我能提供帮助 @EthanWaldeck 此外,yield WaitForSeconds(2); 不会(或不应该)在协程之外工作。 @Draco18s 嗯。 . .它对我来说似乎工作得很好。实际上,我将那行代码放在了另一个函数中,这不是预构建的函数,特别是因为当我尝试将它放在 Update 函数中时出现了该错误。 @EthanWaldeck 我认为 Draco18s 是在扩展我的评论并告诉您在更改为 C# 时需要做出的更改或不同之处。

以上是关于为啥用unity 3d做的物体添加Rigidbody属性,并设置重力运行后直接穿过地面,而不是停在地面上?的主要内容,如果未能解决你的问题,请参考以下文章

unity3D中,给物体添加刚体后,为啥不是掉在地面上,而是穿过地形一直往下落呢?

unity3d里怎么给动态添加的物体添加贴图

unity3d用translate方法使物体移动,最后成功了为啥物体的移动速度会自己逐渐变慢?

unity3d我想把物体拖拽到脚本里为啥不行呢?如图

为啥我unity3d 用以下代码没有出现球体?

unity3d 有个官方的车的例子 速度为啥乘2.23693629?