在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);
}
答案 0 :(得分:0)
没有看到/知道other
是什么,很难说,但通常会有两个问题:
transform.position-other.transform.position
实际上并未导致您期望的方向。要确定这一点,请打印该值或使用Debug.DrawRay
显示该值。答案 1 :(得分:0)
var force = transform.position - other.transform.position;
你将获得一个方向向量来获得其他位置。所以你正在进入碰撞,逆转矢量应该解决你的问题。
答案 2 :(得分:0)
当您使用AddForce修改此处的物理值时,您应该在FixedUpdate中执行此操作以最大程度地降低bug的风险。 (它可以在FixedUpdate之外工作,但在大多数情况下会产生不需要的行为。)
在你的代码中使用AddFroce,但是如果gameObject的实际力大于此值,你添加的力只会减慢游戏对象的实际移动而不会反转它。
我认为改变游戏对象移动的最佳方法是使用速度向量并反映它。
还有一条建议:不要将物理学用于游戏系统。物理学是非常强大的东西,它可以带来很多紧急行为,但它是一个混乱的系统。当它涉及游戏玩法时,你不想要混乱,你想要控制和一致性。
Unity doc: