親の回転を無視したい
親の回転角度を引いて相殺すればええやん?って思ったら、簡単にいかなかったのでメモ。
2018/11/24 修正変更 勘違いしてたかも!なので修正します。
やりたいこと
親(3Dゲームオブジェクト)が回転しても、子(スプライト)が回転しないようにしたい。
NaviMeshを使ってAgentとなる親オブジェクトを移動させるんだけど、その時にYが回転するんですよね。
その親オブジェクトにキャラクター画像のスプライトをくっつけてるものだから、一緒に回っちゃう。
2Dだとそれじゃアカンやーん!
オブジェクトの相関図
この子にスクリプトをアタッチする。
ちなみに、親の親 Charactersはこんな感じ。
コード
このコードを子にアタッチする。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class FixChildRotation : MonoBehaviour { Vector3 def; void Awake () { def = transform.localRotation.eulerAngles; } void Update () { Vector3 _parent = transform.parent.transform.localRotation.eulerAngles; //修正箇所 transform.localRotation = Quaternion.Euler(def - _parent); //ログ用 Vector3 result = transform.localRotation.eulerAngles; Debug.Log ("def=" + def + " _parent=" + _parent + " result=" + result); } }
実行結果
初期の親
初期の子
ログ
def=(90.0, 0.0, 0.0) _parent=(0.0, 0.0, 0.0) result=(90.0, 0.0, 0.0)
回転後の親
回転後の子
ログ
def=(90.0, 0.0, 0.0) _parent=(0.0, 86.1, 0.0) result=(90.0, 273.9, 0.0)
なんで、回転後の子の値が画像とresultで違うのかわからんけど、相殺はできているようでスプライトの向きが変わることはなかった。
360度 - 273.9度 = 86.1度
だから、逆方向に回転しているのがわかる。
考え方
いろいろ難しく考えすぎてたみたい。すごく単純だった。
初期状態から親の回転値を引けばいいだけだった。苦笑
以上。