【问题标题】:2D collision detection when using transform.position. How to enable?使用 transform.position 时的 2D 碰撞检测。如何启用?
【发布时间】:2019-11-15 11:59:12
【问题描述】:

我刚从 unity 开始,并关注了 2D UFO 示例项目。 为了扩展它,我想出了一个奇怪的方法来控制我的播放器。

它总是在圆形路径中移动,一旦我点击一个按钮,圆的方向就会改变,想象的圆心会被转换,如下图所示。这可以让你以 8 字形或 S 形图案移动,非常有趣。

然而,一旦我弄清楚如何做这个动作,玩家对象就不再有任何碰撞检测了。 在原始示例中,整个 movemet 处理是在 FixedUpdate() 中完成的。但是,我使用了 Update(),因为前者似乎根本不适用于我的代码(即根本没有移动)。

这是我到目前为止的运动代码:

public class ControlledRotation : MonoBehaviour
{
    public float radius = 3f;
    public float speed = 3f;

    private float timeCounter = 0;
    private float direction = 1f;
    private Vector3 offset;

    private Rigidbody2D rb2d;
    void Start()
    {
    offset = transform.position;
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.RightArrow))
        {
            //change the offset from the circle center and the rotation direction on keypress
            offset += new Vector3(Mathf.Cos(timeCounter), Mathf.Sin(timeCounter), 0) * radius * direction * 2;
            direction *= -1;
        }
        timeCounter += Time.deltaTime * direction * speed;
        transform.position = new Vector3(Mathf.Cos(timeCounter), Mathf.Sin(timeCounter)) * radius * direction + offset;    
    }
}

Plyer 对象有一个 Rigidbody 2D 和一个 Circle Collider 2D。它应该碰撞的墙壁具有 Box Collider 2D。然而,不明飞行物可以简单地穿过墙壁。 我假设一个可能的原因是我只是更改了 transform.position 或者因为我使用了错误的 Update/FixedUpdate。

如果您对我如何保持我选择的运动控制机制并且仍然能够与物体发生碰撞有任何建议,我将不胜感激:)

编辑: 我觉得我需要使用刚体并施加一些力......但我还没有想出如何用力来重现这个运动,而且力似乎也不是超级清晰的响应

【问题讨论】:

  • 你有可能触发了吗?
  • 不涉及触发器
  • 刚体和圆的问题是默认情况下不是它们的自然运动,除非..你把东西分成两部分,所以父部分是你当前圆的半径,你申请扭矩使其旋转,孩子也就是你的实际部分,四处移动,然后移动半径,听起来很乱,但这会奏效 - 我想认为有一个更简单的想法
  • 哇,是的,我想到了一些类似的东西,但这真的很复杂。我看了看触发器,并决定我根本不需要刚体来工作,对吧?我可以简单地使用触发器和对撞机吗?还是我有其他误解?

标签: c# unity3d path 2d collision


【解决方案1】:

当您需要移动具有刚体的对象时,您需要使用力来移动它,您不能仅使用 transform.position 来移动它,它会忽略物理。这就是为什么您无法检测到碰撞的原因。我建议您像那样移动它。当我不得不移动需要与物理交互的角色时,我举了一些例子。

gameObject.GetComponent<Rigidbody>().velocity = Vector3.zero;

而这个是为了向某些方向移动它:

//Keys for controlling the player (move and shoot) only when he's alive
if (Input.GetKey(KeyCode.UpArrow) && alive)
{
  GetComponent<Rigidbody>().MovePosition(transform.position + Vector3.forward * Time.deltaTime * 4);
}
if (Input.GetKey(KeyCode.DownArrow) && alive)
{
 GetComponent<Rigidbody>().MovePosition(transform.position + Vector3.back * Time.deltaTime * 4);
}

希望对您有所帮助.. 问候 :)

【讨论】:

  • 谢谢!我有点想这两个不会真的很好地合作。现在的问题是,如果我使用你的方法并改变它以使力形成一个圆圈,或者我是否找到了一种根本不使用刚体的方法,并且仍然以某种方式检测我是否撞到了墙壁或其他游戏对象
  • 根据this page :theappguruz.com/blog/… 有两种可能的解决方案。其中之一是制作刚体运动学并捕获触发事件。
  • 是的,有帮助!我想我现在可以使用运动刚体和玩家对象上的触发对撞机以及墙壁上的非触发对撞机来工作
猜你喜欢
  • 2011-05-24
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
相关资源
最近更新 更多