Как сделать запаздывающую камеру?

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Как сделать запаздывающую камеру?

Сообщение NOVA 09 дек 2011, 13:32

Платформер вид сбоку (2д). Имеется скрипт залепленной за ГГ камерой. Что-то с этими векторами не могу воткнуться никак. Хочется, чтобы камера чуть запаздывала.

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

public class CameraController : MonoBehaviour {
       
        Vector3 Nova;
       
        // Use this for initialization
        void Start () {
        }
       
       
        // Update is called once per frame
        void Update () {
                Nova = GameObject.Find ("NOVA").transform.position;
        gameObject.transform.position= new Vector3(gameObject.transform.position.x,
                                                       Nova.y,
                                                       Nova.z);
               
        }
}


И как вообще выудить переменные ГГ в объект камеры, чтобы сделать лёгкие наклоны камеры при движении или отдаление?
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Как сделать запаздывающую камеру?

Сообщение AndreyMust19 09 дек 2011, 14:08

Синтаксис:
Используется csharp
Nova = GameObject.Find ("NOVA").transform.position;

Не делайте так. Ваша игра каждый кадр будет искать этот объект в сцене, а когда объектов станет много, это место начнет тормозить.
Сделайте так:

Синтаксис:
Используется csharp
        Transform Nova;
       
        void Start () {
                Nova = GameObject.Find ("NOVA").transform;
        }

        void Update () {
                transform.position= new Vector3(transform.position.x, Nova.position.y, Nova.position.z);
        }
 


Хочется, чтобы камера чуть запаздывала.

Передвигайте камеру не в позицию игрока, а на 10-20% в его сторону. Есть функция Lerp, которая возвращает вектор между двумя другими, при заданном соотношении расстояний между 2-мя векторами.

Синтаксис:
Используется csharp
        void Update () {
                float xpos = transform.position.x;
                transform.position = Vector3.Lerp(transform.position, Nova.position, 0.1*Time.deltaTime);
                transform.position.x = xpos;
        }
 

Если не нравится, меняйте 0.1, либо напишите Slerp вместо Lerp.
И раз у вас 2D, я бы попробовал использовать Vector2 при вычислениях.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Как сделать запаздывающую камеру?

Сообщение NOVA 09 дек 2011, 18:34

Что-то ни один из предложенных вариантов не работает. Может, я мысли читать не умею, но помоему много недописок в ваших скриптах. Если Nova = GameObject.Find ("NOVA").transform.position; ставить в старт, а не в update, то по понятным причинам камера стоит на месте. А с остальными скриптами вообще сплошные ошибки.
А разве без GameObject.Find и всяких векторов нельзя вытащить позицию ГГ? Например что-то типа как в Гамаке сделать переменные глобальными. Ведь потом всё-равно будет ещё куча взаимодействий с другими объектами: выстрелы врагов и т.д.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Как сделать запаздывающую камеру?

Сообщение seaman 09 дек 2011, 18:40

Читайте внимательнее. Вам никто не советовал позицию менять в старте! Вам советовали сохранить в специальной переменной трансформ ГГ. А в Update использовать эту сохраненную переменную, чтобы не искать каждый кадр.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как сделать запаздывающую камеру?

Сообщение Левш@ 09 дек 2011, 19:10

Например что-то типа как в Гамаке сделать переменные глобальными.

Синтаксис:
Используется javascript
static var nova = GameObject.Find ("NOVA").transform;

будет такой глобальной переменной.
Обращаться к ней можно отовсюду.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Как сделать запаздывающую камеру?

Сообщение NOVA 09 дек 2011, 19:16

