假设我在2D统一游戏中拥有一名玩家飞船和一颗行星。我要使船的旋转相对于其正下方的水平面下降(例如,如果船下方的水面部分为80度,则在该点上方时船应趋向于下降至80度)。>
我目前有一种可以工作的代码:
Vector2 direction = planet.position - transform.GetChild(0).position;
float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg + 90;
rig[0].AddTorque(-rig[0].rotation + angle);
除了船的旋转从360变为0的位置(突然进行360度翻转)之外,它可以满足我的要求。我正试图弄清楚如何做到这一点。
我不想为此使用LookAt()
,因为这应该是趋向于目标方向的转矩,而不是朝该方向的捕捉设置。
答案 0 :(得分:0)
我过去使用的粗略解决方法是:
创建2个对象,并使它们成为播放器对象的子对象。
将其中一个放置在(-1,0,0)本地,并将其命名为LeftObj。将另一个放置在(1,0,0)处,并将其命名为RightObj。
现在,您可以简单地检查哪个更接近目标,从而找出哪种是最有效的转弯方式。
float LDist = Vector3.Distance(LeftObj.transform.position, target.transform.position);
float RDist = Vector3.Distance(RightObj.transform.position, target.transform.position);
if (LDist < RDist){
// Turn left
}else{
// Turn right
}
这不是最有效的方法,但是它设置简单,快速,并且可以清楚地告诉您“左还是右”,而与旋转值无关。
一个明显的缺点是,当您靠近目标时,您将无法获得旋转值来缩放扭矩,因此您可能需要增加播放器刚体上的“ angularDrag”以消除一些卡顿现象。 / p>