Как заспавнить игрока в определенную точку при переходе на другую сцену(уровень)
У меня не работает скрипт. Нужно, чтобы когда игрок вышел из дома, он переходит на другую сцену именно ВОЗЛЕ ДВЕРИ, (откуда вышел тип). Но при переходе он у меня появляется в начальной точке спавна (откуда начинается игра, и это далеко от самого дома). Написал скрипт, чтобы игрок появился именно в том месте, но не помогло. Консоль показывает, что ошибок нет.
версия unity 2019.4.3
скрипт :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class exithouse : MonoBehaviour
{
public string LevelName;
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
SceneManager.LoadScene(LevelName);
transform.position = new Vector3(-18.47f,-0.074609f,-31.3068f);
}
}
}
- объект, на который закинут скрипт
- координаты игрока, стоящего на выходе из дома
Ответы (2 шт):
Игрок не перемещается, потому что вы не в тот момент меняете его позицию. Вообще, можно на второй сцене сразу игрока поставить в нужную позицию. Она должна сохраниться. Если нужно именно через код поменять позицию, то лучше сделать так:
//Создайте объект на второй сцене, в которой нужно заспаунить игрока,
// и накиньте на объект этот скрипт
public class PlayerSpawner : Monobehaviour
{
//Сюда нужно прокинуть объект игрока
[SerializeField] private GameObject _player;
// здесь ваша позиция для спауна
private readonly Vector3 _spawnPosition = new Vector3(-18.47f,-0.074609f,-31.3068f);
//этот метод автоматически вызовется, когда новая сцена загрузится
private void Awake()
{
//Меняем позицию игрока
_player.transform.position = _spawnPosition;
}
}
Вы через transform.position переносите Cylinder, а не Player. Попробуйте сделать так:
...
public class exithouse : MonoBehaviour
{
public string LevelName;
public Vector3 positionPlayer;
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
SceneManager.LoadScene(LevelName);
positionPlayer = new Vector3(-18.47f,-0.074609f,-31.3068f);
}
}
}
В новой сцене:
...
public class SetPlayerPosition : MonoBehaviour
{
public GameOdject Player;
public exithouse eh;
void Start()
{
Player.transform.position = eh.positionPlayer;
}
}
Вообще, по хорошему можно через SceneManager проверить какая сцена активна в данный момент(просто повесить на пустой объект в новой сцене):
...
public class managerscene : MonoBehaviour
{
public string LevelName;
public GameOdject Player;
void Start()
{
Scene currentScene = SceneManager.GetActiveScene();
string SceneName = currentScene.name;
if (SceneName == "Имя вашей сцены")
{
Player.transform.position = new Vector3(-18.47f,-0.074609f,-31.3068f);
}
}
}
скрипт, запускающий сцену:
...
public class exithouse : MonoBehaviour
{
public string LevelName;
private void OnTriggerEnter(Collider other)
{
if (other.tag == "Player")
{
SceneManager.LoadScene(LevelName);
}
}
}

