【发布时间】:2018-10-07 04:25:08
【问题描述】:
更新 - 添加视频
我制作了许多教程和论坛中可以看到的东西:
- 创建了我称为“
No bounce”的物理材料 - 设置
Dynamic Friction = 0和Static Friction = 0 - 创建了一个立方体并添加了一个
Box collider和Material = "No Bounce" - 设置
Mass = 1、Drag = 0和Angular Drag = 0
现在我为地面添加另一个立方体,使其非常大,并添加了 Box collider 和 Material = "No Bounce"
我有两个问题:
- 当它们碰撞时,立方体会反弹(而我的配置不应该)
- 我制作了一个脚本并将其附加到立方体上,以更改速度,并在发生碰撞时将其设置为0:
using UnityEngine;
public class CubeProperties : MonoBehaviour
{
private Rigidbody _rb;
private bool _landing;
private void Start()
{
_rb = GetComponentInParent<Rigidbody>();
}
public void OnCollisionEnter(Collision collision)
{
Debug.Log("Collision");
_landing = true;
}
public void FixedUpdate()
{
if (!_landing) {
return;
}
_rb.velocity = Vector3.zero;
_landing = false;
}
}
所以在第一次碰撞时,我尝试使用_rb.velocity = Vector3.zero; 立即停止立方体。但是改变速度没有效果,我不明白为什么。我已经尝试了很多价值来看看会发生什么……但什么也没发生。
我唯一可以添加并且可以正常工作的是:AddForce() 我尝试了一个负值,但这也不起作用。
我忘记了什么?
这是一个视频,我希望这很容易理解(我希望可以帮助我制作一个视频):
【问题讨论】:
-
我不太了解 Unity,但从纯物理学的角度来看,friction=0 意味着像冰一样滑的东西,与物体是否反弹无关。我希望弹性常数被称为“恢复系数”或类似的。
-
Unity 没有正确使用物理命名,例如你可以搜索他们如何使用单词“
Mass”进行基于物理的计算... -
查看视频中的设置(并了解一些统一系统的怪癖)。您可以将其从 OnCollisionEnter 更改为 OnCollisionStay 以尝试一下吗?如果可行,我有另一个想法。
-
你真好,我稍后再试,但现在我已经“带回”了“手动”移动立方体的旧代码,并解决了我的小算法问题。立方体随我的代码掉落 = 没有重力,也没有碰撞检测:我通过代码阻止它们。现在,在解决了优化问题之后,这就像一个魅力(用 Unity 的话说:C# 发明了垃圾收集器,让你的生活更轻松,代码更少,但最终它通常很糟糕,你最终会写出丑陋的代码来避免 GC 工作!并且最终的代码比干净的分配/免费代码丑)
-
我的另一个问题可能与我的问题有关,即我没有“一个单位 = 一米”。相反!我做了一个 900x1600 的分辨率,在 Unity 中,分辨率为 900 米 x 1600 米。因此我的球体有 100 米高!所以,当然有单位问题,移动一个 100m 的物体是慢,物体下落很慢。一切都是现实的,所以我的第一件事就是将一切缩小到正确的“一个单位 = 一米”。