TwistRelaxer で変な動きをなんとかする


みなさん、元気にバ肉美してますか?

多分、Unityで作っている人の多くはFinalIKってアセットを買ってると思います。
その中にTwistRelaxerというモジュールがあります。

これは、自分の親と子の中間の回転を加えるものです。
手の角度によっては手首がぐいっとねじれるのが気になる人がいるでしょう。

そこで、前腕(肘と手首の間の部分)にTwistRelaxerを加えることで、
前腕も若干回転し、少し緩和することが出来ます。

ただ、TwistRelaxerでもうまく回転してなくね?ということがあります。
シーンに最初から置いている場合はOKなのに、あとからInstantiateするとダメだとか…。
(シーンに最初から置いているのにうまくいかない場合は多分仕様です 諦めてください)

これは、TwistRelaxerがStartで様々な値を計算しておくのですが、
Startのタイミング次第でちゃんとした値を計算できてないのが原因です。

そこで、Startのような実行時で計算するのではなく、
事前に計算するように修正します。

具体的に以下の部分を修正します
修正前

TwistRelaxer.cs
    private Vector3 twistAxis = Vector3.right;
    private Vector3 axis = Vector3.forward;
    private Vector3 axisRelativeToParentDefault, axisRelativeToChildDefault;
    private Transform parent;
    private Transform child;

    void Start() {
        ...
    }

修正後

TwistRelaxer.cs
    public Vector3 twistAxis = Vector3.right;
    public Vector3 axis = Vector3.forward;
    public Vector3 axisRelativeToParentDefault, axisRelativeToChildDefault;
    public Transform parent;
    public Transform child;

    [ContextMenu("Preset Value")]
    public void Preset() {
    ...
    }

privateの変数をpublicに変え、Startの関数をPresetに変えてプロパティをつけます。
その後、TwistRelaxerをアタッチしたオブジェクトで右クリックからPresetValueを選べば
これらのpublicの変数に値が設定されます。

追記

途中にも書いてますが、最初からシーンに置いているモデルはそのままです。
なぜこれが起きるかというと、TwistRelaxerはTポーズの状態でStartを呼ばれることを意図しているのに、
それ以外のポーズでStartが呼ばれてしまうので、Startより前にTポーズで固定した値を入れる、がこの記事の趣旨です。