【问题标题】:How can I make the two cubes to stop when colliding?碰撞时如何使两个立方体停止?
【发布时间】:2020-10-07 08:37:38
【问题描述】:

或者在碰撞时让它们反弹。但现在它没有检测到任何碰撞。

第一个立方体有刚体使用重力和运动学都选中启用真。 如果我禁用 Is Kinematic,立方体会掉下来。 两个立方体都附加了相同的脚本。 两个立方体都有一个盒子碰撞器,并且两者上的 Is Trigger 都未选中禁用。

这个脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Door : MonoBehaviour
{
    public Transform target;
    public float speed;

    private void Start()
    {
        
    }

    private void Update()
    {
        float step = speed * Time.deltaTime; // calculate distance to move
        transform.position = Vector3.MoveTowards(transform.position, target.position, step);
    }
}

每个立方体都有脚本,目标是另一个立方体。所以两个立方体相互移动,但从不碰撞。

两个立方体设置截图:

【问题讨论】:

  • 看看OnTriggerEnter,如果你不编码,你就不能指望任何事情发生......
  • 也许你做错了。如果您想使用物理(例如弹跳),您可以只制作一个脚本,将rigidbody.velocity 更改为始终朝另一个方向移动。然后 Unity physic 将处理碰撞和反弹。使用物理材质来改变弹性。

标签: c# unity3d


【解决方案1】:

最好的做法是设置一次rigidbody.velocity,而不是每帧更改transform.position,但无论如何,此解决方案都应该有效:

private bool collided = false;

private void Move() {
    float step = speed * Time.deltaTime;
    transform.position = Vector3.MoveTowards(transform.position, target.position, step);
}

private void Update() {
    if (!collided) {
        Move();
    }
}

private void OnCollisionEnter(Collider other) {
    if (other.gameObject.GetComponent<Door>() != null) {
        collided = true;
    }
}

这可能不是最好的方法,具体取决于您计划如何前进,但这是一种行之有效的方法。

如果你想让它们反弹,我建议使用rigidbody.AddForce() 或设置rigidbody.velocity。然后,您可以使用有弹性的物理材料,也可以将OnCollisionEnter 代码更改为在它们相互碰撞时使用rigidbody.AddForce()rigidbody.velocity

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多