cinemachine 是否有办法在播放器被销毁并实例化为克隆后重新定位播放器?

Is there a ways for cinemachine to retarget player after it is destroyed and instantiated as a clone?

我正在开发一款 2D 平台游戏,我正在使用 cinemachine 来跟随我的玩家。
当玩家从低于 -20 y 的平台掉落时,玩家将被销毁并按预期实例化为重生点的克隆,但摄像机不会跟随,因为原始玩家已被销毁:它说 缺失在 "Follow" 插槽上.
有什么办法解决吗?我更喜欢使用 Destroy 和 Instantiate 作为重生而不是将原始玩家传送到重生点。

这是重生脚本(GameMaster)

public class GameMaster : MonoBehaviour
{

    public static GameMaster gm;



    void Start()
    {
        if (gm == null)
        {
            gm = GameObject.FindGameObjectWithTag("GM").GetComponent<GameMaster>();
        }
    }
    public Transform playerPrefab, spawnPoint;
    public int spawnDelay = 2;

    public void RespawnPlayer() {
        //yield return new WaitForSeconds(spawnDelay);

        Instantiate(playerPrefab, spawnPoint.position, spawnPoint.rotation);
        Debug.Log("ADD SPAWN PARITCAL");
    }

    public static void Killplayer(Player player) {
        Destroy(player.gameObject);
        gm.RespawnPlayer();
    }
}

如果需要,这里是播放器脚本

public class Player : MonoBehaviour
{
    [System.Serializable]
    public class PlayerStats
    {
        public int Health = 100;

    }
    public PlayerStats playerStats = new PlayerStats();
    public int FallBoundary = -20;
    void FixedUpdate()
    {
        if (transform.position.y <= FallBoundary)
        {
            DamagePlayer(1000);
        }
    }

    public void DamagePlayer(int damage) {
        playerStats.Health -= damage;
        if (playerStats.Health<=0)
        {
            Debug.Log("Kill Player");
            GameMaster.Killplayer(this);
        }
    }
}

您必须像这样分配新对象:

myCinemachine.m_Follow = spawnedPlayer;

您可以在开始方法中缓存电影机,然后指定在重生时跟随玩家。

您的代码将变成

using Cinemachine;

public class GameMaster : MonoBehaviour
{
    public static GameMaster gm;
    public CinemachineVirtualCamera myCinemachine;


    void Start()
    {
        if (gm == null)
        {
            gm = GameObject.FindGameObjectWithTag("GM").GetComponent<GameMaster>();
        }

        myCinemachine = GetComponent<CinemachineVirtualCamera>();
    }
    public Transform playerPrefab, spawnPoint;
    public int spawnDelay = 2;

    public void RespawnPlayer() {
        //yield return new WaitForSeconds(spawnDelay);

        var newPlayer = Instantiate(playerPrefab, spawnPoint.position, spawnPoint.rotation);
        Debug.Log("ADD SPAWN PARITCAL");

        myCinemachine.m_Follow = newPlayer;
    }

    public static void Killplayer(Player player) {
        Destroy(player.gameObject);
        gm.RespawnPlayer();
    }
}