【问题标题】:Object change direction after collide with controller物体与控制器碰撞后改变方向
【发布时间】:2017-12-13 22:30:49
【问题描述】:

在 Unity3D 中,我有一个游戏对象,它附有一个盒子对撞机和物理材质。手控制器模型还附加到盒子对撞机和物理材料上。当游戏对象与手控制器发生碰撞时,CollideWithController 会登录控制台。但是,游戏对象不会改变方向。

if (other.CompareTag("HandController")) 
{
    Debug.Log("CollideWithController");
    var magnitude = 1000;
    var force = transform.position - other.transform.position;
    force.Normalize();
    gameObject.GetComponent<Rigidbody>().AddForce(force * magnitude);
}

【问题讨论】:

  • 请将您的代码发布为实际代码,而不是屏幕截图。有关格式说明,请参阅Markdown Editing Help

标签: c# unity3d


【解决方案1】:

没有看到/不知道other 是什么,很难说,但通常可能有两个问题:

  1. transform.position-other.transform.position 实际上并没有达到您期望的方向。要确定这一点,请打印该值或使用Debug.DrawRay 显示它。
  2. 您添加的力可能不足以改变方向,或者有其他力抵消它。

【讨论】:

  • 'other' 指的是我希望控制器与之交互的手控制器。我试图改变力量,但仍然没有结果。实际上我意识到我没有为游戏对象设定一个新的方向?抱歉,我对编码很陌生,所以这段代码是我从其他人那里引用的。
【解决方案2】:
var force = transform.position - other.transform.position;

你会得到一个方向向量来得到其他到这个位置。因此,您正在发生碰撞,反转矢量应该可以解决您的问题。

【讨论】:

  • 反转向量是什么意思?是 var force = other.transform.position - transform.position?我已经尝试过这种矢量的反转,但是对象仍然没有改变方向?
  • 反转是指在标准化之后或之前乘以 -1。
【解决方案3】:

当您像这里一样使用 AddForce 修改物理值时,您应该在 FixedUpdate 中进行,以最大程度地减少错误风险。 (它可以在 FixedUpdate 之外工作,但在大多数情况下会产生不需要的行为)。

在您的代码中,您使用 AddFroce,但如果游戏对象的实际力大于此力,您添加的力只会减慢游戏对象的实际移动,而不是反转它。

我认为改变游戏对象运动的最好方法是使用速度向量并对其进行反射。

还有一条建议:不要在游戏系统中使用物理。物理学是非常强大的东西,它可以带来很多涌现的行为,但它是一个混沌系统。当涉及到游戏玩法时,您不想要混乱,而是想要控制和一致性。

统一文档:

【讨论】:

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