Я работаю над 2D-платформером и использую синематограф, чтобы следить за своим игроком.
Когда игрок падает с платформы ниже -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);
}
}
}
Вы должны назначить новый объект следующим образом:
myCinemachine.m_Follow = spawnedPlayer;
Как работает строка выше? Приведенный выше код заставляет vcam (myCinemachine) следовать за слотом, изменяя его на «spawnPlayer»? что конкретно представляет собой объект myCinemachine и как его создать? (Я новичок в Unity и программировании)
Вы можете кэшировать синематограф внутри вашего метода запуска, а затем назначить следовать за игроком при возрождении.
Ваш код станет
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();
}
}
it says missing on the "Follow" Slot, is there any way to solve it
Да. Переназначьте его программно при респауне игрока. Когда вы уничтожаете и возрождаете игрока, это новый GameObject, который отличается от старого, поэтому Cinemachine об этом не знает.