Есть ли способы для кинематографа перенаправить игрока после его уничтожения и создания экземпляра в качестве клона? - PullRequest
1 голос
/ 28 мая 2019

Я работаю над 2D-платформером и использую cinemachine, чтобы следить за своим игроком.
Когда игрок падает с платформы ниже -20 лет, игрок уничтожается и создается как клон к точке возрождения, как и ожидалось, но камера не следует, так как первоначальный игрок уничтожен: она говорит отсутствует на Слот "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);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы можете кэшировать кинотеатр в вашем методе запуска, а затем назначить его для следования за игроком на респауне.

Ваш код станет

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();
    }
}
0 голосов
/ 28 мая 2019

Вы должны назначить новый объект, чтобы следовать следующим образом:

myCinemachine.m_Follow = spawnedPlayer;
...