Unityで、targetのgameobjectから別のgameobjectへx軸方向だけの回転をコピーしたい時があると思う。
素朴な実装では、
private void RotUpdateX(ref GameObject me, GameObject target){
var r = target.transform.localRotation;
r = Quaternion.Euler(r.eulerAngles.x,0,0);
me.transform.localRotation = r;
}
と書く人が多いだろうが、これでは上手くいかなかった。
quaternion.eulerAnglesにおいてquaternionからオイラー角に変換するときに、同じ回転を表す別のオイラー角に変換されることが原因らしい。
自分の場合は、以下のようにしたら上手くいった。
private void RotUpdateX(ref GameObject me, GameObject target){
var r = target.transform.localRotation;
if (r.eulerAngles.y > 90 & r.eulerAngles.y < 270)
{
r = Quaternion.Euler(180 - r.eulerAngles.x,0,0);
}else{
r = Quaternion.Euler(r.eulerAngles.x,0,0);
}
me.transform.localRotation = r;
}