質問: やりたいこと バーチャルカメラが注視対象に対して常に最短距離に移動してもらいたい GIFをご覧いただくとわかりやすいのですが ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/8546e6c572ade0183b0b37652bf10a6c.gif) 黄色のパスがプレイヤー 緑のパスがカメラです プレイヤーが徐々に移動していき、黄色と緑のパスの接点に到達するのですが パスの形状が特殊なせいかカメラがひっかかり最短距離に移動してもらえません AUTODOLLYの機能は常に注視対象に対して最短距離に移動してもらえると思いましたが違うようです ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/79bc08eece123921ee185e348c2d161d.png) 解決方法はありますか? よろしくお願いいたします
回答: 念のため確認しますが、ご提示のスクリーンショットでは「Auto Dolly」の「Enabled」がオフになっているようですが、実際に動かす際にはここをオンにしているということでいいでしょうかね? 試してみましたところ、ご質問者さんのスクリーンショットをまねた下図のような経路をとらせたところ、反対側の末端にターゲットが近づいてもカメラが最近傍であるはずの反対側末端に移動しない現象が起こりました。 !図1 そこで「Auto Dolly」の「Search Radius」を0に変更したところ、下図のように反対側末端へ移動するようになりました。 !図2 マニュアルによれば、「Search Radius」は最近傍地点を探す際に「現在カメラがいるパスセグメントから、前後に何セグメントの範囲から最近傍地点を探すか」を指定するもののようです。初期値の2だと反対側末端が遠すぎて最近傍探索にひっかからなかったと思われます。 これが0の時は特別扱いとなり、パス全体から最近傍点を探してくれるようですね。 余談ですが、下図のようにカメラのパスを逆向きにしたところ... !図3 向きが逆転しただけでパスの形状は同じなのにもかかわらず、「Search Radius」が2でも反対側末端に移動しました。 最近傍点の探索には、内部的にはCinemachinePathBaseの`FindClosestPoint`が使われているようです。メソッドの序盤に... ``` float start = MinPos; float end = MaxPos; if (searchRadius >= 0) { int r = Mathf.FloorToInt(Mathf.Min(searchRadius, (end - start) / f)); start = startSegment - r; end = startSegment + r + 1; if (!Looped) { start = Mathf.Max(start, MinPos); end = Mathf.Max(end, MaxPos); } } ``` という部分がありますが、ここの`end = Mathf.Max(end, MaxPos);`という箇所にご注目いただきますと、「計算して求めた探索終端位置とパスの最大位置のうち、大きい方を探索終端位置として採用する」という動作になっていることがお分かりいただけるかと思います。 このため、たとえ「Search Radius」を2に設定していたとしても探索終端位置はパスの最大位置となってしまい、先の図のように反対側末端までカメラが移動する動きになったのでしょう。 おそらくあの部分は間違いであり、`end = Mathf.Min(end, MaxPos);`とするべきなんじゃないかと思います。