备注
由于Mathf.DeltaAngle求不出想要的两angle之间的最小夹角(我觉得很有可能是自己不熟悉该API,使用姿势不对导致),所以自己写法用
代码// author : jave.lin
// date : 2018-02-01
public const float ANGLE_90 = Math.PI / 2;
public const float ANGLE_N90 = -ANGLE_90;
private float getMinDeltaAngle( Vector2 moveOffset, Vector2 faceOffset )
{
var moveAngle = Mathf.Atan2( moveOffset.y, moveOffset.x );
var faceAngle = Mathf.Atan2( faceOffset.y, faceOffset.x );
var moveLeftOffset = new Vector2( -moveOffset.y, moveOffset.x );
var moveRightOffset = new Vector2( moveOffset.y, -moveOffset.x );
var ret = moveAngle;
if ( faceOffset.x != 0 || faceOffset.y != 0 )
{
ret = faceAngle;
if ( moveOffset.x != 0 || moveOffset.y != 0 )
{
var cross = moveOffset.x * faceOffset.y - moveOffset.y * faceOffset.x;
if ( cross < 0 )
{
var cross1 = moveRightOffset.x * faceOffset.y - moveRightOffset.y * faceOffset.x;
if ( cross1 < 0 )
{
ret = ( ANGLE_N90 + Mathf.Asin( cross1 ) );
}
else
{
ret = Mathf.Asin( cross );
}
}
else
{
var cross1 = moveLeftOffset.x * faceOffset.y - moveLeftOffset.y * faceOffset.x;
if ( cross1 > 0 )
{
ret = ( ANGLE_90 + Mathf.Asin( cross1 ) );
}
else
{
ret = Mathf.Asin( cross );
}
}
}
}
return ret;
}
// 应用
var deltaMinAngle = getMinDeltaAngle( move, face );
var deltaMinDegree = deltaMinAngle * Mathf.Rad2Deg;
应用
目前在测试项目中,应用于,根据move, face两方向,可选择动作状态要播放:向前,向左,向右,退后,的判断
参考上面的代码里头大家发现有2d向量的叉乘,大家可以考考我之前写的:已知两向量,如何求其中一个向量在另一个向量的左边、还是右边