【Unity初心者の館】CandyRockStarの下アングルがぼやける問題を引き続き調査


YWTで一旦整理してみる

仕事をしている人はYWTという言葉を耳にした人もあるかも知れません。私は部下が多いので、プロジェクトが行き詰ったり、上手くいかない(分からない)場合は、YWTという言葉をよく口にします。

Y:やったこと(調べてみたこと)
W:わかったこと
T:次やること

部下にも言っている中で自分がしないわけにはいきません。そこで一度状況を整理してみました。

Y:やったこと(調べてみたこと)

環境設定の確認(比較)

当時エラーが出ていた環境と現在の環境、そしてネット情報で同じ事象が発生している人との違いを比べてみた。

当時の環境(うまくいっていたころ)
Windows11
Unity.2019.2.19f
UniVRM-0.90.d.0_d192

今の環境
Windows11
Unity.2022.3.31f1
UniVRM-0.1220.0.326b

同じ事象が発生している人の環境
Windows 10
Unity 2018.4.14f1
UniVRM 0.61.1

どの環境もバラバラであり、エディッタバージョンやパッケージによって違いが出るとは思えない。特に、エディッタは最新でも、2018、2019でも発生しており関連性は低そう。またOSの違いかも、Windows11、10ともに出ているため、これは消してもよさそうである。

動画を見てみた

歌い出し(現状)
※作成中のため、キャラクタは重なっています。

歌い出し

鮮明である。これは、キャラクタのInspectorのTagをFocusObjに変更したことが理由と思われる。以下、ダンス中の上からのアングルも綺麗。過去の動画でも同じ。(動画図は省略)

上からの動画
下からの動画(もざもざ)

一方でしたからのアングルを見ると、もざもざになっていることが分かる。ちなみに以前ユーチューブにアップした動画もキャプチャーしてみた。
下の図からもわかるように、あきらかにもざっていない。
(解像度を下げているので見にくいかも知れないが、実際の動画を確認するともざっていない)

当時うまくいってた時の動画

環境以外に怪しいところは無いかの調査

Inspectorを再度確認してみた。FocusObjになっていないと問題との認識であることから、キャラクタを選択して確認。特に問題はなさそう。

TagはFocusObjに設定されている

スクリプトも確認してみたーその1ー

確か、インスペクターのTagがFocusObjになっていない場合は、エラーとして、FocusPullerHelper.csの24行目がエラーを吐いていたいたことを思い出し、スクリプトを確認してみた。
以下、FocusPullerHelper.csの中身。確かに24行目に、
focusObj = GameObject.FindGameObjectWithTag("FocusObj").transform;
と記載されていることから、やはりInspectorはFocusObjが正しいと理解できるので、これが下からのアングルでもざるとは考えにくい。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.PostProcessing.Utilities;

public class FocusPullerHelper : MonoBehaviour {
	private Transform focusObj;
	private FocusPuller focusPuller;
    private Transform _target;

    private Transform target {
        get { return _target; }
        set { _target = value; }
    }

	void Awake()
	{
		focusPuller = GetComponent<FocusPuller>(); 
	}

	// Use this for initialization
	void Start () {
		//フォーカスを合わせる対象にタグ"FocusObj"をつけておくこと.
		focusObj = GameObject.FindGameObjectWithTag("FocusObj").transform;
		focusPuller.target = focusObj;
	}
	
}

スクリプトも確認してみたーその2ー

それ以外に、怪しいスクリプトは思いつかないが、キャラクタをカメラ追従している時に、もざっているのだから、何かしらカメラが追従できていなくてこのような事象が発生しているのかも知れない。
カメラ追従は、恐らくではあるが、CameraSwicher.csである。早速、中身を見ると、確かに追従するスクリプトになっている。特に問題も見当たらないが、どうもメインカメラ(Unitychan Candy Rock Star)は、Camera Targetで色んなページでは胸あたりにフォーカスさせておくよう書いてある。ただ、だとしたら、このスクリプトはtargetNameを追いかけるはず。targetNameはキャラクタ名になるから、今回の場合、"Unaha"と名前を付けている。でも、Camera TargetはUnahaの下にぶら下げているので、特に問題なさそうである。今回もUnahaを追いかけている。CameraSwicher.csを見ても、問題は見受けられない。
しかし、念のため、Unahaと関連付けされていることを確実にするために、targetNameの宣言文を変更してみた。
public string targetName = "Unaha";
しかしながら現象は変わらない。

