Страница 1 из 2

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

СообщениеДобавлено: 09 дек 2011, 13:32
NOVA
Платформер вид сбоку (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);
               
        }
}


И как вообще выудить переменные ГГ в объект камеры, чтобы сделать лёгкие наклоны камеры при движении или отдаление?

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

СообщениеДобавлено: 09 дек 2011, 14:08
AndreyMust19
Синтаксис:
Используется 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 при вычислениях.

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

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

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

СообщениеДобавлено: 09 дек 2011, 18:40
seaman
Читайте внимательнее. Вам никто не советовал позицию менять в старте! Вам советовали сохранить в специальной переменной трансформ ГГ. А в Update использовать эту сохраненную переменную, чтобы не искать каждый кадр.

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

СообщениеДобавлено: 09 дек 2011, 19:10
Левш@
Например что-то типа как в Гамаке сделать переменные глобальными.

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

будет такой глобальной переменной.
Обращаться к ней можно отовсюду.

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

СообщениеДобавлено: 09 дек 2011, 19:16
NOVA
Ничего не понял. Что за специальная переменная? Unity походу не понял тоже)) error CS0103: The name `Nova' does not exist in the current context.

static var nova = GameObject.Find ("NOVA").transform; Звучит хорошо, только редактор пунктиром показывает. Я в шарпе.

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

СообщениеДобавлено: 09 дек 2011, 21:16
AndreyMust19
В целом скрипт выглядит так:

Синтаксис:
Используется 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 и прочие. Писать код вне их тела - вам не разрешит.

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

СообщениеДобавлено: 09 дек 2011, 21:28
Левш@
Я в шарпе.

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

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

Не совсем верно, для данного случая не только тип данных, но и статус:
Для Js это: static, private, и т.д.
Для C# не в курсе, но тоже скорее всего надо указывать помимо типа данных и глобальный статус.

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

СообщениеДобавлено: 09 дек 2011, 21:41
NOVA
AndreyMust19

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

using UnityEngine;
using System.Collections;

public class CameraController : MonoBehaviour {

И ещё раз повторюсь мысли читать не умею. И статус у меня юнец. И в шарпе я всего 2 недели. Зато ГГ бегает, приседает и разворачивается))

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

СообщениеДобавлено: 09 дек 2011, 21:49
AndreyMust19
Ну откуда мне знать - какие простанства имен вы подключаете и как называется у вас скрипт?
Если вы знаете, с чего начинается скрипт, могли бы сами добавить.

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

СообщениеДобавлено: 09 дек 2011, 22:10
NOVA
Блин я уже по-всякому пробовал. Полдня мучаю несчастный камераконтроллер. Единственный скрипт который работает выглядит так:

Синтаксис:
Используется 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);

                       
}
}
 


Перепробовал все варианты, предложенные здесь. Выдаёт ошибки. Возвращаемся к началу. :-?

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

СообщениеДобавлено: 09 дек 2011, 22:55
seaman
Перепробовал все варианты, предложенные здесь. Выдаёт ошибки.

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. Сравните с тем, что делали Вы и подумайте что Вы делали неверно
Ну а насчет запаздывания - думайте сами. Вам тут много написали.

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

СообщениеДобавлено: 10 дек 2011, 09:12
NOVA
Спасибо за вменяемый ответ, я так и думал. По мне так лучше вникать в работающий скрипт, чем блуждать в темноте и читать какие-то невнятные намёки а ля сам догадайся. Вряд ли новички поймут здесь половину советов. Это типа 2 класс, ребятки решаем квадратное уравнение. Подсказка ответ называется корнями. Через час проверяю - кто не в танке и летать рождённый))). Всё сажусь дальше мучать.

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

СообщениеДобавлено: 10 дек 2011, 09:56
NOVA
Ну вот работает. ^:)^ Спасибо те добрай человек. (3A4OT) Теперь осталось додумать как сделать плавную камеру с поворотами. Только счётчики в голову и лезут.

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

СообщениеДобавлено: 10 дек 2011, 12:31
seaman
Теперь осталось додумать как сделать плавную камеру

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

Если Вам нужно просто, чтобы камера смотрела на NOVA, то после смещения в Update используйте:
LookAt
Примеры кода там есть.
ЗЫ: в виду простоты вопросов переношу в "Почемучку"