我开始慢慢掌握 Unity(当然是基于 YouTube 的指南)。我正在用立方体制作一个简单的拼图。目标是拉出红色立方体。
Rigidbody所有立方体都用Box Collider零摩擦材料悬挂。
问题在于,当一种类型的三个或更多立方体被推入另一种类型时,即使没有初步加速,它们也只是被推过它。此外,如果立方体少于三个,则一切或多或少都能正常工作,尽管仍然尝试通过)

看起来很有趣,但他们不应该这样做。我尝试改变 yRigidbody Interpolate和Collision Detection,没有效果。
我用谷歌搜索,但没有找到答案(很可能我谷歌搜索得不好)
另一个额外的问题是:如何确保立方体在移动时不会卡在角落?在舞台上,我似乎把一切都安排好了Freeze Rotation,Freeze Position但他们还是撞到了一起。到目前为止,我刚刚将预制件的碰撞器从 1 减少到 0.99,但它工作不可靠,而且看起来很歪。
我附上了脚本,它对于所有多维数据集都是相同的:
using System;
using UnityEngine;
public class CubeMovement : MonoBehaviour
{
[SerializeField] KeyCode moveForwardKey;
[SerializeField] KeyCode moveBackKey;
[SerializeField] Vector3 moveDirection;
private AudioSource audioSource;
private Rigidbody rb;
public static event Action OnTrigger;
void Start()
{
audioSource = GetComponent<AudioSource>();
rb = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
if (Input.GetKey(moveForwardKey))
{
rb.velocity += moveDirection;
}
if (Input.GetKey(moveBackKey))
{
rb.velocity -= moveDirection;
}
}
private void OnTriggerEnter(Collider other)
{
if(this.CompareTag("Player") && other.CompareTag("Finish"))
{
if (OnTrigger != null)
{
OnTrigger.Invoke();
}
}
}
private void OnCollisionEnter(Collision collision)
{
audioSource.Play();
}
}


每次你ADD速度,也就是说,如果你等待很长时间,它就会变得非常大,并且由于蓝色物体没有时间抛出绿色物体,它会简单地传到最后并飞起来,因为当它位于边缘时,它会向上推,因为它位于下方,并且物体已达到其完整高度并且只能向上
我读了“相关”最底部的帖子,是的,AddForce 有一个正确的动作,所以我认为它会起作用
顺便说一句,如果你用 AddForce 做所有事情,那么对象的移动应该是固定的,因为事实上它会由于物理原因而休息,并且只需添加一个进入块的方向,块就会将其推出并移动有点
我认为整个初始脚本看起来不可靠,有很多错误:
下面是所有更改的代码和通常的代码,只是固定的运动(可能)
默认值:我假设由于您直接添加速度而不是通过方法,所以会发生这种情况。尝试 AddForce,它有两个重载 更多详细信息
ForceMode的含义如下:
我提供了这段代码(我还添加了一些小的更改,例如:添加了访问修饰符)
变更列表:
我还建议分担此脚本的责任(它做了太多事情,特别是因为每个立方体都跟踪一个键)并且我也不建议通过标签进行检查;最好将碰撞对象传递给事件,而不是检查 null,你可以执行 OnTrigger?.Invoke( ) 这是我建议的划分方式:
Player.cs - 挂在播放器上:
Cube.cs - 挂在所有立方体和播放器上:
Finish.cs - 挂在终点:
KeyController.cs - 挂在舞台上的一个对象上,例如挂在一个空对象上(您也可以编写 Singleton (此模板保证该类只有 1 个实例)(PS:我修改了问题并意识到可以是其中几个用于不同的动作,所以还有什么很好,我没有花时间在单例上)(所有加载都在场景顶部(我不记得它叫什么,但你可以这样做,这样当场景被卸载时,脚本将保留并转到另一个),删除重复项等)但我不会)
我希望我有所帮助,无论如何,请添加访问修饰符;另外,如果您使用第二个选项(也是第一个选项),则添加命名空间)
例子:
网站上写代码不方便,也没有办法检查,可能会出错(而且服务器长期用Python写,不习惯C#,可能有地方少了分号)