using UnityEngine;
using System.Collections;

public class CameraSwitcher : MonoBehaviour
{
    public string targetName = "Unaha";
    public Transform[] points;
    public float interval = 2.0f;
    public float stability = 0.5f;
    public float rotationSpeed = 2.0f;
    public float minDistance = 0.5f;
    public AnimationCurve fovCurve = AnimationCurve.Linear(1, 30, 10, 30);
    public bool autoChange = true;

    Transform target;
    Vector3 followPoint;

    void Start()
    {
        // Target information.
        target = GameObject.Find(targetName).transform;
        followPoint = target.position;

        // Initialize DOF fx.
//        var dofFx = GetComponentInChildren<DepthOfFieldScatter>();
//        if (dofFx) dofFx.focalTransform = target;

        // Start auto-changer if it's enabled.
        if (autoChange) StartAutoChange();
    }

    void Update()
    {
        // Update the follow point with the exponential easing function.
        var param = Mathf.Exp(-rotationSpeed * Time.deltaTime);
        followPoint = Vector3.Lerp(target.position, followPoint, param);

        // Look at the follow point.
        transform.LookAt(followPoint);
    }

    // Change the camera position.
    public void ChangePosition(Transform destination, bool forceStable = false)
    {
        // Do nothing if disabled.
        if (!enabled) return;

        // Move to the point.
        transform.position = destination.position;

        // Snap if stable; Shake if unstable.
        if (Random.value < stability || forceStable)
            followPoint = target.position;
        else
            followPoint += Random.insideUnitSphere;

        // Update the FOV depending on the distance to the target.
        var dist = Vector3.Distance(target.position, transform.position);
        GetComponentInChildren<Camera>().fieldOfView = fovCurve.Evaluate(dist);
    }

    // Choose a point other than the current.
    Transform ChooseAnotherPoint(Transform current)
    {
        while (true)
        {
            var next = points[Random.Range(0, points.Length)];
            var dist = Vector3.Distance(next.position, target.position);
            if (next != current && dist > minDistance) return next;
        }
    }

    // Auto-changer.
    IEnumerator AutoChange()
    {
        for (var current = points[0]; true; current = ChooseAnotherPoint(current))
        {
            ChangePosition(current);
            yield return new WaitForSeconds(interval);
        }
    }

    public void StartAutoChange()
    {
        StartCoroutine("AutoChange");
    }

    public void StopAutoChange()
    {
        StopCoroutine("AutoChange");
    }
}

w:わかったこと

スクリプトや動画、環境を確認してみたが、問題は見当たらなかった。まずは環境の違いによる、もざりが発生しているとは考えにくい。環境は関係なしと見て良いと考える。
また、コンパイルエラーも発生していないことから、どこかのスクリプトが悪さをしていたとは思えない状況であることが見えてきました。
となると、Camera Targetの設定位置が悪いのか、Depth of ~の設定値がおかしいのか、その辺りもう少し調べないといけないことが見えてきました。

T:次やること

ひとまずエラーは出ていないので、以下、別の方が記載されている内容を理解することから始めようと思います。一応、この記事を記載された方のXをフォローし聞いてみましたが、返信があるかは非常に怪しいです。NOTEも作成されていますが、更新を継続されているかは不明です。

NOTE抜粋(黄色部分を理解することが重要)

まずは、ボーンを理解すること、そして以前制作した動画には、もざりがなくて、今回2つプロジェクトを作成しましたが、どちらももざってしまうのか、この辺りに絞って調査をしていく必要がありそうです。

しばらくは時間がかかりそうですが、とにもかくにもこの問題を解決することが重要になるし、自分の知識強化にもつながると思う。

今日はこの辺にします。
昨日は卓球女子WTTの個人準決勝を夜中2時~5時まで見てたので、ほぼ貫徹。さすがに明日は仕事なので、早めに寝ようと思います。早田さんと張本さんの決勝ですが、準決勝の早田さん・平野さんも全ゲーム、ほぼほぼジュースと大接戦(どちらが勝ってもおかしくなかった)。中国勢が出ていないと女子個人は(特に五輪出場者)は強いですね。今年の夏が楽しみだし、時間があっという間に過ぎてしまいました。
Unityも同じく、調べたり、作ったりするとすぐに時間が経過するのが早いですね。あっという間に、今年も終わりって言ってそうです。(笑)

この記事が気に入ったらサポートをしてみませんか?