Запуск из разных точек

Общие вопросы о Unity3D

Запуск из разных точек

Сообщение mnj 15 сен 2020, 16:41

Доброго времени суток!
Подскажите, можно ли загружать одну и ту же сцену с разным положением игрока? Средство запуска - простейшее меню с кнопками для загрузки в точку 1, точку 2 и выхода из программы (сцена меню). Сцена меню ведь еще не знает о содержимом загружаемой сцены и манипулировать ее объектами не может. Или можно это как-то сделать?
mnj
UNец
 
Сообщения: 23
Зарегистрирован: 08 окт 2013, 22:38
Откуда: Питер
  • Сайт

Re: Запуск из разных точек

Сообщение 1max1 15 сен 2020, 17:01

PlayerPrefs или другие сохранки. Еще можно через static переменные или ScriptableObject.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Запуск из разных точек

Сообщение waruiyume 15 сен 2020, 17:52

В смысле как, через ScriptableObject?
upd
Ха... в принципе это очевидно, но мне, почему-то, ни разу в голову не приходило :-o
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Запуск из разных точек

Сообщение mnj 15 сен 2020, 20:26

1max1 писал(а):PlayerPrefs или другие сохранки. Еще можно через static переменные или ScriptableObject.

А можно поподробнее?
В общем, я сделал static таким образом - просто скрипт с классом в папке скриптов, в котором 1 поле:
Синтаксис:
Используется csharp
using UnityEngine;

public static class GameStartValues
{
    public static Vector3 playerPosition;
}


в сцене меню на кнопке к OnClick привязан пустой объект, к которому привязан скрипт:
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class PlayVineyard : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
    }
    public void StartPlay()
    {
        Cursor.visible = false;
        GameStartValues.playerPosition = new Vector3(249.0f, 31.255f, 177.33f);
        SceneManager.LoadScene("Episod_I");      
    }
}

И, наконец, в методе Start скрипта к объекту FPSController (взят из стандартных ассетов, иерархия не менялась: FPSContoller - родитель) указано:
Синтаксис:
Используется csharp
            this.transform.position = GameStartValues.playerPosition;
            Debug.Log("X = "+ this.transform.position.x.ToString());
            Debug.Log("Y = "+ this.transform.position.y.ToString());
            Debug.Log("Z = "+ this.transform.position.z.ToString());
            Debug.Log(this.name);

В логе координаты соответствуют нажатой кнопке, имя объекта выдается (с этими координатами) правильное - FPSController (соответствует), а контроллер (персонаж) все равно стартует на том же месте, где он находится в редакторе. Что я делаю не так?
mnj
UNец
 
Сообщения: 23
Зарегистрирован: 08 окт 2013, 22:38
Откуда: Питер
  • Сайт

Re: Запуск из разных точек

Сообщение mnj 25 сен 2020, 00:30

Откликнитесь, плз!
mnj
UNец
 
Сообщения: 23
Зарегистрирован: 08 окт 2013, 22:38
Откуда: Питер
  • Сайт

Re: Запуск из разных точек

Сообщение 1max1 26 сен 2020, 11:47

И как это? В лог выводится правильная позиция, но в игре она другая? Это невозможно, может где-то еще меняется позиция после.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Запуск из разных точек

Сообщение mnj 27 сен 2020, 00:09

1max1 писал(а):И как это? В лог выводится правильная позиция, но в игре она другая? Это невозможно, может где-то еще меняется позиция после.

Да, именно так и выводилось - в логе правильно, в игре - та же позиция, как в редакторе. Скорее всего, позиция действительно менялась где-то после, потому что вылечил, установив Auto Sync Transforms в True (меню Edit-Project Settings-Physics), но на ориентацию объекта это не действует - сохраняется такая же, что и в редакторе.
mnj
UNец
 
Сообщения: 23
Зарегистрирован: 08 окт 2013, 22:38
Откуда: Питер
  • Сайт

Re: Запуск из разных точек

Сообщение 1max1 27 сен 2020, 09:35

На персонаже чар контроллер висит? Блин... это (полная Ж) Я помню, он нифига не дружит с прямым изменением позиции. Тебе надо будет его в корутине вырубать, потом через задержку менять позицию, потом снова врубать. Я не знаю как сделать адекватно, с вращением наверное тоже самое.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Запуск из разных точек

Сообщение mnj 27 сен 2020, 11:30

1max1 писал(а):На персонаже чар контроллер висит? Блин... это (полная Ж) Я помню, он нифига не дружит с прямым изменением позиции. Тебе надо будет его в корутине вырубать, потом через задержку менять позицию, потом снова врубать. Я не знаю как сделать адекватно, с вращением наверное тоже самое.

Да, 1max1, совершенно верно - на персонаже висит character controller. По наводке смотрел бурную дискуссию по такому же поводу https://forum.unity.com/threads/charact ... st-4132723, но сработало (частично, увы) только упомянутое выше включение auto sync. Может, еще кто-нибудь подскажет адекватный способ сделать это?
mnj
UNец
 
Сообщения: 23
Зарегистрирован: 08 окт 2013, 22:38
Откуда: Питер
  • Сайт

Re: Запуск из разных точек

Сообщение samana 27 сен 2020, 16:01

А у меня не получилось увидеть такую проблему.
Воссоздал примерно вашу задачу.
Есть две сцены.
Первая просто с меню, в котором три кнопки выбора id точки спавна и одна кнопка для загрузки уровня с персонажем.
Вторая сцена с персонажем, который начинает игру с указанной точки. Там же есть кнопка возврата обратно в меню, например, чтобы выбрать другую начальную позицию.

Я так же как и вы создал статический класс, который хранит id (int) нужной точки спавна. Так удобнее, чем хранить Vector3 для позиции. Это уже пусть сам уровень, который загрузится, разбирается с этим id как хочет. Значение -1 означает, что позиция не задана (условно).
Синтаксис:
Используется csharp
public static class GameValues
{
    public static int POSITION_ID = -1;
}
 


А когда загружается уровень с персонажем, то на нём изначально есть какой нибудь скрипт, в котором уже заготовлен подходящий массив для точек спавна (Vector3). Остаётся только в старте найти ссылку на персонажа и установить ему положение и поворот такой точки. А id точки берём именно из статического класса.

Синтаксис:
Используется csharp
using UnityEngine;

public class SpawnPoints : MonoBehaviour
{
    // здесь массив точек для спавна, он заполнялся в инспекторе
    public Transform[] spawnPoints;
    void Start()
    {
        CharacterController character = FindObjectOfType<CharacterController>();

        if (GameValues.POSITION_ID != -1)
        {
            Transform randSpawn = spawnPoints[GameValues.POSITION_ID];
            character.transform.position = randSpawn.position;
            character.transform.rotation = randSpawn.rotation;
        }

        // можно удалить этот скрипт с объекта (хотя можно было и весь объект удалить, ведь он больше не нужен).
        Destroy(this);
    }
}
 


На всякий случай есть package с этой ситуацией https://dropmefiles.com/L54ay
Лучше его открыть в новом проекте, чтобы потом не чистить текущий. Так же нужно будет заполнить сцены в build settings.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 10