Ничего не понял. Что за специальная переменная? Unity походу не понял тоже)) error CS0103: The name `Nova' does not exist in the current context.

static var nova = GameObject.Find ("NOVA").transform; Звучит хорошо, только редактор пунктиром показывает. Я в шарпе.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Как сделать запаздывающую камеру?

Сообщение AndreyMust19 09 дек 2011, 21:16

В целом скрипт выглядит так:

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

public class CameraController : MonoBehaviour {

Transform Nova;

void Start () {
        Nova = GameObject.Find ("NOVA").transform;
}
void Update () {
        float xpos = transform.position.x;
        transform.position = Vector3.Lerp(transform.position, Nova.position, 0.1*Time.deltaTime);
        transform.position.x = xpos;
}

}
 


static var nova = GameObject.Find ("NOVA").transform;

Я в шарпе.

Это Java. Если вы пишите на C#, то так:
Transform nova = GameObject.Find ("NOVA").transform;

Т. е. в Java вы просто объявляете переменную, а в C# нужно указать ее тип.
Только код, меняющий значения переменных (в C#, по крайней мере), нужно записывать в функциях Awake, Start, Update, LateUpdate, FixedUpdate и прочие. Писать код вне их тела - вам не разрешит.
Последний раз редактировалось AndreyMust19 09 дек 2011, 21:50, всего редактировалось 1 раз.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Как сделать запаздывающую камеру?

Сообщение Левш@ 09 дек 2011, 21:28

Я в шарпе.

Ты в танке... ;) надо смотреть на синтаксис.

в Java вы просто объявляете переменную, а в C# нужно указать ее тип.

Не совсем верно, для данного случая не только тип данных, но и статус:
Для Js это: static, private, и т.д.
Для C# не в курсе, но тоже скорее всего надо указывать помимо типа данных и глобальный статус.
_X.cor.R (Prologue)
Аватара пользователя
Левш@
Адепт
 
Сообщения: 4073
Зарегистрирован: 14 окт 2009, 16:34
Откуда: IBERIA
Skype: bars_levsha
  • Сайт

Re: Как сделать запаздывающую камеру?

Сообщение NOVA 09 дек 2011, 21:41

AndreyMust19

Ну никак не работает скрипт. И в "целом" он так выглядеть не может, хотя бы потому что там нет

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

И ещё раз повторюсь мысли читать не умею. И статус у меня юнец. И в шарпе я всего 2 недели. Зато ГГ бегает, приседает и разворачивается))
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Как сделать запаздывающую камеру?

Сообщение AndreyMust19 09 дек 2011, 21:49

Ну откуда мне знать - какие простанства имен вы подключаете и как называется у вас скрипт?
Если вы знаете, с чего начинается скрипт, могли бы сами добавить.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Как сделать запаздывающую камеру?

Сообщение NOVA 09 дек 2011, 22:10

Блин я уже по-всякому пробовал. Полдня мучаю несчастный камераконтроллер. Единственный скрипт который работает выглядит так:

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

public class CameraController : MonoBehaviour {
       
        Vector3 Nova;
       
       
         //Use this for initialization
        void Start ()
        {
        }
       
       
        //Update is called once per frame
        void Update ()
        {
                       
                Nova = GameObject.Find ("NOVA").transform.position;
               
        gameObject.transform.position = new Vector3 (gameObject.transform.position.x,
                                                      Nova.y,
                                                      Nova.z);

                       
}
}
 


Перепробовал все варианты, предложенные здесь. Выдаёт ошибки. Возвращаемся к началу. :-?
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Как сделать запаздывающую камеру?

Сообщение seaman 09 дек 2011, 22:55

Перепробовал все варианты, предложенные здесь. Выдаёт ошибки.

1. Судя по Вашим постам Вы не поняли многого из предложенных вариантов.
2. Ошибки надо читать, разбираться в них и исправлять, а не "Возвращаемся к началу." Вам не приводили полный работоспособный скрипт именно для того, чтобы Вы думали, учились и исправляли свои ошибки. Скопипастить скрипт с форума легко, но ничему не учит.
Приведу Ваш скрипт как бы я его написал:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {
       
        private Transform _nova;
       
        public void Start ()
        {
            _nova = GameObject.Find ("NOVA").transform;
        }

        public void Update ()
        {
                transform.position = new Vector3 (transform.position.x, _nova.position.y, _nova.position.z);
        }
}

Тут только то, что Вам говорили о переносе Find в Start. Сравните с тем, что делали Вы и подумайте что Вы делали неверно
Ну а насчет запаздывания - думайте сами. Вам тут много написали.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Как сделать запаздывающую камеру?

Сообщение NOVA 10 дек 2011, 09:12

Спасибо за вменяемый ответ, я так и думал. По мне так лучше вникать в работающий скрипт, чем блуждать в темноте и читать какие-то невнятные намёки а ля сам догадайся. Вряд ли новички поймут здесь половину советов. Это типа 2 класс, ребятки решаем квадратное уравнение. Подсказка ответ называется корнями. Через час проверяю - кто не в танке и летать рождённый))). Всё сажусь дальше мучать.
Последний раз редактировалось NOVA 10 дек 2011, 10:15, всего редактировалось 1 раз.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Как сделать запаздывающую камеру?

Сообщение NOVA 10 дек 2011, 09:56

Ну вот работает. ^:)^ Спасибо те добрай человек. (3A4OT) Теперь осталось додумать как сделать плавную камеру с поворотами. Только счётчики в голову и лезут.
Аватара пользователя
NOVA
Адепт
 
Сообщения: 1741
Зарегистрирован: 17 май 2011, 11:45
Откуда: Дядя Саша from Mother Russia

Re: Как сделать запаздывающую камеру?

Сообщение seaman 10 дек 2011, 12:31

Теперь осталось додумать как сделать плавную камеру

Во втором посте темы Вам написали как. Конкретный код. Должен работать.
камеру с поворотами

Если Вам нужно просто, чтобы камера смотрела на NOVA, то после смещения в Update используйте:
LookAt
Примеры кода там есть.
ЗЫ: в виду простоты вопросов переношу в "Почемучку"
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

След.

Вернуться в Почемучка

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

Сейчас этот форум просматривают: GoGo.Ru [Bot], Yandex [Bot] и гости: 17